无法维护BLE连接 - BlueZ Linux iOS

问题描述 投票:1回答:1

建立:

我在嵌入式Linux平台上运行BlueZ 5.48,Python example-gatt-server作为外围设备。我用hciconfig hci0 leadv 0启用广告。

我正在尝试使用iPhone(iOS v12.1.4)中的nRF Connect进行连接。

这些设备都放在我的桌面上,测量的RSSI约为-40dBm,因此信号电平应该很好。

发行人:

我知道几个问题,并将按优先顺序列出它们(最高的第一个)。

a)在iPhone上的nRF Connect中,我可以看到设备并连接,但是在30-60秒后,某些东西会导致断开连接。它永远不会要求我允许配对或输入PIN。

b)在Linux中,只要iPhone连接,我就会看到Bluetooth: SMP security requested but not available重复打印。

c)在iPhone上,我无法在常规蓝牙Devices列表中看到我的外围设备...... (这是一个较小的问题......虽然我想尽可能尝试以这种方式配对。)

我尝试过的:

1)我从TestService Python代码中删除了具有安全/加密特性的example-gatt-server,所以剩下的就是HeartrateBattery服务。 iPhone nRF Connect应用程序在30-60秒后仍然断开连接。

2)为了确定断开的原因,我查看了Linux中的bluetooth.service期刊:

Mar 15 18:44:57 sn0010 bluetoothd[775]: src/gatt-database.c:send_notification_to_device() GATT server sending notification
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:dev_disconnected() Device MAC_ADDR_HERE disconnected, reason 1
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:adapter_remove_connection()
Mar 15 18:44:58 sn0010 bluetoothd[775]: plugins/policy.c:disconnect_cb() reason 1
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr MAC_ADDR_HERE type 1 status 0xe
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:device_bonding_failed() status 14
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:resume_discovery()
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:att_disconnected_cb()
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:att_disconnected_cb() Connection timed out (110)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d080: device MAC_ADDR_HERE profile batt-profile state changed: connected -> disconnecting (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d080: device MAC_ADDR_HERE profile batt-profile state changed: disconnecting -> disconnected (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d638: device MAC_ADDR_HERE profile deviceinfo state changed: connected -> disconnecting (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d638: device MAC_ADDR_HERE profile deviceinfo state changed: disconnecting -> disconnected (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20ca00: device MAC_ADDR_HERE profile gap-profile state changed: connected -> disconnecting (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20ca00: device MAC_ADDR_HERE profile gap-profile state changed: disconnecting -> disconnected (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/gatt-client.c:btd_gatt_client_disconnected() Device disconnected. Cleaning up.
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:att_disconnected_cb() Automatic connection disabled
Mar 15 18:44:58 sn0010 bluetoothd[775]: attrib/gattrib.c:g_attrib_unref() 0x21e968: g_attrib_unref=0
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/gatt-database.c:att_disconnected()

这似乎表示超时发生(原因1)。

3)我更改了Linux conn_min_interval=24中的默认conn_max_interval=40supervision_timeout=42sysfs值以匹配Apple兼容性指南。 (值明确地更改为1224200。)重新启动并重新启动蓝牙并没有任何区别。

4)我尝试在btmgmt bredr off之前发布btmgmt bondable offhciconfig hci0 leadv 0,但没有变化。

5)我跑nRF Sniffer但它似乎没有捕获断开事件。我可以通过在其BD addr上过滤来告诉我的外围设备是广告,如下所示:

Sniffer

6)我完全禁用了example-gatt-servernRF Connect仍然能够连接,但在30-60秒后再次断开连接。这似乎可以隔离iOS应用程序,BlueZ堆栈或较低的Linux驱动程序层/配置中的问题。

7)使用nRF Connect for Android连接工作正常,并且只要我愿意,就可以保持稳定的连接。

有没有人建议接下来要尝试什么?

编辑1:

根据评论,我在Linux主机上运行qazxsw poi,而iPhone已连接。我在QQ上为qazxsw poi特色启用qazxsw poi。日志显示由于超时而断开连接。

btmon
ios linux bluetooth
1个回答
1
投票

我相信我的问题是通过使用符合Apple设计指南的值来解决的。我编辑并重建了内核,因此默认蓝牙参数如下:

notify

只要我愿意,这似乎在Linux和iPhone之间保持BLE连接。

注意:在尝试通过sysfs编辑这些参数之前,我认为设置在重新启动时丢失了......或者没有像我想的那样得到应用。我也使用了稍微不同的值(conn_max_interval = 24 vs 12 now)。

© www.soinside.com 2019 - 2024. All rights reserved.