Android和Linux(RPi)之间的蓝牙连接在首次写入操作时丢失

所以我一直在做一个项目,其中运行Android(API级别= 14)的设备必须通过蓝牙连接到运行Linux的服务器(具体来说:Raspberry Pi)。 build立连接时,应用程序将encryption的XMLstring发送到RPi。 RPi必须解密此string,parsingXML并执行相应的操作。 操作的结果将发送回Android设备。

到目前为止,我已经设法在应用程序和RPi(运行最新版本的Bluez软件包 )之间build立连接。 RPi有一个Targus的蓝牙4.0encryption狗。 当我试图从应用程序发送一个string到RPi的时候, 蓝牙sockets似乎已经closures。 Logcat给出消息Connection reset by peer

用于创build套接字的代码如下所示:

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

Logcat输出如下:

 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) 

在RPi的一面,我基本上是从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" 

我已经尝试了各种UUIDsbuild议由我读的职位包括94f39d29-7d6d-437d-973b-fba39e49d4ee94f39d29-7d6d-437d-973b-fba39e49d4ee00000003-0000-1000-8000-00805F9B34FB (两端总是相同的的连接)。 这似乎是第一个是正确的,因为我甚至不能使用其他UUID进行连接。

连接被RPi重置的原因是什么? 如果任何人能够指出我正确的方向,我将不胜感激。

事实证明,Debian上默认的Bluez配置是连接问题的原因(如本答案中所述 。禁用pnat中的pnat插件允许Android和RPi之间的通信。

 DisablePlugins = pnat 

为了将来的参考,应用程序使用的UUID是00000003-0000-1000-8000-00805F9B34FB