La conexión Bluetooth entre Android y Linux (RPi) se perdió en la primera acción de escritura

Así que he estado trabajando en un proyecto en el que un dispositivo con Android (nivel de API = 14) debe conectarse a un servidor con Linux (para ser específico: una Raspberry Pi) a través de Bluetooth. Cuando se establece una conexión, la aplicación envía una cadena XML cifrada al RPi. El RPi debe descifrar esta cadena, analizar el XML y realizar la acción correspondiente. El resultado de la acción es enviar de vuelta al dispositivo Android.

Hasta ahora, he logrado crear una conexión entre la aplicación y el RPi (que ejecuta la última versión delPaquete bluez). El RPi tiene un dongle Bluetooth 4.0 de Targus. El punto en el que estoy atascado es cuando intento enviar una cadena desde la aplicación al RPi. La toma de Bluetooth parece estar cerrada para entonces. Logcat da el mensajeConnection reset by peer.

El código utilizado para crear el socket es el siguiente:

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

La salida Logcat es la siguiente:

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)

En el lado del RPi, básicamente estoy ejecutando el siguiente script de servidor de ejemplo desde elPyBluez paquete:

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"

He probado varios UUID sugeridos por publicaciones que leí en SO incluyendo00001101-0000-1000-8000-00805F9B34FB, 94f39d29-7d6d-437d-973b-fba39e49d4ee y00000003-0000-1000-8000-00805F9B34FB (Siempre lo mismo en ambos extremos de la conexión). Parece ser que el primero es correcto, ya que ni siquiera puedo hacer una conexión cuando uso otro UUID.

¿Cuál puede ser la causa de que la conexión sea restablecida por el RPi? Si alguien pudiera apuntarme en la dirección correcta, estaría agradecido.

Respuestas a la pregunta(1)

Su respuesta a la pregunta