Bluetooth Verbindungsprobleme mit IntentService

8

Ich muss einige Daten von meiner Android App über Bluetooth (zu Arduino) übertragen. Ich lese / empfange nichts von Arduino zurück. Für meine Single-Thread-Bedürfnisse ging ich mit einem IntentService. Nach dem Pairing funktioniert mein Code zum ersten Mal, wenn ich Daten anschließe und sende. Ich trenne nach dem Senden von Daten ohne Fehler. Aber wenn ich versuche, die Verbindung zum zweiten Mal herzustellen, erhalte ich den folgenden Fehler, wenn ich myBluetoothSocket.connect ():

ausprobiere
  

Lesen fehlgeschlagen, Socket möglicherweise geschlossen oder Timeout, lesen ret: -1

Einzige Lösung ist, das Arduino-Gerät auszuschalten und die Verbindung wiederherzustellen (es hilft nicht, wenn ich zwinge, die App zu beenden und eine erneute Verbindung herzustellen).

Beachten Sie, dass alles gut funktioniert, wenn ich zwei Threads spawne (je einen zum Lesen und Schreiben), unabhängig davon, wie oft ich Daten anschließe und sende (was beweist, dass auf der Arduino-Seite nichts falsch ist, eine alte Verbindung "zurückhält") ).

Hier ist mein Android-Code:

%Vor%

Ich habe auf Nexus 5 und Samsung S5-Geräten (mit 5.1 bzw. 5.0) getestet.

    
SlowAndSteady 16.05.2015, 01:02
quelle

3 Antworten

0

Ich bin nicht sicher, warum es funktioniert, aber dieser Ansatz hat schließlich funktioniert:

%Vor%     
SlowAndSteady 08.07.2015, 08:02
quelle
2

Wenn Sie das zweite Mal versuchen, eine Verbindung herzustellen, müssen Sie den entsprechenden Socket erneut erstellen.

Sie müssen auch bedenken, dass Arduino eine langsame Plattform ist. Es kann einige beträchtliche Verzögerungen zwischen dem Schließen der Verbindung und dem erneuten Öffnen geben.

    
Pat 26.05.2015 14:29
quelle
-1

Die Methode onDestroy() wird nur aufgerufen, wenn der Garbage Collector ausgeführt wird. Sie müssen cleanup() von onHandleIntent(Intent) aufrufen, wie Sie es zuvor getan haben, sonst bleibt der Socket unbegrenzt offen. Da Sie es offen gelassen haben, können Sie keine Verbindung mehr herstellen.

Der Bluetooth-Stack von Android scheint unabhängig vom Anwendungslebenszyklus zu sein: Der Socket bleibt offen, selbst wenn Sie die Anwendung zwingen, die Anwendung zu beenden. In Ihrem aktuellen Szenario, um den Socket zu schließen, deaktivieren Sie Bluetooth in den Einstellungen.

    
digitalbrainstorm 27.05.2015 03:50
quelle

Tags und Links