BluePy蓝牙低能耗扫描器(Scanner)使用指南
概述
BluePy库中的Scanner类是一个强大的工具,用于扫描和发现周围的蓝牙低能耗(BLE)设备。本文将详细介绍Scanner类的功能和使用方法,帮助开发者快速掌握BLE设备扫描技术。
Scanner类基础
Scanner类是BluePy库中用于扫描BLE设备的核心组件。BLE设备通过广播广告数据(advertising data)来宣告自己的存在,Scanner类就是用来捕获这些广播数据的工具。
需要注意的是:
- 并非所有广播广告数据的设备都允许连接
- 也并非所有允许连接的设备都会广播广告数据
构造函数
创建Scanner对象非常简单:
scanner = Scanner(iface=0)
参数说明:
iface
:指定使用的蓝牙接口编号,0对应/dev/hci0,1对应/dev/hci1,以此类推
核心方法详解
设置委托对象
withDelegate(delegate)
设置一个委托对象,用于接收设备广播数据的回调通知。委托对象需要继承DefaultDelegate
类并实现相应方法。
扫描设备
scan(timeout=10)
这是一个组合方法,相当于依次调用clear()
、start()
、process()
和stop()
。参数timeout
指定扫描持续时间(秒)。
手动控制扫描流程
对于需要更精细控制的场景,可以使用以下方法:
clear()
- 清空已发现的设备列表start()
- 开始接收广播数据process(timeout=10)
- 处理广播数据,持续指定时间stop()
- 停止接收广播数据
获取设备列表
getDevices()
返回已发现设备的ScanEntry
对象列表,包含设备的详细信息。
使用示例
基本扫描示例
from bluepy.btle import Scanner, DefaultDelegate
class ScanDelegate(DefaultDelegate):
def __init__(self):
DefaultDelegate.__init__(self)
def handleDiscovery(self, dev, isNewDev, isNewData):
if isNewDev:
print(f"发现新设备: {dev.addr}")
elif isNewData:
print(f"收到来自 {dev.addr} 的新数据")
scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(10.0)
for dev in devices:
print(f"设备 {dev.addr} ({dev.addrType}), 信号强度={dev.rssi} dB")
for adtype, desc, value in dev.getScanData():
print(f" {desc} = {value}")
持续扫描示例
from bluepy.btle import Scanner, DefaultDelegate
class ScanDelegate(DefaultDelegate):
def __init__(self):
DefaultDelegate.__init__(self)
def handleDiscovery(self, dev, isNewDev, isNewData):
if isNewDev:
print(f"发现新设备: {dev.addr}")
elif isNewData:
print(f"收到来自 {dev.addr} 的新数据")
scanner = Scanner().withDelegate(ScanDelegate())
scanner.start()
try:
while True:
scanner.process()
except KeyboardInterrupt:
scanner.stop()
注意事项
- 扫描操作需要root权限
- 持续扫描会一直运行,需要手动停止
- 建议在委托类的
handleDiscovery
方法中实现具体业务逻辑 - 扫描结果中的
ScanEntry
对象包含丰富的设备信息,如MAC地址、信号强度(RSSI)等
实际应用建议
在实际开发中,Scanner类可以用于:
- 发现周围的BLE设备
- 监控特定设备的广播数据变化
- 根据信号强度实现简单的接近检测
- 分析设备的广播数据格式
通过合理使用Scanner类,开发者可以构建各种基于BLE的物联网应用,如资产追踪、室内定位、设备发现等场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考