低功耗蓝牙:被动扫描 - 但不会永远循环?
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
引用此 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