如何用Python在树莓派读取Beacon广播包中的Service Data?
使用Bleak读取Beacon广播中的Service Data
实现步骤与代码
Bleak的扫描回调能直接获取广播包的完整数据,其中advertisement_data对象的service_data字段就是你需要的内容,无需连接设备,扫描即可读取。
完整运行代码
from bleak import BleakScanner def scan_callback(device, advertisement_data): # 检查广播包是否包含Service Data if advertisement_data.service_data: # 遍历所有Service Data条目(多数Beacon仅对应一个UUID) for service_uuid, raw_data in advertisement_data.service_data.items(): print(f"设备名称: {device.name or '未命名'} | MAC地址: {device.address}") print(f"对应Service UUID: {service_uuid}") # 输出十六进制格式的原始数据,方便对照nrf connect的结果 print(f"原始Service Data(十六进制): {raw_data.hex()}") # 根据传感器协议解析数据,示例:转ASCII字符串 # print(f"解析后数据: {raw_data.decode('ascii')}") print("------------------------") async def main(): print("开始扫描Beacon广播数据...") # 无过滤扫描所有蓝牙设备,按Ctrl+C终止 await BleakScanner.discover(callback=scan_callback, service_uuids=None) if __name__ == "__main__": import asyncio asyncio.run(main())
关键细节说明
advertisement_data.service_data是字典结构,key为Service的UUID,value是字节类型的原始传感器数据- 不要设置
service_uuids参数(设为None),避免过滤掉目标Beacon的广播 - 拿到
raw_data后,需根据你的传感器自定义协议解析(比如拆分字节转数值、解码字符串等) - 树莓派上运行时,若遇权限问题,可加
sudo执行脚本
调试技巧
如果不确定目标Beacon的Service UUID,可先打印完整广播信息,快速定位:
print(f"完整广播数据: {advertisement_data}")
对比手机nrf connect显示的内容,就能匹配到对应的Service Data字段。
内容的提问来源于stack exchange,提问作者Bobo33320
相关产品推荐
相关产品推荐

