首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法维护BLE连接- BlueZ Linux <-> iOS

无法维护BLE连接- BlueZ Linux <-> iOS
EN

Stack Overflow用户
提问于 2019-03-15 19:42:18
回答 2查看 2.3K关注 0票数 2

设置:

我正在嵌入式BlueZ平台上运行Python5.48,example-gatt-server作为外围设备。我用hciconfig hci0 leadv 0做广告。

我正在尝试使用nRF Connect从iPhone连接(iOS v12.1.4)。

这些设备都在我的桌子上,测量的是-40 are的RSSI,所以信号电平应该是好的。

发行:

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

( a)在nRF Connect上的iPhone中,我可以看到设备并连接,但是在30-60秒之后,有东西会导致断开连接。它从不向我申请配对或输入密码的许可。

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

( c)在iPhone上,我无法在普通蓝牙Devices list...ever中看到我的外围设备。(这是一个较小的issue...although,如果可能的话,我想尝试以这种方式配对。)

我尝试过的:

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

2)为了确定断开连接的原因,我查看了Linux中的bluetooth.service日志:

代码语言:javascript
运行
复制
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=24conn_max_interval=40supervision_timeout=42值,使其与苹果兼容准则相匹配。(值显式地更改为1224200。)重新启动和重新启动蓝牙没有任何区别。

( 4)我试着在btmgmt bredr offbtmgmt bondable off之前发布hciconfig hci0 leadv 0,但没有改变。

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

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

7)使用nRF Connect连接,安卓运行良好,只要我愿意,就能保持稳定的连接。

问题

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

编辑1:

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

代码语言:javascript
运行
复制
< 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)                           
EN

回答 2

Stack Overflow用户

发布于 2019-03-18 18:55:42

我相信我的问题是通过使用符合苹果设计准则的价值观来解决的。我编辑并重新构建了内核,因此默认的蓝牙参数如下:

代码语言:javascript
运行
复制
$ 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编辑这些参数之前,我相信设置在reboot...or上丢失了,否则不会像我想的那样被应用。我还使用了稍微不同的值(conn_max_interval = 24 vs12现在)。

票数 1
EN

Stack Overflow用户

发布于 2021-02-26 00:44:14

我注意到您的btmon日志有:

代码语言:javascript
运行
复制
    Error: Insufficient Authentication (0x05)

根据Bluez: pairing issue with iOS。想必,在你修正了新的参数之后,情况仍然是这样吗?

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55189681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档