我有一个Raspberry Pi 3运行最新的Raspbian,我有从5.23升级了Bluez。至5.43。我试图连接到ble以2秒间隔广告的设备。我写了一些基于代码的在Gatttool上,试图连接到这些设备。我遇到了LE Connect请求在2秒后被取消。因此,我获得了一个le连接完整消息,状态为0x02(未知连接标识符(
从我的研究中,我从大约15个月前的档案中遇到了这一点,
https://www.spinics.net/lists/linux-bluetooth/msg65434.html
但是,在遵循线程后,我没有看到是否找到了分辨率。
我已经使用我的代码,gatttool实用程序进行了测试以及使用蓝牙我在列出的BTMON中看到了相同类型的活动下图:
HCI命令:LE SET扫描参数(0x08 | 0x000b(PLEN 7 [HCI0] 21:45:51.917070 类型:被动(0x00( 间隔:60.000毫秒(0x0060( 窗口:30.000毫秒(0x0030( 自己的地址类型:公共(0x00( 过滤策略:忽略在白色列表中(0x01(> HCI事件:命令完成(0x0E(PLEN 4 [HCI0] 21:45:51.917819 LE SET扫描参数(0x08 | 0x000b(NCMD 1 状态:成功(0x00( HCI事件:命令完成(0x0E(PLEN 4 [HCI0] 21:45:51.918357 LE SET扫描启用(0x08 | 0x000c(NCMD 1 状态:成功(0x00(> HCI活动:LE META活动(0x3E(PLEN 27 [HCI0] 21:45:52.597503 LE广告报告(0x02( NUM报告:1 事件类型:可连接的无方向 - adv_ind(0x00( 地址类型:随机(0x01( 地址:D3:67:2d:D1:46:46(静态( 数据长度:15 标志:0x06 LE通用可发现模式 BR/EDR不支持 公司:联邦快递服务(321( 数据:070A111080D28004 RSSI:-63 DBM(0xc1( HCI事件:命令完成(0x0E(PLEN 4 [HCI0] 21:45:52.599626 LE SET扫描启用(0x08 | 0x000c(NCMD 1 状态:成功(0x00( HCI事件:命令状态(0x0f(PLEN 4 [HCI0] 21:45:52.600508 le Create Connection(0x08 | 0x000d(NCMD 1 状态:成功(0x00( HCI事件:命令完成(0x0E(PLEN 4 [HCI0] 21:45:54.684146 LE创建连接取消(0x08 | 0x000e(NCMD 1 状态:成功(0x00(> HCI活动:LE META事件(0x3E(PLEN 19 [HCI0] 21:45:54.684361 LE连接完成(0x01( 状态:未知连接标识符(0x02( 处理:64 角色:主(0x00( 对等地址类型:随机(0x01( 同伴地址:D3:67:2d:D1:46:46(静态( 连接间隔:67.50毫秒(0x0036( 连接延迟:0.00毫秒(0x0000( 监督超时:420毫秒(0x002a( 主时钟精度:0x00@连接失败:D3:67:2d:D1:46:46:46(2(状态0x02
看来代码中某个地方有一个2秒的超时,也许是内核方。
要注意的一件事是,如果我使用hcitool进行连接,我可以连接大多数时间。我知道这不是L2CAP层,但是我可以看到我能够连接。
另外,如果我将BLE设备的广告间隔更改为1秒。我可以很好地连接。(2秒广告间隔的原因是节省功率(
最近有人遇到了这个问题,如果有任何解决方案?
谢谢
有相同的问题。如您所指出的那样,将广告间隔从10s减少到0.5,确实可以解决该问题。我还需要更长的间隔来节省电池。我知道,使用Raspbian的较旧版本(2016-03-18-Raspbian-Jessie内核4.1.19-V7 #858 SMP,Bluez 5.23(效果很好,但是,我还没有获得更新的构建。
更新发现这篇文章后:https://www.spinics.net/lists/linux-bluetooth/msg67800.html我更改了以下值,包括/net/net/bluetooth/hci.h:
#define HCI_LE_CONN_TIMEOUT msecs_to_jiffies(22000) /* 22 seconds WAS 2 seconds */
#define HCI_LE_AUTOCONN_TIMEOUT msecs_to_jiffies(22000) /* 22 seconds WAS 2 seconds */
重新编译,现在所有人都在我的设备上使用10.24秒的广播间隔,最新版本的Raspbian内核4.4.4.50,Bluez 5.45。希望这会有所帮助。
正如Troy E. Lanes所述,这是由于内核中定义的简短hci_le_autoconn_timeout。如果发送LE Create Connection
命令后的超时到期,则主机发送命令LE Create Connection Cancel
。
但是您可以更改超时值而无需重新编译内核。我制作了一个工具来更改le autoconnect超时https://gist.github.com/mironovdm/cb7f47e8d898e98e9a3977fc88888888888888888A9