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帧”。

下面这张图,是我在项目中经常用来给新人讲解的帧结构全景图:

UWB MAC帧结构全景图 前导码 (Preamble) 长度:64/1024/4096符号 SFD 8/64符号 PHR 19/21比特 PSDU (MAC帧体) 长度可变,最大4095字节 PLCP前导码(物理层汇聚) PHY层载荷(PHR + PSDU) 发送顺序:从左到右,先发前导码,最后发PSDU PSDU内部包含:MAC头 + MAC载荷 + FCS

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头的具体字段了。