iBeacon数据包全解析:读懂BLE广播包中的定位密码
目录
【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 | 不完整/完整服务UUID | 16位或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,
.company_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 + Flags | iBeacon, Flags | 无 | 30字节 | ✅ |
名称在扫描响应包 | iBeacon, Flags | 名称ESP32-iBeacon | 30+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 C0
Manufacturer 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博客
https://zhuanlan.zhihu.com/p/393265355
【iBeacon】iBeacon前沿初探技术备忘 - typeofGeek - 博客园
第三周工作总结——IBeacon协议分析-CSDN博客