gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:15:42 25 4
gpt4 key购买 nike

所以我一直在做一个项目,其中运行 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 重置连接的原因可能是什么?如果有人能指出我正确的方向,我将不胜感激。

最佳答案

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

DisablePlugins = pnat

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

关于android - Android 和 Linux (RPi) 之间的蓝牙连接在第一次写入操作时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17216264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com