ESP32 C3开发实战 -8(BLE广播数据)

ESP32 C3开发实战 -8(BLE广播数据) 一、基础规则广播包整体结构BLE 广播包Advertising Packet分两大块广播头部Packet Header蓝牙底层链路层控制信息芯片自动填充应用层不用管AD 数据载荷Advertising Data / Scan Response Data开发者可自定义的业务数据最多 31 字节ADV_DATA主机扫描时直接收到的广播数据最多 31 字节SCAN_RSP主机发 Scan Request 后设备回复的附加数据额外 31 字节所有用户可见的名称、服务 UUID、厂商数据全部放在「AD 载荷」里由多条AD 结构AD Structure顺序拼接而成。二、单条 AD 结构通用固定格式核心每一段信息名称、Flags、厂商数据等都遵循统一 3 段式结构plaintext[1字节 Length] [1字节 AD Type] [N字节 AD Data Payload]Length长度字节等于后面「AD Type AD Payload」的总字节数例Type1 字节 负载 2 字节 → Length 0x03AD Type数据类型标准编号规定这段数据是什么含义蓝牙 SIG 规范定义AD Payload有效载荷该类型对应的实际内容长度 Length - 1多条 AD 结构紧密拼接中间无分隔符扫描工具靠Length逐个拆分解析三、BLE 最常用标准 AD Type对照你截图里的字段1. 0x01 Flags 标志位必带几乎所有设备广播第一段长度固定Length0x02Payload 2bit 标志位关键 bit 定义Bit0LE Limited Discoverable 有限可发现短时广播Bit1LE General Discoverable 通用可发现长期广播Bit2BR/EDR Not Supported 1 → 纯 BLE 设备无经典蓝牙Bit3LEBR/EDR 共存设备示例值0x05 0b00000101有限可发现、无经典蓝牙2. 服务 UUID 类宣告设备支持的 BLE GATT 服务3. 设备名称类0x08 Shortened Local Name缩短本地名名称超长时截断0x09 Complete Local Name完整本地名称 Payload 直接存 ASCII 字符串4. Appearance 设备外观 0x192 字节数值蓝牙 SIG 预定义设备图标分类手环、温度计、体重秤、通用设备等0x0000 无分类通用 BLE 设备手机不显示专属图标5. LE 蓝牙地址 0x1B广播携带自身 BLE MAC 地址6 字节用于区分设备6. 厂商自定义数据 0xFF Manufacturer Specific Data最常用私有业务段也是你文档重点 Payload 格式固定[2字节 Company ID] [厂商自定义私有数据]前 2 字节蓝牙联盟分配的厂商 ID剩余字节厂商自由定义状态、参数、MAC、故障码等无规范限制四、可选扩展 AD Type日常开发高频0x0A Tx Power Level发射功率用于 RSSI 测距定位0x14 Service Data服务配套数据BLE 透传、传感器实时值广播0x16 16-bit Service Data绑定 16bit 服务的实时数据门锁、传感器常用0x29 Mesh Data蓝牙 Mesh 组网广播0x2A Mesh BeaconMesh 信标五、广播数据包两种载体区分ADV_DATA主广播数据最大 31 字节设备主动向外广播手机不用额外请求就能直接收到 业务核心数据名称、厂商状态、基础服务尽量放这里。SCAN_RSP扫描响应额外 31 字节手机发送 Scan Request 包后设备才会回复 适合放次要数据超长设备名、额外服务、扩展厂商信息。总可用数据上限ADV 31B SCAN_RSP 31B 62 字节六、贴上实例代码// 启动BLE广播void BleAdvertise(void){LOG(BLE_TAG, BleAdvertise());if(BleState!BLE_STOP) return;if (!ble_hs_synced()){ESP_LOGW(BLE_TAG, BLE is not synced,return);return;}struct ble_hs_adv_fields Fields {0};Fields.name (uint8_t *)DeviceName;Fields.name_len strlen(DeviceName);Fields.name_is_complete 1;Fields.flags BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;Fields.uuids16 (ble_uuid16_t[]){BLE_UUID16_INIT(0x180A)}; //设备信息服务UUIDFields.num_uuids16 1;Fields.uuids16_is_complete 1;if (ble_gap_adv_set_fields(Fields) ! 0){ESP_LOGE(BLE_TAG, Set Ble Advertise field fail);return;}struct ble_gap_adv_params AdvPara {0};AdvPara.conn_mode BLE_GAP_CONN_MODE_UND;AdvPara.disc_mode BLE_GAP_DISC_MODE_GEN; if (ble_gap_adv_start(BLE_OWN_ADDR_PUBLIC, NULL, BLE_HS_FOREVER, AdvPara, BleGapEventHdl, NULL) ! 0){ESP_LOGE(BLE_TAG, Ble advertise start fail);return;}BleStateBLE_ADVERTISING;LOG(BLE_TAG, BLE advertising (Device: %s), LB_Mode);}