使用MicroPython解析BLE iBeacon广播数据
解析iBeacon广播数据包(XBEE LTE/IoT + MicroPython)
一、先明确iBeacon的固定数据结构
iBeacon的广播载荷属于Manufacturer Specific Data,格式是固定的,对应你要提取的字段位置如下:
- 头部标识:
0xFF(AD Type) +0x004C(Apple厂商ID) +0x0215(iBeacon类型)- UUID:16字节(设备唯一标识)
- Major:2字节(大端格式,可用于分组/区域标记)
- Minor:2字节(大端格式,可用于单个设备标记)
- Tx Power:1字节(校准发射功率,用于距离估算)
你提到的“最大值、最小值”应该就是指Major和Minor字段,这两个是自定义的16位整数,没有固定范围,由iBeacon设备设置。
二、MicroPython解析代码示例
假设XBEE扫描返回的是原始字节数组,下面是直接可用的解析逻辑:
def parse_ibeacon(raw_data): # 先校验是否为合法iBeacon数据包 if len(raw_data) < 25 or raw_data[0] != 0xFF or raw_data[1:3] != b'\x4c\x00' or raw_data[3:5] != b'\x15\x02': return None # 提取UUID并格式化为标准的8-4-4-4-12形式 uuid_bytes = raw_data[5:21] uuid_hex = uuid_bytes.hex() formatted_uuid = f"{uuid_hex[:8]}-{uuid_hex[8:12]}-{uuid_hex[12:16]}-{uuid_hex[16:20]}-{uuid_hex[20:]}" # 提取Major/Minor(大端转整数) major = int.from_bytes(raw_data[21:23], byteorder='big') minor = int.from_bytes(raw_data[23:25], byteorder='big') # 提取Tx Power(转换为有符号整数) tx_power = raw_data[25] if raw_data[25] <= 127 else raw_data[25] - 256 return { 'uuid': formatted_uuid, 'major': major, 'minor': minor, 'tx_power': tx_power } # 测试用例:模拟XBEE返回的iBeacon数据 sample_data = b'\xff\x4c\x00\x15\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x00\x01\x00\x02\xc5' result = parse_ibeacon(sample_data) if result: print(f"UUID: {result['uuid']}") print(f"Major: {result['major']}") print(f"Minor: {result['minor']}") print(f"Tx Power: {result['tx_power']} dBm") else: print("不是合法的iBeacon数据包")
三、XBEE + MicroPython入门要点
- 先配置XBEE的扫描模式:用AT指令
AO设置为合适的操作模式,SC设置扫描信道(比如0xFFFF表示全信道扫描),具体参数查XBEE的AT指令手册 - 获取扫描数据:在MicroPython中通过
uart.read()或者xbee.receive()读取XBEE返回的广播帧,注意区分API帧和透明模式的数据格式 - 调试技巧:先打印原始数据的十六进制字符串,对照iBeacon结构逐字节核对,确保解析逻辑正确
四、参考方向
- 查看XBEE官方的MicroPython示例:重点找BLE扫描相关的代码,里面会有广播数据处理的基础框架
- 对照Apple的iBeacon规范验证字段:核心就是记住前面列的固定结构,不需要额外找外链文档
- 可以把解析逻辑封装成函数,结合XBEE的扫描循环,实现持续扫描并解析iBeacon设备
内容的提问来源于stack exchange,提问作者Winston Smith
相关产品推荐
相关产品推荐

