ESP32蓝牙开发笔记(四)

蓝牙广播包详解

一、广播包基本结构

蓝牙广播包由四部分组成:

  1. 前导码(Preamble)​:1字节交替序列(0xAA或0x55),用于同步接收端时钟。
  2. 接入地址(Access Address)​:固定为 ​0x8E89BED6​(广播通道)或随机值(数据通道)。
  3. 协议数据单元(PDU)​
    • Header:包含广播类型(4bit)、发送/接收地址类型(各1bit)、长度(6bit)。
    • Payload:包含设备地址(6字节)和广播数据(最长31字节)。
  4. CRC校验码:3字节,用于数据完整性验证。
二、广播类型与用途

广播包通过PDU类型区分功能:

类型值 类型名称 用途 适用协议版本
0x00 ADV_IND 可连接非定向广播,允许任何设备扫描并连接,包含广播数据和扫描响应数据。(例:智能手环、智能灯泡) Bluetooth 4.0+
0x01 ADV_DIRECT_IND 可连接定向广播,仅针对特定设备(含目标地址)快速建立连接。(例:手机与耳机快速配对) Bluetooth 4.0+
0x02 ADV_NONCONN_IND 不可连接广播,仅传输数据且不支持扫描响应。
(例:Beacon信标、传感器数据广播)
Bluetooth 4.0+
0x03 ADV_SCAN_IND 可扫描非定向广播,允许设备被发现但不接受连接。
(例:电子价签、信息展示设备)
Bluetooth 4.0+
0x04 SCAN_RSP 扫描响应包,响应扫描请求以补充设备详细信息(如完整服务列表)。(例:设备详细服务UUID) Bluetooth 4.0+
0x0011 SCAN_REQ 扫描请求包,由主设备主动发送以触发从设备返回SCAN_RSP。 Bluetooth 4.0+
0x0101 CONNECT_REQ 连接请求包,主设备发起连接时使用。 Bluetooth 4.0+
0x0A ADV_EXT_IND 扩展广播指示,支持255字节大载荷及动态信道选择(需蓝牙5.0+)。(例:OTA固件广播、室内导航数据) Bluetooth 5.0+
0x0B AUX_ADV_IND 辅助广播包,在次广播信道传输扩展数据(配合ADV_EXT_IND使用)。 Bluetooth 5.0+
三、广播数据格式(AD Structure)

广播数据由多个 ​AD Structure 组成,每个结构包含:

  1. Length​(1字节):后续数据总长度。
  2. AD Type​(1字节):数据类型标识。
  3. AD Data​(可变长度):具体内容。

常见AD Type定义

类型值(Hex)​ 类型名称 数据描述
0x01 Flags 设备功能标识(如发现模式、BR/EDR支持):
bit0=LE有限发现模式,bit1=普通发现模式,bit2=不支持BR/EDR等

0x02 Incomplete 16-bit UUIDs 不完整的16位服务UUID列表

0x03 Complete 16-bit UUIDs 完整的16位服务UUID列表

0x04 Incomplete 32-bit UUIDs 不完整的32位服务UUID列表

0x05 Complete 32-bit UUIDs 完整的32位服务UUID列表

0x06 Incomplete 128-bit UUIDs 不完整的128位服务UUID列表

0x07 Complete 128-bit UUIDs 完整的128位服务UUID列表

0x08 Shortened Local Name 设备名称的缩写(例如“ESP32”)

0x09 Complete Local Name 设备的完整名称(例如“ESP32-Sensor”)

0x0A TX Power Level 发射功率级别(-127~+127 dBm)

0x0D OOB Class of Device 带外设备类别(3字节)

0x0E OOB Simple Pairing Hash C 带外配对哈希值(16字节)

0x0F OOB Simple Pairing Randomizer R 带外配对随机数(16字节)

0x10 Security Manager TK Value 安全管理临时密钥

0x11 Security Manager OOB Flag 带外安全管理标志位

0x12 Slave Connection Interval Range 从设备连接间隔范围(4字节:最小/最大间隔)

0x14 Service Solicitation 16-bit UUID 服务请求的16位UUID列表

0x15 Service Solicitation 128-bit UUID 服务请求的128位UUID列表

0x16 Service Data - 16-bit UUID 16位UUID关联的服务数据(例如心率传感器数据)

0x19 Appearance 设备外观类别(2字节编码,如键盘=0x03C1)

0x1A Advertising Interval 广播间隔(2字节,单位0.625ms)

0x1B LE Bluetooth Device Address LE设备地址(6字节)

0x20 Service Data - 32-bit UUID 32位UUID关联的服务数据

0x21 Service Data - 128-bit UUID 128位UUID关联的服务数据

0x24 URI 统一资源标识符(例如网页URL)

0xFF Manufacturer Specific Data 厂商自定义数据(前2字节为厂商ID,其余自定义)

关键说明

  1. 数据长度限制

    • 每个广播包(Advertising Data)和扫描响应包(Scan Response)最大为31字节。
    • 若有效数据不足31字节,剩余部分需补零填充。
  2. 厂商自定义数据(0xFF)​

    • 前2字节为 ​厂商ID​(例如苹果=0x004C),后续数据由厂商自由定义(例如iBeacon格式)。
  3. 扩展广播(Bluetooth 5.0+)​

    • 支持更大的数据载荷(255字节)和辅助信道传输,需使用扩展广播类型(如ADV_EXT_IND)。

广播数据超过31字节的方案


一、基础方案:广播数据与扫描响应数据结合

  1. 31+31字节扩展
    通过将关键数据拆分到广播数据​(Advertising Data)和扫描响应数据​(Scan Response)中,总容量可扩展至62字节。广播数据用于主动发送设备基本信息(如MAC地址、基础服务UUID),扫描响应数据在设备被扫描时补充发送额外信息(如完整设备名称、详细服务列表)。

二、数据优化策略

  1. 紧凑数据格式

    • 使用自定义AD Type​(如0xFF厂商自定义字段)压缩非标准数据。
    • 将设备名称截断为短标识符(如限制为10字节),并通过连接后传输完整名称。
  2. 动态编码
    在广播包中仅发送动态生成的设备ID(2-4字节),配合本地存储的映射表实现设备唯一性识别,减少实时数据量。

三、进阶方案:BLE 5.x扩展广播

  1. 255字节大广播包
    蓝牙5.0及以上版本支持扩展广播,通过主广播信道发送31字节的元数据(含ADV_EXT_IND指令),在次广播信道(0-36信道)发送255字节有效载荷,总容量提升8倍。

  2. 多信道抗干扰
    次广播信道支持37个物理信道(相比传统3个主信道),可同时广播多种协议(如iBeacon+Eddystone),并降低多设备干扰。

四、其他技术手段

  1. 连接后数据传输
    广播包仅发送设备UUID或短ID,待设备连接后通过GATT服务传输完整数据,适用于需要大数据交互的场景。

  2. 分批次广播
    通过周期性广播分多次发送数据块(如传感器历史记录),接收端按时间戳重组数据。


方案对比表

方案 最大容量 兼容性 适用场景
广播+扫描响应 62字节 蓝牙4.x/5.x 常规设备信息扩展
BLE 5扩展广播 255字节 蓝牙5.x设备 传感器大数据、室内导航
动态编码+连接传输 无上限 全版本 需双向通信的复杂应用
分批次广播 理论无上限 需协议栈支持 周期性数据上报

在蓝牙广播包中,​Flags(AD Type 0x01)​是必须存在的核心数据类型,特别是在设备支持可连接或可发现功能时。以下是详细说明:

一、必须存在的 AD Type:Flags(0x01)

  1. 功能定义
    Flags 用于标识设备的广播能力,例如是否支持连接、发现模式等。其数据格式为 1 字节的位掩码,具体含义如下:

    • bit 0:LE 有限发现模式(如短暂广播)
    • bit 1:LE 普通发现模式(持续广播)
    • bit 2:不支持传统蓝牙(BR/EDR)
    • bit 3/4:同时支持 BLE 和 BR/EDR(控制器和主机层面)
    • bit 5-7:保留位
  2. 强制条件

    • 若广播包类型为 ​可连接(ADV_IND/ADV_DIRECT_IND)​ 或 ​可扫描(ADV_SCAN_IND)​,则必须包含 Flags。
    • 如果广播中未包含 Flags,某些设备可能无法正确识别广播状态,导致连接或扫描失败。

二、其他常见但非强制的 AD Type

以下类型根据应用场景可选:

  1. 设备名称(0x08/0x09)​

    • 0x08(Shortened Local Name)​:设备名称缩写。
    • 0x09(Complete Local Name)​:完整设备名称。虽非强制,但实际开发中通常包含以便用户识别。
  2. 服务 UUID(0x02-0x07)​
    用于声明设备支持的服务类型,例如心率监测(0x180D)等。若设备需被特定应用识别,则需包含此字段。

  3. 发射功率(0x0A)​
    表示广播信号的强度(单位 dBm),可用于距离估算。

三、广播包结构强制内容

  1. 设备地址(AdvA)​
    虽然不是 AD Type,但广播包的 ​PDU 头部必须包含 6 字节的广播设备地址(公有或随机地址),用于唯一标识设备。

  2. 数据完整性

    • 若广播数据不足 31 字节,需填充 0 补全至 31 字节,但填充部分无效。
    • 每个 AD Structure 必须包含长度(Length)和类型(AD Type)字段。

你可能感兴趣的:(ESP32蓝牙开发,笔记,网络)