【问题标题】:Unable to maintain BLE connection - BlueZ Linux <-> iOS无法保持 BLE 连接 - BlueZ Linux <-> iOS
【发布时间】:2019-03-15 19:42:18
【问题描述】:

设置:

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

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

这两个设备都在我的桌子上,测量结果约为 -40dBm RSSI,因此信号电平应该不错。

问题:

我知道几个问题,并将按优先级顺序(最高优先)列出。

a) 在 iPhone 上的nRF Connect 中,我可以看到设备并进行连接,但在 30-60 秒后出现问题导致断开连接。它从不要求我允许配对或输入 PIN。

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

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

我的尝试:

1) 我从example-gatt-server Python 代码中删除了具有安全/加密特征的TestService,所以剩下的只有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 sysfs 中的默认 conn_min_interval=24conn_max_interval=40supervision_timeout=42 值以匹配 Apple 兼容性指南。 (值已明确更改为 1224200。)重启和重启蓝牙没有任何区别。

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

5) 我运行了nRF Sniffer,但它似乎没有捕获断开连接事件。我可以通过过滤其 BD 地址来判断我的外围设备正在做广告,如下所示:

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

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

问题

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

编辑 1:

根据评论,我在连接 iPhone 时在 Linux 主机上运行了btmon。我在 iPhone 上为Heartrate 特性启用了notify。日志显示由于超时而断开连接。

< 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)                           

【问题讨论】:

  • 请在 Linux 机器上运行“btmon”而不是 nrf 嗅探器。这样你就可以看到所有的数据包,可能是它断开连接的原因,以及断开连接的人。如果 GATT 和 SMP 没有收到对先前请求的任何响应,则它都有 30 秒的超时时间。

标签: ios linux bluetooth


【解决方案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.25 毫秒为单位的,所以 12 的值实际上意味着间隔是 15 毫秒。同样监督超时单位为 10 毫秒,所以 500 表示 5000 毫秒。
【解决方案2】:

我注意到您的 btmon 日志有:

    Error: Insufficient Authentication (0x05)

根据Bluez: pairing issue with iOS。在您使用新参数修复后,大概情况仍然如此?

(顺便说一句,iOS 仅显示在 OS 设备列表中可发现或之前配对的启用 BREDR 的设备)

【讨论】:

  • 不幸的是,“NoInputNoOutput”仍然对我不起作用。在 iOS 上单击配对后,它会立即抛出 Authentication Failed (0x05)。然后它一遍又一遍地重新提示。我唯一的解决方法是使用自定义代理,通过“KeyboardDisplay”自动提交“是”(我使用的是 BLE 而不是 BREDR,顺便说一句)
猜你喜欢
  • 2015-03-08
  • 2013-04-19
  • 2020-11-07
  • 2015-04-22
  • 2016-04-18
  • 2016-02-02
  • 2019-08-31
  • 1970-01-01
  • 2016-01-30
相关资源
最近更新 更多