【问题标题】:Bluetooth Low Energy : Passive Scan - but do not loop forever?低功耗蓝牙:被动扫描 - 但不会永远循环?
【发布时间】:2016-03-15 08:57:35
【问题描述】:

参考此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 确实识别了名称)。

【问题讨论】:

  • 不确定它是否适合您的需求,但一种可能性是使用超时扫描。见this post
  • 谢谢 - 试试看,感谢帖子的链接 - 还有其他有用的东西

标签: linux hci bluetooth-lowenergy


【解决方案1】:

在 hcitool 中没有对此的参数,但是这里有一些选项

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

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

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

【讨论】:

  • hcitool lescan --duplicates 正好相反。要只报告一次,请移除 --duplicates 标志。
【解决方案2】:

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

Set scan parameters failed: Input/output error

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

timeout -s INT 10s hcitool lescan

【讨论】:

    【解决方案3】:

    我知道这个问题已经得到解答,而且不是最近的,但我出于类似目的使用了 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 应定期(每周一次)轮询设备的情况下效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2014-09-29
      • 2013-11-26
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多