所以我一直致力于一个项目,其中运行Android(API级别= 14)的设备必须通过蓝牙连接到运行Linux的服务器(具体来说:Raspberry Pi)。建立连接后,应用程序会将加密的XML字符串发送到RPi。 RPi必须解密此字符串,解析XML并执行相应的操作。该操作的结果将发送回Android设备。
到目前为止,我已设法在应用程序和RPi(运行最新版本的Bluez package)之间创建连接。 RPi配备了Targus的蓝牙4.0加密狗。我坚持的地方是,当我尝试从应用程序向RPi发送字符串时。那时蓝牙插座似乎已关闭。 Logcat提供消息Connection reset by peer
。
用于创建套接字的代码如下:
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"
我尝试了我在SO上阅读的帖子建议的各种UUID,包括00001101-0000-1000-8000-00805F9B34FB
,94f39d29-7d6d-437d-973b-fba39e49d4ee
和00000003-0000-1000-8000-00805F9B34FB
(在连接的两端始终相同)。似乎第一个是正确的,因为我在使用其他UUID时甚至无法建立连接。
RPi重置连接的原因是什么?如果有人能够指出我正确的方向,我将不胜感激。
答案 0 :(得分:1)
事实证明,Debian上的默认Bluez配置是导致连接问题的原因(如this answer中所述。)禁用pnat
中的/etc/bluetooth/main.conf
插件,允许Android和RPi。
DisablePlugins = pnat
为了将来参考,应用程序使用的UUID为00000003-0000-1000-8000-00805F9B34FB
。