蓝牙LE主动扫描会导致其他计算机出现连接问题

时间:2016-04-18 16:33:06

标签: bluetooth bluez bluetooth-lowenergy hci

我遇到一个问题,即一台机器上的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)

2 个答案:

答案 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):

  1. 什么都不做,
  2. 发送扫描请求(SCAN_REQ)数据包(图4.3),外设应响应扫描响应(SCAN_RSP),
  3. 发送连接请求(CONN_REQ)数据包(图4.5)。
  4. 在这里,您有两个中心试图同时到达同一个外围设备。一个是主动扫描(上面#2),另一个是启动(上面#3)。不幸的是,两者都必须在同一时间发送数据包,接收器被卡住,扫描请求和连接请求数据包都会丢失。

    没有确认连接请求。发起者必须假定广告客户已收到并接受连接请求,推测性地创建连接,并可能在之后超时。这就是 bare_metal 指向的快速终止功能存在的原因。如果外围设备没有接受连接请求,则中心不应该永远等待。

    转储中的

    LE连接完成事件只是告诉已发送的连接请求数据包,它不会告诉它实际上已被目标接收,处理或接受。