BLE master:连接时扫描

BLE master: scanning while connected

基本上我的问题和非常相似,只是我指的是主机而不是外围设备。

如果主机已经连接到一个或多个外围设备,它是否仍然能够扫描其他进行广告的外围设备?

我也使用 bleno 作为外设, noble 作为主控,但我认为这个问题的答案不依赖于实际模块,而是依赖于 Bluetooth Low能源规格,是吗?

是的,中央可以在与其他外围设备建立连接时进行扫描。请注意,单个外围设备在连接到中央设备时可能会停止广播。这可能会在测试时增加混乱。

这是一个使用 noble 的最小演示:

var noble = require('noble');
var connectedIDs = {};

noble.on('stateChange', (state) => {
  if (state == 'poweredOn') {
    noble.startScanning([], true);
  }
});

noble.on('discover', (peripheral) => {
  if (connectedIDs[peripheral.id] == 'known') {
    console.log(new Date() + ' ' + peripheral.id + ' discovered again');
  } else {
    console.log(new Date() + ' ' + peripheral.id + ' discovered first time')
    connectedIDs[peripheral.id] = 'known';
    // periodically connect to the same peripheral so we get the error
    // message telling us that we are already connected
    setInterval( () => {
      peripheral.connect( (err) => {
        if (err) {
          console.log(new Date() + ' ' + peripheral.id + ' ' + err);
          return;
        }
        console.log(new Date() + ' ' + peripheral.id + ' connected');
      });
    }, 1000);
  }
});

此代码示例连接到它发现的所有外围设备,并同时记录它从中接收广告数据的外围设备的 ID。

输出(t运行包含一些列和行):

10:51:06 8652... Error: Peripheral already connected
10:51:06 567b... Error: Peripheral already connected
10:51:06 f0ba... Error: Peripheral already connected
10:51:06 d095... Error: Peripheral already connected
10:51:06 3800... Error: Peripheral already connected
10:51:07 6c20... discovered first time
10:51:07 f0ba... Error: Peripheral already connected
10:51:07 d095... Error: Peripheral already connected
10:51:07 3800... Error: Peripheral already connected
10:51:07 6c20... discovered again
10:51:08 8652... Error: Peripheral already connected
10:51:08 567b... Error: Peripheral already connected
10:51:08 f0ba... Error: Peripheral already connected
10:51:08 6c20... discovered again
10:51:08 d095... Error: Peripheral already connected
10:51:08 8652... Error: Peripheral already connected
10:51:08 3800... Error: Peripheral already connected
10:51:08 6c20... discovered again
10:51:08 f0ba... Error: Peripheral already connected
10:51:08 d095... Error: Peripheral already connected
10:51:08 3800... Error: Peripheral already connected
10:51:08 6c20... connected
10:51:08 6c20... connected

发生了什么事?

第一次发现6c20...时,已经有多个外设连接到noble。重复连接尝试的错误消息显示外围设备在扫描时仍处于连接状态。在我的示例 运行 中,我连接了 6 个 BLE 外设,6c20... 是第 7 个加入聚会的人。我在 2015 年年中的 MacBookPro 上使用了 noble v1.3.0 和 node v4.2.4 OS X 10.11.3.

这没有回答第二个问题:此行为是否取决于实际模块或蓝牙低功耗规范?

据我所知,BLE 规范没有指定中央必须支持的连接数量。 AFAIK 因为 BLE 核心规范相当大,所有对同时和多个连接的引用我都可以找到它取决于实现的状态。所以,这似乎完全取决于由硬件和软件组成的BLE产品。即使 BLE 规范会指定它,我也更愿意查看产品的数据表。此外,它也取决于主机上的软件运行ning。幸运的是,贵族有。

举个例子,我们看看Nordic的Soft Device S120的datasheet:https://www.nordicsemi.com/eng/nordic/download_resource/26275/14/32008006

S120 软设备是 Nordic NRF51 系列 BLE IC(最著名的例子是 nRF51822)的 BLE 堆栈(固件)。

引用上面链接的数据表:

The SoftDevice supports eight concurrent master connections and an additional Scanner/Initiator role. When the maximum number of simultaneous connections are established, the Scanner role will be supported for new device discovery though the initiator is not available at that time.