1

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

注意:最后两个条目(Invalid HCI Command Parameters)是由于脚本的粗糙,并且仅由于连接失败而发生。

值得注意的是,看起来连接已经建立,然后它说不能(无法建立连接)。这对我来说似乎有点令人困惑。

我在不同的机器上试过这个。(台式电脑和 RPi3)

4

2 回答 2

3

外围是广告。这意味着它会定期在某个广告频道上发送一个广告(ADV_IND)数据包。作为对该数据包的响应,中心可以(Core_v4.2, 6.B.4.4.2.3):

  1. 没做什么,
  2. 发送扫描请求 (SCAN_REQ) 数据包(图 4.3),外围设备应以扫描响应 (SCAN_RSP) 响应,
  3. 发送连接请求 (CONN_REQ) 数据包(图 4.5)。

在这里,您有两个中心试图同时到达同一个外围设备。一个正在执行主动扫描(上面的#2),另一个正在启动(上面的#3)。不幸的是,两者都必须同时发送它们的数据包,接收器被阻塞,扫描请求和连接请求数据包都丢失了。

没有对连接请求的确认。发起者必须假设广告商接收并接受了连接请求,推测性地创建连接,并且之后可能超时。这就是bare_metal 所指向的快速终止特性存在的原因。如果外设不接受连接请求,中央不应该永远等待。

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

于 2016-05-07T22:08:14.330 回答
2

关于创建的连接与已建立的连接的混淆,请参阅第 6 卷 B 部分的第 4.5 节,来自低能量规范(核心 4.2)。所以在第二种情况下,远程设备似乎在 CONNECT_REQ PDU 之后没有发送任何数据通道数据包。在第二种情况下,如果在未建立的链接上尝试断开连接,控制器将抱怨无效句柄(因为不存在有效连接)。要进一步调试,您可以在 hcidump 中启用计时,这将确认主机在监督超时后收到失败的建立事件。

“当发起方向广告方发送 CONNECT_REQ PDU 或广告方从发起方接收到 CONNECT_REQ PDU 时,链路层进入连接状态。进入连接状态后,认为连接已创建。连接不被认为是此时已建立。只有从对等设备接收到数据通道数据包后,才认为已建立连接。创建的连接和已建立的连接之间的唯一区别是链路层连接监督超时值,即用来”

“如果链路层连接监督计时器在连接建立之前达到 6 * connInterval(参见第 4.5 节),则应认为连接丢失。这样可以快速终止无法建立的连接”

于 2016-04-22T08:37:23.463 回答