设置:
我正在嵌入式Linux平台上运行BlueZ 5.48,并以Python example-gatt-server
作为外围设备。我启用了hciconfig hci0 leadv 0
的广告。
我正在尝试使用nRF Connect
从iPhone(iOS v12.1.4)进行连接。
这两个设备都在我的桌上,测量的-40dBm RSSI左右,因此信号电平应该很好。
问题:
我知道几个问题,并将按照优先级顺序列出它们(从高到低)。
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
,因此剩下的都是Heartrate
和Battery
服务。 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=40
,supervision_timeout=42
,sysfs
值,以符合Apple兼容性准则。 (将值显式更改为12
,24
和200
。)使用此方法重新启动和重新启动蓝牙没有任何区别。
4)我尝试在btmgmt bredr off
之前发出btmgmt bondable off
和hciconfig hci0 leadv 0
,但没有变化。
5)我运行了nRF Sniffer
,但它似乎没有捕获断开连接事件。我可以通过对其BD addr进行过滤来判断外围设备是否在做广告,如下所示:
6)我完全禁用了example-gatt-server
。 nRF Connect
仍然可以连接,但是在30-60秒后再次断开连接。这似乎可以将问题隔离在iOS应用,BlueZ堆栈或较低的Linux驱动程序层/配置中。
7)只要愿意,在{strong> Android 上使用nRF Connect
进行连接即可正常工作并保持稳定的连接。
问题
有人对下一步的建议有什么建议吗?
编辑1:
根据评论,在连接iPhone的情况下,我已在Linux主机上运行btmon
。我在iPhone上为notify
特性启用了Heartrate
。日志显示由于超时而断开连接。
< ACL Data TX: Handle 128 flags 0x00 dlen 7 #4792 [hci0] 105.414362
ATT: Read Request (0x0a) len 2
Handle: 0x0016
> ACL Data RX: Handle 128 flags 0x02 dlen 9 #4793 [hci0] 105.466957
ATT: Error Response (0x01) len 4
Read Request (0x0a)
Handle: 0x0016
Error: Insufficient Authentication (0x05)
> HCI Event: Number of Completed Packets (0x13) plen 5 #4794 [hci0] 105.467019
Num handles: 1
Handle: 128
Count: 1
< ACL Data TX: Handle 128 flags 0x00 dlen 7 #4795 [hci0] 105.474721
ATT: Read Request (0x0a) len 2
Handle: 0x0016
< ACL Data TX: Handle 128 flags 0x00 dlen 11 #4796 [hci0] 105.564168
ATT: Handle Value Notification (0x1b) len 6
Handle: 0x000c
Data: 0e7d6400
< ACL Data TX: Handle 128 flags 0x00 dlen 9 #4797 [hci0] 106.558967
ATT: Handle Value Notification (0x1b) len 4
Handle: 0x000c
Data: 0665
> HCI Event: Number of Completed Packets (0x13) plen 5 #4798 [hci0] 106.877481
Num handles: 1
Handle: 128
Count: 3
> HCI Event: Disconnect Complete (0x05) plen 4 #4799 [hci0] 106.877698
Status: Success (0x00)
Handle: 128
Reason: Connection Timeout (0x08)
@ MGMT Event: Device Disconnected (0x000c) plen 8 {0x0001} [hci0] 106.877764
LE Address: 71:68:0B:72:0F:E9 (Resolvable)
Reason: Connection timeout (0x01)
@ MGMT Event: Device Disconnected (0x000c) plen 8 {0x0002} [hci0] 106.877764
LE Address: 71:68:0B:72:0F:E9 (Resolvable)
Reason: Connection timeout (0x01)
答案 0 :(得分:1)
我相信我的问题可以通过使用符合Apple设计准则的值来解决。我编辑并重建了内核,因此默认的蓝牙参数如下:
$ cat /sys/kernel/debug/bluetooth/hci0/conn_min_interval
12
$ cat /sys/kernel/debug/bluetooth/hci0/conn_max_interval
12
$ cat /sys/kernel/debug/bluetooth/hci0/supervision_timeout
500
只要我愿意,这似乎可以在Linux和iPhone之间维持BLE连接。
注意:在尝试通过sysfs编辑这些参数之前,我相信设置在重新启动后会丢失...否则没有像我想的那样应用。我还使用了稍有不同的值(conn_max_interval = 24 vs 12现在)。
答案 1 :(得分:1)
我注意到你的 btmon 日志有:
Error: Insufficient Authentication (0x05)
根据Bluez: pairing issue with iOS。在您修复新参数后,大概情况仍然如此?
(顺便说一句,iOS 仅显示可发现或先前在操作系统设备列表中配对的启用 BREDR 的设备)