低功耗蓝牙:被动扫描 - 但不会永远循环?

Bluetooth Low Energy : Passive Scan - but do not loop forever?

引用此 post 我已成功获得 Linux 设备(A Raspberry Pi 型号 A+)以将我的蓝牙 4.0 USB 加密狗切换到 'advertising' 状态:

sudo hciconfig hci0 leadv 3

sudo hciconfig hci0 leadv 0

我使用 Ipod 运行在 'LightBlue Explorer' 应用程序中验证了这一点。

到目前为止一切都很好。

来自另一个 Linux 盒子(另一个 Pi),它也有一个蓝牙 4.0 加密狗;我也可以看到设备,使用这个命令:

sudo hcitool lescan --passive

其中 return 是这样的:

LE Scan ...
xx:xx:xx:xx:xx:xx (unknown)
yy:yy:yy:yy:yy:yy (unknown)
xx:xx:xx;xx:xx:xx (unknown)

但是命令不断循环刷新设备列表。

所以我的主要问题是:是否有命令的变体可以是 运行,听(说)5 秒; return 它发现正在广播并退出的设备列表?

我想构建一个简单的脚本(或者 Python 理想的程序),它会定期唤醒,(被动)侦听广告流量几秒钟,然后 return源设备。

另外:我不确定为什么命令对它找到的设备显示 'unknown'。 (而 LightBlue 确实标识了名称)。

hcitool 中对此没有任何论据,但这里有一些选项

  • timeout 15s hcitool lescan 这将 运行 扫描 15 秒
  • hcitool lescan这将只报告每个设备一次

关于(unknown):我假设您的外设没有在广告中包含蓝牙名称,甚至根本没有。

--passive 告诉您的 HCI 设备不要请求 ScanResponse(可能包含名称),因此名称仍然未知,而 iOS API 会进行主动扫描并接收名称。

我知道这个问题已经有人回答了,不是最近的,但我使用 bluepy 来达到类似的目的。它带有 class Scanner 方法 scan([timeout = 10]) 和示例脚本(在在线文档中:http://ianharvey.github.io/bluepy-doc/scanner.html

代码如下:

from bluepy.btle import Scanner, DefaultDelegate

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if isNewDev:
            print "Discovered device", dev.addr
        elif isNewData:
            print "Received new data from", dev.addr

scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(10.0)

for dev in devices:
    print "Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType,     dev.rssi)
    for (adtype, desc, value) in dev.getScanData():
        print "  %s = %s" % (desc, value)

这样您就可以在给定的时间内随时扫描。 我认为这正是您所要求的,对我来说,它在 Raspberry Pi 3 应该定期(每周一次)轮询设备的情况下非常有效。

我 运行 在 Raspberry Pi 上遇到同样的问题 运行 3. 但是,如果我 运行 命令不止一次出现错误

Set scan parameters failed: Input/output error

为了避免这个错误,我必须像这样向 hcitool 发送 INT 信号:

timeout -s INT 10s hcitool lescan