3. UWB MAC层帧结构:从比特流到业务帧
UWB的MAC层帧结构,说白了就是物理层和上层应用之间的“翻译官”。你想想看,物理层只管发脉冲、收脉冲,它不关心你发的是测距数据还是控制指令。而MAC帧,就是把这些原始比特组织成有意义的“包裹”。
我刚开始接触UWB协议栈时,总觉得帧结构就是一堆字段堆砌,没什么技术含量。直到有一次调试测距异常,发现SFD字段被误判,整个测距流程全乱套了。嗯,从那以后,我对帧结构的每个字节都不敢马虎。
3.1 帧格式总览:四个核心段
一个完整的UWB MAC帧,由四个部分组成。我习惯把它们比作快递包裹的四个层次:
- 前导码(Preamble) — 包裹上的“发光标签”,让接收方知道“有东西来了”
- SFD(Start-of-Frame Delimiter) — 包裹上的“封条”,告诉接收方“数据要开始了”
- PHR(PHY Header) — 包裹的“快递单”,写着数据长度、速率等关键信息
- PSDU(PHY Service Data Unit) — 包裹里的“实物”,也就是真正的MAC帧内容
核心要点:前导码和SFD属于物理层汇聚过程(PLCP),PHR和PSDU才是真正的PHY层载荷。但在实际开发中,我们通常把整个帧结构统称为“MAC帧”。
下面这张图,是我在项目中经常用来给新人讲解的帧结构全景图:
3.2 前导码与SFD:帧同步的关键
前导码是一串已知的脉冲序列。接收方通过检测前导码,才能知道信道上有信号来了。我见过不少新手在配置前导码长度时,直接选最短的64符号,结果在复杂环境下丢包率飙升。
我的经验:室内视距环境,用1024符号的前导码就够了。如果是穿墙或长距离场景,建议用4096符号。前导码越长,同步可靠性越高,但也会增加空中占用时间,影响吞吐量。
SFD是前导码和PHR之间的“分水岭”。它是一段特定的符号序列,接收方检测到SFD后,就知道“前导码结束了,接下来是真正的数据”。
IEEE 802.15.4标准定义了两种SFD格式:
| SFD类型 | 符号长度 | 适用场景 | 我个人的建议 |
|---|---|---|---|
| 标准SFD | 8符号 | 默认配置,兼容性好 | 大多数场景用这个 |
| 扩展SFD | 64符号 | 高干扰环境 | 工业现场或密集部署时考虑 |
避坑指南:我曾经在一个项目中,发送端用了扩展SFD,接收端却配置了标准SFD。结果就是,接收方永远检测不到帧起始,整个链路不通。排查了整整两天才发现是SFD长度不匹配。记住:收发双方的SFD配置必须一致。
3.3 PHR:帧的“身份证”
PHR只有19或21比特,但它承载了接收方解码PSDU所需的全部信息。我习惯把它叫做“帧的身份证”。
PHR包含以下关键字段:
- 数据速率(Data Rate) — 2比特,指示PSDU的传输速率(110kbps、850kbps、6.8Mbps、27.2Mbps)
- 帧长度(Frame Length) — 10比特,指示PSDU的字节数(0~1023)
- Ranging位 — 1比特,指示是否为测距帧
- 预留位和校验位 — 用于扩展和错误检测
这里有个细节要注意:PHR本身是用最低速率(110kbps)传输的。为什么?因为接收方在解码PHR时,还不知道后续数据用什么速率。用最低速率传输,能保证PHR被可靠解码。
3.4 PSDU与帧类型:数据、控制、测距
PSDU就是MAC层的“正文”。它包含MAC头、MAC载荷和帧校验序列(FCS)。根据MAC帧控制字段的不同,PSDU承载的内容也不同。
UWB MAC层定义了三种核心帧类型:
| 帧类型 | 帧控制字段值 | 主要用途 | 典型场景 |
|---|---|---|---|
| 数据帧 | 001 | 传输上层应用数据 | 传感器数据上报、文件传输 |
| 控制帧 | 010 | 链路管理、信道接入 | Beacon、ACK、RTS/CTS |
| 测距帧 | 011 | 距离测量 | UWB定位、室内导航 |
你可能会问:为什么测距帧要单独作为一种帧类型?
原因很简单:测距对时间精度要求极高。测距帧在MAC层就带有时间戳信息,而且它的处理优先级高于普通数据帧。我在做定位项目时,测距帧的发送间隔直接决定了定位刷新率。
3.5 帧控制字段:帧的“指挥中心”
帧控制字段是MAC头的第一个字段,只有2字节,但它决定了整个帧的行为。我把它叫做“帧的指挥中心”。
帧控制字段的位布局如下:
| 位范围 | 字段名 | 长度(比特) | 说明 |
|---|---|---|---|
| 0-2 | 帧类型 | 3 | 数据/控制/测距/保留 |
| 3 | 安全使能 | 1 | 是否启用AES加密 |
| 4 | 帧待处理 | 1 | 发送方是否还有更多数据 |
| 5 | ACK策略 | 1 | 是否需要ACK确认 |
| 6-7 | 保留 | 2 | 预留未来使用 |
| 8-9 | 目的地址模式 | 2 | 无地址/短地址/扩展地址 |
| 10-11 | 源地址模式 | 2 | 同上 |
| 12-15 | 保留/扩展 | 4 | IEEE预留 |
实战要点:帧控制字段的ACK策略位,直接影响重传机制。我建议在测距帧中关闭ACK(设为0),因为测距帧需要精确的时间控制,ACK会引入额外的延迟抖动。数据帧则建议开启ACK,保证可靠性。
下面是一个实际的数据帧PSDU结构示例:
// 一个典型的UWB数据帧PSDU(十六进制)
// MAC头(23字节) + 载荷(可变) + FCS(2字节)
// 帧控制字段(2字节):0x8841
// 二进制:1000 1000 0100 0001
// 帧类型=001(数据帧)
// 安全使能=0
// 帧待处理=0
// ACK策略=1(需要ACK)
// 目的地址模式=10(扩展地址)
// 源地址模式=00(短地址)
// 序列号(1字节):0x12
// 目的PAN ID(2字节):0xCAFE
// 目的地址(8字节):0x0011223344556677
// 源PAN ID(2字节):0xBEAD
// 源地址(2字节):0x0102
// 辅助安全头(0字节,安全未使能)
// 载荷(假设10字节):0xA1 A2 A3 A4 A5 A6 A7 A8 A9 AA
// FCS(2字节):0x3F 0xC8
嗯,这里要注意:FCS是CRC-16校验,覆盖整个MAC头和载荷。接收方收到帧后,会重新计算CRC并与FCS字段比对。如果不一致,直接丢弃该帧。
3.6 帧结构设计的权衡
在实际项目中,帧结构的设计不是一成不变的。我总结了几条经验:
- 前导码长度:长前导码提高同步可靠性,但降低吞吐量。高密度部署场景建议用短前导码。
- 地址模式:扩展地址(8字节)安全性高,但帧开销大。短地址(2字节)适合传感器网络。
- ACK策略:测距帧关ACK,数据帧开ACK,控制帧视情况而定。
- 安全使能:AES加密会引入约20字节的辅助安全头,小数据包慎用。
我的习惯:在项目初期,我会先用默认配置(标准SFD、1024前导码、短地址、开ACK)跑通基础链路。然后根据实际测试结果,逐步调整帧结构参数,找到可靠性和吞吐量的最佳平衡点。
帧结构是UWB协议栈的基石。你只有把前导码、SFD、PHR、PSDU这四个段吃透了,才能理解后续的测距流程、信道接入和吞吐优化。下一层,我们就要深入MAC头的具体字段了。