You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:24:58