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

时间:2015-12-09 21:58:00

标签: linux hci bluetooth-lowenergy

引用此post我已成功设法获得一个Linux设备(一个Raspberry Pi型号A +),将我的蓝牙4.0 USB加密狗切换为广告'状态:

sudo hciconfig hci0 leadv 3

sudo hciconfig hci0 leadv 0

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

到目前为止一切都很好。

另一个也有蓝牙4.0加密狗的Linux机箱(另一个Pi);我也可以使用以下命令查看设备:

sudo hcitool lescan --passive

返回的内容如下:

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

hcitool中没有任何参数,但是这里有一些选项

  • timeout 15s hcitool lescan这将运行扫描15秒
  • hcitool lescan --duplicates这将仅报告每个设备

关于(unknown):我认为您的外设不会在广告中包含蓝牙名称,甚至根本不包含蓝牙名称。

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

答案 1 :(得分:3)

我遇到了在Raspberry Pi 3上运行的同样问题。但是,如果我多次运行该命令,我会收到错误

Set scan parameters failed: Input/output error

为了避免这个错误,我不得不像这样发送hcitool INT信号:

timeout -s INT 10s hcitool lescan

答案 2 :(得分:2)

我知道这个问题已经回答了,而不是最近的问题,但是我将bluepy用于类似目的。它带有一个类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定期(每周一次)对设备进行轮询的情况下,它的效果很好。