主页 > 其他  > 

iBeacon数据包全解析:读懂BLE广播包中的定位密码

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不完整/完整服务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 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−10nlog⁡10(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广播包中的定位密码