1. 广播数据解析概述

做嵌入式通信这些年,我接触最多的就是广播数据。说白了,广播就是设备在没人搭理它的时候,自己在那喊话:「我在这儿!我叫啥!我能干啥!」。你想想看,蓝牙耳机、Wi-Fi 热点、智能灯泡,它们刚上电时都在干同一件事——发广播。

但广播数据不是随便扔几个字节就完事的。它有一套严格的协议栈来封装。我刚开始啃 BLE 协议时,看着那堆十六进制字节串,头都大了。后来才明白,广播数据其实就三层东西:物理层怎么发、链路层怎么组包、应用层怎么塞数据。

什么是广播数据

广播数据,是设备在未建立连接前,主动向外发送的信息包。它不需要配对,不需要应答,发完就完事。接收方可以多个同时收,谁抢到算谁的。

举个例子:你手机打开蓝牙扫描,周围所有在广播的蓝牙设备都会出现在列表里。每个设备的名字、信号强度、支持的服务,都是从广播数据里解析出来的。

广播数据的三个核心特征:

  • 单向性:发送方只管发,不关心有没有人收
  • 无连接:不需要建立连接就能传输
  • 周期性:设备按固定间隔重复发送

我在项目中遇到过最典型的场景:一个智能门锁,平时处于广播状态,手机 App 扫描到它后,通过广播数据里的设备 ID 识别出是哪把锁,然后发起连接。整个过程,广播数据就是那个「敲门砖」。

广播协议栈简介

不同无线技术的广播协议栈差别挺大。我挑三个最常见的给你捋一捋。

BLE 广播协议栈

BLE(低功耗蓝牙)的广播协议栈分四层:

层级 名称 职责
L4 应用层 (GAP/ATT) 定义广播数据内容,如设备名、服务 UUID
L3 逻辑链路层 (LL) 组包、重传、信道选择
L2 物理层 (PHY) 调制解调、射频收发
L1 射频层 (RF) 天线、功率控制

BLE 广播包最大 47 字节,实际可用数据只有 31 字节。嗯,你没看错,就 31 个字节。我早期做 BLE 项目时,为了把设备信息塞进这 31 字节里,跟产品经理吵了不下三次架。

经典蓝牙广播协议栈

经典蓝牙(BR/EDR)的广播机制跟 BLE 不太一样。它用的是 Inquiry Scan 和 Page Scan,说白了就是设备主动问:「有人吗?」。广播数据格式更复杂,但好处是带宽大,能传更多信息。

我个人习惯把经典蓝牙的广播理解为「先喊一嗓子,再慢慢聊」。它不像 BLE 那样精打细算,但功耗也高得多。

Wi-Fi 广播协议栈

Wi-Fi 的广播主要靠 Beacon 帧。AP(热点)每隔 100ms 左右发一次 Beacon,里面装着 SSID、支持的速率、加密方式等信息。

Wi-Fi 广播协议栈的层次:

  • 物理层:OFDM/CCK 调制,2.4GHz/5GHz 频段
  • MAC 层:CSMA/CA 竞争机制,Beacon 帧格式
  • 管理帧层:Probe Request/Response,Association

Wi-Fi Beacon 帧最大能到 2300 多字节,比 BLE 阔气多了。但 Wi-Fi 广播的解析难点在于:Beacon 帧里的信息元素(IE)是 TLV 格式,你得一个一个解析。

我的经验:不管哪种协议,广播数据的核心结构都是 TLV(Type-Length-Value)。你只要掌握了 TLV 的解析方法,换什么协议都不怕。

解析的核心挑战

广播数据解析看着简单,实际坑不少。我踩过的坑,给你列几个典型的。

挑战一:数据不完整

广播包在空口传输,受干扰、遮挡、多径效应影响,丢包是常态。你收到的广播数据可能缺头缺尾。我曾经调试一个 BLE 门锁,发现手机偶尔收到乱码的设备名,排查了两天才发现是广播包被 Wi-Fi 信号干扰,中间几个字节全错了。

挑战二:多协议共存

一个房间里可能有 BLE 设备、经典蓝牙设备、Wi-Fi 设备。它们都在发广播。你的解析器得能区分:这个包是 BLE 的,还是经典蓝牙的?是 Beacon 帧,还是 Probe Request?

区分方法其实就一条:看前导码和接入地址。BLE 的接入地址固定是 0x8E89BED6,经典蓝牙的接入地址是设备自己的 BD_ADDR。Wi-Fi 的 Beacon 帧前两个字节是 0x8000。

挑战三:厂商自定义数据

很多设备会在广播数据里塞厂商自定义字段。比如小米的智能家居设备,会在广播里加一段私有数据,用来标识设备类型和状态。这些数据没有公开文档,你得逆向分析。

我遇到过最离谱的一次:某厂商在广播数据里塞了 20 字节的加密数据,说是用来做安全认证。结果解密后发现,里面就存了个设备序列号。你说这何必呢?

避坑指南:解析厂商自定义数据时,一定要做容错处理。我曾经因为没检查数据长度,直接 memcpy 导致缓冲区溢出,整个系统挂了。从那以后,我解析广播数据必做三步:长度校验、类型校验、CRC 校验。

挑战四:时序问题

广播数据是周期性发送的,但周期不固定。BLE 的广播间隔可以在 20ms 到 10.24s 之间调整。Wi-Fi Beacon 间隔通常是 100ms,但实际会有抖动。你的解析器得能处理乱序、重复、超时的情况。

我个人习惯的做法:维护一个设备表,每个设备记录最近一次收到广播的时间戳。超过一定时间没收到,就认为设备离线了。这个超时时间怎么设?BLE 设备我设 3 倍广播间隔,Wi-Fi 设备我设 500ms。

知识体系总览

下面这张图,把本章的核心知识点串起来了。你看一眼,心里就有数了。

广播数据解析知识体系 广播数据解析 BLE 广播协议栈 经典蓝牙广播 Wi-Fi Beacon 四大核心挑战 数据不完整 多协议共存 厂商自定义数据 时序与乱序 核心思路:掌握 TLV 解析方法,做好容错处理 不同协议只是封装不同,底层逻辑相通

这张图把广播数据解析的三大协议栈和四大核心挑战串在了一起。你仔细看,不管哪个协议,最终都要面对那四个挑战。说白了,解析广播数据就是跟不完整、多协议、自定义、乱序这四个家伙斗智斗勇。

嗯,这一章先给你搭个框架。后面每一章,我都会带着你手撕具体的解析代码。你准备好了吗?