0

参考这篇文章,我成功地获得了一个 Linux 设备(A Raspberry Pi Model 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 确实识别了名称)。

4

3 回答 3

5

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

Set scan parameters failed: Input/output error

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

timeout -s INT 10s hcitool lescan
于 2017-05-24T23:08:01.897 回答
5

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

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

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

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

于 2016-01-20T01:52:01.307 回答
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 应定期(每周一次)轮询设备的情况下效果很好。

于 2016-09-29T14:27:41.387 回答