我遇到一个问题,即一台机器上的BLE主动扫描会导致另一台机器出现连接问题。如果有人能解释原因,我会更聪明,并就如何修复提出任何建议。
我已将我的代码所做的粗略版本分解为简单的脚本。
机器1上的:
sudo stdbuf -oL hcidump -X |tee hci.log &
sudo hcitool lewlclr
sudo hcitool lewladd 68:C9:0B:xx:xx:01
sudo hcitool lewladd 68:C9:0B:xx:xx:02
sudo hcitool lewladd 68:C9:0B:xx:xx:03
sudo hcitool lewladd 68:C9:0B:xx:xx:04
sudo hcitool lewladd 68:C9:0B:xx:xx:05
sudo hcitool lewladd 68:C9:0B:xx:xx:06
while true; do sudo hcitool lecc --whitelist; if [ $? == 1 ] ; then sleep 20; else sleep 1; sudo hcitool ledc 64 ; fi; done
以上操作没有问题
然而,在另一台机器上运行以下操作后,我遇到了连接问题。
sudo hcitool lescan --duplicates
从hci日志中看到正常的连接:
< HCI Command: LE Create Connection (0x08|0x000d) plen 25
bdaddr 00:00:00:00:00:00 type 0
interval 4 window 4 initiator_filter 1
own_bdaddr_type 0 min_interval 15 max_interval 15
latency 0 supervision_to 3200 min_ce 1 max_ce 1
> HCI Event: Command Status (0x0f) plen 4
LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: LE Meta Event (0x3e) plen 19
LE Connection Complete
status 0x00 handle 64, role master
bdaddr 68:C9:0B:xx:xx:xx (Public)
< HCI Command: Disconnect (0x01|0x0006) plen 3
handle 64 reason 0x13
Reason: Remote User Terminated Connection
> HCI Event: Command Status (0x0f) plen 4
Disconnect (0x01|0x0006) status 0x00 ncmd 1
> HCI Event: Disconn Complete (0x05) plen 4
status 0x00 handle 64 reason 0x16
Reason: Connection Terminated by Local Host
并且连接错误如下:
< HCI Command: LE Create Connection (0x08|0x000d) plen 25
bdaddr 00:00:00:00:00:00 type 0
interval 4 window 4 initiator_filter 1
own_bdaddr_type 0 min_interval 15 max_interval 15
latency 0 supervision_to 3200 min_ce 1 max_ce 1
> HCI Event: Command Status (0x0f) plen 4
LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: LE Meta Event (0x3e) plen 19
LE Connection Complete
status 0x00 handle 64, role master
bdaddr 68:C9:0B:xx:xx:xx (Public)
> HCI Event: Disconn Complete (0x05) plen 4
status 0x00 handle 64 reason 0x3e
Reason: Connection Failed to be Established
< HCI Command: Disconnect (0x01|0x0006) plen 3
handle 64 reason 0x13
Reason: Remote User Terminated Connection
> HCI Event: Command Status (0x0f) plen 4
Disconnect (0x01|0x0006) status 0x12 ncmd 1
Error: Invalid HCI Command Parameters
注意:最后两个条目(无效的HCI命令参数)是由于脚本的粗糙,并且仅由于连接失败而发生。
值得注意的是,它看起来像是连接,然后它说不能(连接无法建立连接)。这对我来说似乎有点混乱。
我在不同的机器上试过这个。 (台式PC和RPi3)
答案 0 :(得分:2)
关于连接创建与连接建立的混淆请参阅第6卷,B部分,第4.5节,低能耗规范(核心4.2)。所以在第二种情况下,远程设备似乎没有发送任何信息 CONNECT_REQ PDU后的数据通道包。在第二种情况下,如果在未建立的链路上尝试断开连接,控制器将抱怨无效句柄(因为不存在有效连接)。要进一步调试,您可以在hcidump中启用Timing,这将确认主机在监控超时后收到失败的建立事件。
&#34;当发起者发送时,链路层进入连接状态 CONNECT_REQ PDU广告商或广告商收到一个 来自启动器的CONNECT_REQ PDU。 进入连接状态后,连接被认为是 创建。此时不认为建立连接。仅认为一旦数据信道分组建立连接 已收到对等设备。创建的A连接与建立的连接之间的唯一区别是使用的链路层连接监督超时值&#34;
&#34;如果链路层连接监督定时器在建立连接之前达到6 * connInterval(参见第4.5节),则认为连接丢失。这样可以快速终止无法建立&#34;
的连接答案 1 :(得分:2)
周边是广告。这意味着它会在某个广告频道上定期发送一个广告(ADV_IND)数据包。响应此数据包,中心可以(Core_v4.2, 6.B.4.4.2.3):
在这里,您有两个中心试图同时到达同一个外围设备。一个是主动扫描(上面#2),另一个是启动(上面#3)。不幸的是,两者都必须在同一时间发送数据包,接收器被卡住,扫描请求和连接请求数据包都会丢失。
没有确认连接请求。发起者必须假定广告客户已收到并接受连接请求,推测性地创建连接,并可能在之后超时。这就是 bare_metal 指向的快速终止功能存在的原因。如果外围设备没有接受连接请求,则中心不应该永远等待。
转储中的LE连接完成事件只是告诉已发送的连接请求数据包,它不会告诉它实际上已被目标接收,处理或接受。