iBeacon数据包全解析:读懂BLE广播包中的定位密码
- 其他
- 2025-09-13 20:24:02

目录
【iBeacon概述】
【iBeacon格式】
【iBeacon实例解析】
【iBeacon概述】
BLE的通信包括两个主要部分:advertising(广告)和connecting(连接),iBeacon依赖于advertising实现。
iBeacon是苹果公司于2013年推出的基于蓝牙低功耗(BLE)的微定位协议。它通过周期性广播包含唯一标识符(UUID、Major、Minor)的数据包,使智能设备(如手机)在接收信号后,结合信号强度(RSSI)估算距离,实现室内定位、场景触发等功能。其优势在于低功耗、低成本,广泛应用于零售导购、博物馆导览、仓储物流等场景,成为物联网中“近场交互”的重要技术。
【iBeacon格式】iBeacon规定了一个30个字节的广播包,且广播的标准间隔是100ms(当然可以不标准)。其中需要重点解析的是后21个字节(即从UUID开始),此前字节重在标识是否为iBeacon协议。
注意,一个广播包最多31字节(记住这句话,后面有用)
一个30字节的完整的iBeacon可做如下拆解:
AD Structure1(Advertising Data Structure)(什么是AD Structure?见下面)
长度字段(1字节):此处一般为0x02(即十进制2),表示该AD Structure后续数据的总字节数类型字段(1字节):0x01(表示广播包标志,或者说基本广播属性)数据(1字节):0x06(表示可被发现且支持BLE通用模式)AD Structure2
长度字段(1字节):此处一般为0x1A(即十进制26)表示后续数据的总字节数类型字段(1字节):固定为0xFF,表示厂商特定数据。数据(此处为公司标识符)(2字节):苹果的公司ID为0x004C(小端存储为0x4C 0x00)。iBeacon有效载荷
iBeacon类型标识符(2字节):固定为0x1502(小端存储为0x02 0x15),表示子类型为iBeacon 后续数据长度为需要重点解析的21字节Proximity UUID(16字节):设备的唯一标识符(如UUID)。Major(2字节):用于区分区域(如建筑楼层)。Minor(2字节):用于更细粒度的定位(如具体房间)。Tx Power(1字节):校准信号强度的参考值(RSSI at 1m)。补充:什么是AD Structure?
在BLE协议中,设备通过广播包(Advertising Packet)向外发送数据。一个广播包可能包含多个AD Structure(Advertising Data Structure),每个AD Structure用于描述不同的信息(例如设备名称、服务UUID、厂商数据等)。
每个AD Structure的格式固定为:
[长度(1字节)] + [类型(1字节)] + [数据(N字节)]
长度字段(1字节):表示 类型+数据 的总字节数(即类型1字节 + 数据N字节)。类型字段(1字节):定义数据的用途(例如0xFF表示厂商数据,0x09表示设备名称)。数据字段(N字节):具体内容,长度由长度字段-1决定(因为类型占1字节)。AD Structure的解析规则:
顺序无关:AD Structure的顺序不固定。长度限制:总长度不超过31字节(若为扩展广播,可更长,但iBeacon不支持)。类型唯一性:同一类型可能重复出现(例如多个厂商数据块)。在解析时,可以通过以下步骤遍历所有AD Structure:
从广播包首字节开始。读取长度字段(1字节),确定当前AD Structure的总长度(包括类型和数据)。读取类型字段(1字节),判断数据类型。根据类型,处理后续数据(长度为长度字段-1)。常见AD Structure类型对照表
类型值(Hex)类型名称数据格式说明0x01广播标志(Flags)1字节,表示设备属性(可连接性、发现模式等)。0x02~0x04不完整/完整服务UUID16位或32位UUID列表(例如0x03表示不完整的16位UUID列表)。0x08短设备名称字符串(长度≤8字节)。0x09完整设备名称字符串(完整名称)。0x0A发射功率(Tx Power)1字节有符号整数(单位dBm)。0x16服务数据(16位UUID)2字节UUID + 自定义数据。0xFF厂商自定义数据前2字节为公司标识符(小端格式),后续为自定义内容(如iBeacon数据)。在ESP-IDF中,官方示例是与下面结构体比较来判断是否为iBeacon协议的
/* For iBeacon packet format, please refer to Apple "Proximity Beacon Specification" doc */ /* Constant part of iBeacon data */ esp_ble_ibeacon_head_t ibeacon_common_head = { .flags = {0x02, 0x01, 0x06}, .length = 0x1A, .type = 0xFF, pany_id = 0x004C, .beacon_type = 0x1502 };问题:Apple的ID是0x004C,那么为什么数据为4C 00 XXXXX的时候对应着Apple的ID?
补充知识:大小端字节序
字节序是指数据在内存中的存储顺序,分为两种:
大端序:高位字节存储在低地址,低位字节存储在高地址,0x004C在大端序中存储为00 4C
小端序:高位字节存储在高地址,低位字节存储在低地址,0x004C在大端序中存储为4C 00
在BLE协议中,多字节数据(包括公司ID、Major、Minor)通常按照小端序存储
RSSI值不需要按照小端序存储,因为是单字节
UUID不需要按照小端序存储,因为
问题:刚刚提到BLE广播包总长度不超过31字节,那么iBeacon包含的数据和包含flag的AD Structure已经占了30个字节,如果要设置设备命名,是不是会超出31字节,请问这种情况怎么办?
方法广播包内容扫描响应包内容总长度可行性仅iBeacon + FlagsiBeacon, Flags无30字节✅名称在扫描响应包iBeacon, Flags名称ESP32-iBeacon30+15✅缩短名称 + 移除字段iBeacon, Flags, 短名称无可能超限❌(1) 缩短设备名称
将设备名称缩短至可容纳的长度。例如:
名称:"iBeacon"(7字符)。
AD Structure长度:7(数据) + 1(类型) + 1(长度) = 9字节。
总长度:27(iBeacon) + 3(Flags) + 9(名称) = 39字节 → 仍超出。
此方法不适用,需进一步优化。
(2) 移除非必要AD Structure
如果设备名称不是必需字段,可以仅保留iBeacon和Flags:
总长度:27 + 3 = 30字节 → 符合要求。
缺点:设备名称不可见。
(3) 使用短名称(Short Name)
类型字段:0x08(短名称),名称长度≤8字节。
示例:名称设为"iBeacon"(7字节)。
AD Structure长度:7 + 1(类型) + 1(长度) = 9字节。
总长度:27(iBeacon) + 3(Flags) + 9(短名称) = 39字节 → 仍超出。
(4) 将名称放入扫描响应包(Scan Response)
当主广播包长度不足时,可以将设备名称放在扫描响应包中:
广播包:仅包含iBeacon和Flags(总30字节)。
扫描响应包:包含设备名称(例如"ESP32-iBeacon",占15字节)。
交互流程:
设备发送广播包(iBeacon + Flags)。
扫描端(如手机)主动请求扫描响应包获取名称。
【iBeacon实例解析】假设我们有如下 Manufacturer Data:
4C 00 02 15 F2 A5 2D 43 E0 AB 48 9C B6 4C 4A 83 00 14 FF EE 11 12 33 32 C0Manufacturer ID(2字节):
4C 00,这表示制造商 ID,值为 0x004C,对应苹果公司(Apple)。iBeacon类型标识符(2字节):
固定为02 15。15表明后续的数据长度为 21 字节(16 字节 UUID,2 字节 Major,2 字节 Minor,1 字节 Signal Power)UUID(16字节):
F2 A5 2D 43 E0 AB 48 9C B6 4C 4A 83 00 14 FF EE 这是 iBeacon 的唯一标识符(UUID),用于唯一标识这个 iBeacon 设备。Major(2字节):
11 12,表示 Major 值为 4625(十进制)。Major 用于区分同一个区域或位置内的不同设备,通常用于区分不同的区域或功能。 计算过程:11 12为小端序,转换为实际值为0x1211,通过计算机十六进制转十进制Minor(2字节):
33 32,表示 Minor 值为 12851(十进制)。Minor 用于进一步细分 Major 下的不同设备或区域。Signal Power(1字节):该位为8位有符号数据
C0,表示信号强度为 -64 dBm。这个值通常用于估算设备与接收者之间的距离,较高的信号强度意味着接收设备离发射设备较近。C0转换为-64 dBm的过程:
首先,C0 是一个有符号的8位十六进制数,范围为-128到127。最高位(第7位)是符号位。如果最高位是1,则表示负数;如果是0,则表示正数。
C0 的二进制表示是 1100 0000。因为最高位是1,表示这个数是负数。
其次,负数的补码是其符号位为1,其余各位求反,末位加1
C0 的十六进制数是 1100 0000。
1100 0000 -> 反码(不取符号位):1011 1111,然后加1得到:1011 1111 + 1 = 1100 0000,即-64。
再来一个例子
问题:Signal Power 和 RSSI 的区别?
参数Signal Power(信号功率)RSSI(接收信号强度指示)定义发射端发出信号的功率强度,通常为设备在1米处的参考信号强度。接收设备实际测量到的信号强度,反映接收端信号的强弱状况。来源由发射设备(如iBeacon)在广播数据中指定。由接收设备(如ESP32、手机)通过测量机制得到。用途用于距离估算、无线通信链路预算、信号覆盖范围估算等。用于评估通信链路质量、定位应用中的距离计算等。单位分贝毫瓦(dBm)分贝毫瓦(dBm)示例iBeacon的Signal Power为-60 dBm(1米处参考值)。接收设备测量到的RSSI为-90 dBm(实际信号强度)。问题:如何利用Signal Power 和 RSSI 进行距离估算?
1. 核心原理
无线信号强度(RSSI)会随距离增加而衰减。通过已知的 Signal Power(设备在1米处的参考强度)和实测的 RSSI,结合信号传播模型,可估算设备间的距离。
2. 公式与模型
采用 对数距离路径损耗模型(Log-Distance Path Loss Model): RSSI=Signal Power−10nlog10(d)+ϵRSSI=Signal Power−10nlog10(d)+ϵ 其中:
RSSI:接收设备实际测得的信号强度(单位:dBm)。
Signal Power:发射端在1米处的参考信号强度(单位:dBm)。
nn:路径损耗指数(与环境相关,自由空间约2,复杂环境2-6)。
dd:待估算的距离(单位:米)。
ϵϵ:环境噪声(高斯随机变量)。
3. 距离估算步骤
(1) 获取参数
Signal Power:从iBeacon广播包中提取(例如 Tx Power: -60 dBm)。
RSSI:接收设备(如手机、ESP32)实时测量值(例如 -80 dBm)。
路径损耗指数 nn:
默认值:室内环境通常取 n=2.5n=2.5。
校准值:通过实际环境测量拟合(需预先标定)。
(2) 公式变形解算距离
d=10Signal Power−RSSI10nd=1010nSignal Power−RSSI
4. 注意事项
环境依赖性:公式在开放空间较准,复杂环境需校准 nn。
设备差异:不同接收设备的RSSI测量可能存在偏差(需统一硬件)。
动态干扰:人员走动、金属物体会显著影响信号,建议动态更新 nn。
参考:
蓝牙IBEACON协议详细解析-CSDN博客 zhuanlan.zhihu /p/393265355 【iBeacon】iBeacon前沿初探技术备忘 - typeofGeek - 博客园 第三周工作总结——IBeacon协议分析-CSDN博客
iBeacon数据包全解析:读懂BLE广播包中的定位密码由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“iBeacon数据包全解析:读懂BLE广播包中的定位密码”
上一篇
              健康饮食,健康早餐
 
               
               
               
               
               
               
               
               
   
   
   
   
   
   
   
   
   
   
   
  