Buduję prosty serwer Java Bluetooth dla mojego komputera za pomocą interfejsu API Bluecove. Buduję również aplikację dla klienta Android, ale problem wydaje się wynikać z aplikacji po stronie serwera.Utrzymywanie połączenia Java Bluetooth
Jestem pewien, że ktoś opublikował już gdzieś jakąś odpowiedź, a ja od kilku dni starannie testowałem różne rozwiązania i patrzyłem na każde możliwe forum, ale nie mogę utrzymać połączenia w wątku gniazda przy życiu.
Mogę wymieniać wiadomości po nawiązaniu połączenia z androida na komputer i odwrotnie z komputera na androida, ale natychmiast po wymianie bajtów, stos Bluecove wyłącza się i zamyka połączenie z gniazdem, nawet gdy nie jawnie powiedz to do connection.close().
Próbowałem użyć krótkiego czasu (niektóre stwierdzenie jest prawdą), aby utrzymać połączenie przy życiu i nie wyłącza już gniazda po otrzymaniu pierwszej wiadomości, ale nie może odbierać żadnych kolejnych wiadomości wysyłanych przeze mnie smartfona do mojego komputera. Choć zasadniczo jest żywy, nie może odbierać żadnych nowych wiadomości, gdy próbuję wysłać je ze smartfonu. Nie pewny dlaczego.
Przykro mi, to jest moja pierwsza publikacja i nie jestem pewien, dlaczego pierwsza część kodu nie wyświetla się poprawnie na stronie.
Kod dokonywania gra:
public BluetoothServer()
{
try
{
service = (StreamConnectionNotifier)
Connector.open("btspp://localhost:" + new UUID(0x1101).toString() +
";name=SampleServer");
System.out.println("open connection");
while(runState == true){
connection = (StreamConnection) service.acceptAndOpen();
//send a greeting across to android
outputStream = connection.openOutputStream();
String greeting = "JSR-82 RFCOMM server says hello";
outputStream.write(greeting.getBytes());
//run thread that listens for incoming bytes through socket connection
Thread t = new Thread(new ConnectedThread(connection));
t.start();
}
} catch(IOException e) {}
}
GWINT KOD do słuchania Napływające dane
public void run()
{
try
{
//open input stream to listen to data
inputStream = connection.openInputStream();
byte buffer[] = new byte[1024];
int bytes_read = inputStream.read(buffer);
String received = new String(buffer, 0, bytes_read);
System.out.println("received: " + received);
}
catch(IOException e){}
}
Nie można wysłać więcej niż jednej wiadomości od klienta do serwera, ale czy można wysyłać wiele wiadomości z serwera do klienta? Która pętla wywołuje twoją metodę run()? Czy możesz podać ten kod, wywołując funkcję run()? –
W przeszłości mam bardzo podobny problem. Ale w moim przypadku połączenie nie zostało zamknięte, tylko prędkość IO zwalniała (po stronie Androida). Po debugowaniu odkryliśmy, że po pewnym okresie bezczynności zdarza się on po stronie Androida po określonym czasie oczekiwania (Android przełącza tryb bezpiecznego zasilania) i tego limitu czasu nie można zmienić. Aby utrzymać połączenie przy życiu, po prostu wysyłaliśmy okresowo pusty pakiet (jeden bajt). Mam nadzieję, że to pomoże. – Eugene
Nie używaj tylko pustych bloków try/catch. Zaloguj wyjątek, gdy zostanie rzucony, pomoże ci uzyskać prawdziwy powód. W przeciwnym razie zgadujesz. – Don