2013-06-20 15 views
20

Tak więc pracowałem nad projektem, w którym urządzenie z systemem Android (poziom API = 14) musi łączyć się z serwerem z systemem Linux (w szczególności: a Raspberry Pi) przez Bluetooth. Po nawiązaniu połączenia aplikacja wysyła zaszyfrowany łańcuch XML do RPi. RPi musi odszyfrować ten ciąg, przeanalizować kod XML i wykonać odpowiednią akcję. Wynik działania jest wysyłany z powrotem do urządzenia z systemem Android.Połączenie Bluetooth między Androidem a Linuxem (RPi) utracone podczas pierwszego zapisu

Do tej pory udało mi się utworzyć połączenie między aplikacją a aplikacją RPi (która obsługuje najnowszą wersję Bluez package). RPi ma klucz sprzętowy Bluetooth 4.0 od Targus. Punkt, w którym utknąłem, to próba wysłania ciągu znaków z aplikacji do RPi. Gniazdo Bluetooth wydaje się być zamknięte do tego czasu. Logcat podaje komunikat Connection reset by peer.

kod używany do tworzenia gniazdo jest następujący:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
tmp = (BluetoothSocket) m.invoke(device, 1); 

wyjście Logcat jest następujący:

06-20 14:29:42.224: DEBUG/RPiService(24273): ---------- [ CONNECTION ESTABLISHED ] ---------- 
06-20 14:29:42.224: DEBUG/RPiService(24273): connected, Socket Type:Secure 
06-20 14:29:42.229: DEBUG/RPiService(24273): create ConnectedThread: Secure 
06-20 14:29:43.734: DEBUG/RPiService(24273): setState() 2 -> 3 
06-20 14:29:43.739: DEBUG/RPiService(24273): Connection reset by peer 
06-20 14:29:43.744: WARN/System.err(24273): java.io.IOException: Connection reset by peer 
06-20 14:29:43.754: WARN/System.err(24273): at android.bluetooth.BluetoothSocket.writeNative(Native Method) 
06-20 14:29:43.759: WARN/System.err(24273): at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:398) 
06-20 14:29:43.764: WARN/System.err(24273): at android.bluetooth.BluetoothOutputStream.write(BluetoothOutputStream.java:85) 
06-20 14:29:43.769: WARN/System.err(24273): at com.example.BluetoothTest.RPiService$ConnectedThread.run(RPiService.java:344) 

Na stronie RPI, ja w zasadzie działa następujący przykład skrypt serwera z pakietu PyBluez:

from bluetooth import * 

server_sock=BluetoothSocket(RFCOMM) 
server_sock.bind(("",PORT_ANY)) 
server_sock.listen(1) 

port = server_sock.getsockname()[1] 

uuid = "00001101-0000-1000-8000-00805F9B34FB" 

advertise_service(server_sock, "SampleServer", 
    service_id = uuid, 
    service_classes = [ uuid, SERIAL_PORT_CLASS ], 
    profiles = [ SERIAL_PORT_PROFILE ] 
) 

print "Waiting for connection on RFCOMM channel %d" % port 

client_sock, client_info = server_sock.accept() 
print "Accepted connection from ", client_info 

try: 
    while True: 
     data = client_sock.recv(1024) 
     if len(data) == 0: break 
     print "received [%s]" % data 
except IOError: 
    pass 

print "disconnected" 

client_sock.close() 
server_sock.close() 
print "all done" 

Próbowałem różnych UUID sugerowanych przez posty, które czytałem na SO, w tym 00001101-0000-1000-8000-00805F9B34FB, 94f39d29-7d6d-437d-973b-fba39e49d4ee i 00000003-0000-1000-8000-00805F9B34FB (zawsze takie same na obu końcach połączenia). Wygląda na to, że pierwsza z nich jest poprawna, ponieważ nie mogę nawiązać połączenia podczas używania innego identyfikatora UUID.

Co może być przyczyną resetowania połączenia przez RPi? Gdyby ktokolwiek był w stanie wskazać mi właściwy kierunek, byłbym wdzięczny.

+0

Czy możesz wysłać rozwiązanie jako odpowiedź, więc to pytanie nie pojawi się, gdy ludzie szukają odpowiedzi bez odpowiedzi? Dzięki! – pmos

Odpowiedz

1

Okazało się, że domyślna konfiguracja Bluez na Debianie było przyczyną problemów z połączeniem (jak opisano w this answer. Wyłączenie pnat wtyczki w /etc/bluetooth/main.conf dopuszczone do komunikacji między Androida i RPI.

DisablePlugins = pnat 

Dla W przyszłości, UUID użyty przez aplikacje to 00000003-0000-1000-8000-00805F9B34FB.