当前位置: 首页 > news >正文

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可做如下拆解:

  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数据)。

        在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 + 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。这个值通常用于估算设备与接收者之间的距离,较高的信号强度意味着接收设备离发射设备较近。

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

相关文章:

  • 网页复制小妙招
  • Electron、Tauri及其它跨平台方案终极对比
  • 用不同语言写力扣题的思考:如何选择最适合的编程语言
  • Spark核心之02:常用算子详解
  • 软考高级信息系统项目管理师笔记-第8章项目整合管理
  • 园区能耗管理新趋势——构建能源数字化体系,迈向低碳未来
  • 结构体位域操作,和共用体配合使用
  • 数据集/API 笔记 新加坡相对湿度数据
  • 基于nginx的灰度发布解决方案
  • WPF 如何使文本显示控件支持显示内容滚动显示
  • Oracle 数据库基础入门(五):限制查询与范式三约定深度解析
  • 15分钟实战:SpringBoot + Vue2快速构建AI对话系统(集成DeepSeek)
  • 进程间通信方式:对列、管道、共享内存
  • Oracle 数据库基础入门(四):分组与联表查询的深度探索(下)
  • 安路FPGA开发入门:软件安装与点灯与仿真(TangDynasty ModelSim)
  • VAE中的编码器(Encoder)详解
  • pg pg_prewarm用法
  • ICP-通过一组匹配的3D点估计相机运动
  • 【go】time.after内存泄漏
  • 使用 USRP 和 OpenAirInterface 构建实时神经接收器原型
  • 杭州银行一季度净赚超60亿增逾17%,增速较去年同期有所回落
  • 中消协发布“五一”消费提示:践行“光盘行动”,抵制餐饮浪费
  • 商务部:4月份以来的出口总体延续平稳增长态势
  • 劳动最光荣!2426人受到表彰
  • 清华姚班,正走出一支军团
  • 我国首个大型通用光谱望远镜JUST在青海启动建设