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

目录

【iBeacon概述】

【前置知识:BLE广播包格式】

【iBeacon格式】

【iBeacon实例解析】


【iBeacon概述】

        BLE的通信包括两个主要部分:advertising(广告)和connecting(连接),iBeacon依赖于advertising实现。

        iBeacon是苹果公司于2013年推出的基于蓝牙低功耗(BLE)的微定位协议。它通过周期性广播包含唯一标识符(UUID、Major、Minor)的数据包,使智能设备(如手机)在接收信号后,结合信号强度(RSSI)估算距离,实现室内定位、场景触发等功能。其优势在于低功耗、低成本,广泛应用于零售导购、博物馆导览、仓储物流等场景,成为物联网中“近场交互”的重要技术。

【前置知识:BLE广播包格式】

【广播包格式】
        
蓝牙广播包的最大长度是37个字节,其中设备地址占用了6个字节,只有31个字节是可用的。这31个可用的字节又按照一定的格式来组织,被分割为n个AD Structure。如下图所示:

        如上图所示,每个AD Structure包含又包含三部分,分别是:
        Length(1字节),AD Type(1字节),AD Data(n字节),Length=AD Type长度+AD Data长度

        完整的Type类型表:见Assigned Numbers | Bluetooth® Technology Website的2.3章节

        特别注意: 这些字段中,除了格式定义字段0x01 是必须存在,且需要放在广播内容中,其他字段都是可选的,并且位置并不重要,放在 广播内容 或 扫描回复内容 中都可以,效果基本相同。ADType 0x01 是格式定义字段(Flags),用于指示设备是否可以被搜到、是否支持传统蓝牙,是否支持可被连接等。其含义如下:

               

【广播包示例】

0x05,0x09,0x31,0x32,0x33,0x34,0x02,0x0A,0x08,0x06,0xFF,0x41,0x50,0x50,0x4C,0x45

        首先把他分割成一个个AD Structure,分割后如下图所示:

0x05,0x09,0x31,0x32,0x33,0x34
0x02,0x0A,0x08
0x06,0xFF,0x41,0x50,0x50,0x4C,0x45

        第一个AD Structure的长度为 0x05,类型为 0x09(完成的设备名称),那么该AD Structure 余下数据含义是完整的设备名称,0x31,0x32,0x33,0x34 按照UTF-8编码,hex转ASCII后就是1234。

        第二个AD Structure的长度为 0x02,类型为 0x0A(发射功率), 0x08 表示的就是发射功率。

        第三个AD Structure 的长度为 0x06,类型为 0xFF(厂商自定义数据),0x41,0x50,0x50,0x4C,0x45 , 就是厂商自定义的内容。

【扫描请求和扫描响应】

        蓝牙设备除了可以通过上述方式,主动的发射广播数据外,还可以接受其他设备的扫描请求,从而响应额外的数据,二者的区别如下:

        广播是蓝牙从机设备主动发出的数据。

        扫描响应是当蓝牙主机收到从机的广播数据后,如果想要进一步了解该从机设备的信息,可以向从机设备发送扫描请求从机收到扫描请求后,对应的主机回复扫描响应

                         

        扫描响应的数据格式和蓝牙广播的数据格式完全一样,其作用也基本一样,那为什么还要设置这么一个扫描响应数据呢?

        因为蓝牙的广播数据最多是31个字节,如果广播数据太多,这31个字节装不下时,我们就可以将一部分不太重要的数据放到扫描响应数据里面,来分担广播数据的工作。

 【广播类型】

        广播类型是GAP层决定的,对于开发者来说可通过调用广播参数设置相关的API进行设置

广播类型广播内容是否可被连接是否支持扫描响应用途
可连接非定向正常广播包支持最常用的广播方式
可连接定向定向广播包指定设备可连接不支持用于快速连接
不可连接非定向正常广播包不支持用于信标、传感器
可扫描非定向定向广播包支持可扫描不可连接非定向

        蓝牙广播与扫描响应数据详解,-优快云博客
        蓝牙广播协议说明-优快云博客
        蓝牙广播和蓝牙广播数据的组织格式是什么样的?
        【低功耗蓝牙】广播数据分析 - 哔哩哔哩

【iBeacon格式】

        iBeacon规定了一个30个字节的广播包,且广播的标准间隔是100ms(当然可以不标准)。其中需要重点解析的是后21个字节(即从UUID开始),此前字节重在标识是否为iBeacon协议。

        注意,一个广播包最多31字节(不足31的字节自动补0)(记住这句话,后面有用)

一个30字节的完整的iBeacon可做如下拆解:

  1. AD Structure1(Advertising Data Structure)(什么是AD Structure?见下面)

    1. 长度字段(1字节):此处一般为0x02(即十进制2),表示该AD Structure后续数据的总字节数
    2. 类型字段(1字节)0x01(表示广播包标志,或者说基本广播属性)
    3. 数据(1字节)0x06(表示可被发现且支持BLE通用模式)
  2. AD Structure2

    • 长度字段(1字节):此处一般为0x1A(即十进制26)表示后续数据的总字节数
    • 类型字段(1字节):固定为0xFF,表示厂商特定数据。
    • 数据(此处为公司标识符)(2字节):苹果的公司ID为0x004C(小端存储为0x4C 0x00)。
  3. 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数据)。

        具体见Assigned Numbers Document的2.3Common Data Types章节

        在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

关键点:内存地址增长方向默认是从左到右递增

内存地址增长方向 → 
+---------+---------+
| 0x00    | 0x4C    |   ← 大端序:高位在前(低地址),低位在后(高地址)
+---------+---------+
地址:0x1000   0x1001

小端序:高位字节存储在高地址,低位字节存储在低地址,0x004C在大端序中存储为4C 00

在BLE协议中,多字节数据(包括公司ID、Major、Minor)通常按照小端序存储

RSSI值不需要按照小端序存储,因为是单字节

UUID不需要按照小端序存储,原因如下:

                                   

问题:刚刚提到BLE广播包总长度不超过31字节,那么iBeacon包含的数据和包含flag的AD Structure已经占了30个字节,如果要设置设备命名,是不是会超出31字节,请问这种情况怎么办?

方法广播包内容扫描响应包内容总长度可行性
仅iBeacon + FlagsiBeacon, Flags30字节
名称在扫描响应包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字节)。

  • 交互流程

    1. 设备发送广播包(iBeacon + Flags)。

    2. 扫描端(如手机)主动请求扫描响应包获取名称。

【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
  1. Manufacturer ID(2字节):

    4C 00,这表示制造商 ID,值为 0x004C,对应苹果公司(Apple)。
  2. iBeacon类型标识符(2字节):

    固定为02 15。15表明后续的数据长度为 21 字节(16 字节 UUID,2 字节 Major,2 字节 Minor,1 字节 Signal Power)
  3. UUID(16字节):

    F2 A5 2D 43 E0 AB 48 9C B6 4C 4A 83 00 14 FF EE
    这是 iBeacon 的唯一标识符(UUID),用于唯一标识这个 iBeacon 设备。
  4. Major(2字节):

    11 12,表示 Major 值为 4625(十进制)。Major 用于区分同一个区域或位置内的不同设备,通常用于区分不同的区域或功能。
    计算过程:11 12为小端序,转换为实际值为0x1211,通过计算机十六进制转十进制
  5. Minor(2字节):

    33 32,表示 Minor 值为 12851(十进制)。Minor 用于进一步细分 Major 下的不同设备或区域。
  6. Signal Power(1字节):该位为8位有符号数据

    C0,表示信号强度为 -64 dBm。这个值通常用于估算设备与接收者之间的距离,较高的信号强度意味着接收设备离发射设备较近。
    或者直接转十进制后-256,即0xC0 = 192,192-256=-64

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。

Raw BLE Advertisement Data
02 01 06 1A FF 75 00 02 15 F2 A5 2D 43 E0 AB 48 9C B6 4C 4A 83 00 14 67 FD 02 21 00 1A C4
  • Length: 02(2 字节)。
  • Type: 01(Flags)。
  • Data: 06(支持 BLE 通用发现模式,支持 BR/EDR 和 BLE 双模式)。
  • Length: 1A(26 字节)。
  • Type: FF(厂商自定义数据)。
  • Data:
    • 厂商 ID: 75 00(0x0075)。
    • Beacon 类型: 02 15(表示 iBeacon)。
    • UUID: F2 A5 2D 43 E0 AB 48 9C B6 4C 4A 83 00 14 67 FD
    • Major: 02 21(0x0221,表示 Major 值为 545)。
    • Minor: 00 1A(0x001A,表示 Minor 值为 26)。
    • Measured Power: C4(-60 dBm)。

再来一个例子

          

0x0201061AFF01010215F2A52D43E0AB489CB64C4A83001467FD24080011C41B094C616E73697465634C6F5261557762426561636F6E5F30303131

        查表知0x09表示完整设备名称,十六进制转ASCII之后得:

再来一个例子

问题: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协议详细解析-优快云博客
https://zhuanlan.zhihu.com/p/393265355
【iBeacon】iBeacon前沿初探技术备忘 - typeofGeek - 博客园
第三周工作总结——IBeacon协议分析-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值