【问题标题】:Bluetooth connection between Android and Linux (RPi) lost on first write actionAndroid 和 Linux (RPi) 之间的蓝牙连接在第一次写入操作时丢失
【发布时间】:2013-06-17 11:09:14
【问题描述】:

所以我一直在从事一个项目,其中运行 Android(API 级别 = 14)的设备必须通过蓝牙连接到运行 Linux(具体来说:Raspberry Pi)的服务器。建立连接后,应用程序会向 RPi 发送加密的 XML 字符串。 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-00805F9B34FB94f39d29-7d6d-437d-973b-fba39e49d4ee00000003-0000-1000-8000-00805F9B34FB(在连接的两端始终相同)。似乎第一个是正确的,因为使用其他 UUID 时我什至无法建立连接。

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

【问题讨论】:

  • 您能否发布解决方案作为答案,这样当人们寻找未回答的问题时,这个问题就不会出现?谢谢!

标签: android linux bluetooth raspberry-pi bluez


【解决方案1】:

事实证明,Debian 上的默认 Bluez 配置是导致连接问题的原因(如 this answer 中所述。禁用 /etc/bluetooth/main.conf 中的 pnat 插件允许 Android 和 RPi 之间的通信。

DisablePlugins = pnat

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2011-07-20
    • 2018-12-31
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多