MAC 层详解¶
本文详细解释 SparkLink SLE 数据链路层 (MAC 层) 的设计与实现, 涵盖广播与发现、接入流程、链路管理状态机、帧结构与信令编解码、QoS 管理和时序调度, 对标 TXS-10002-2025 标准第 7 章。
广播与发现 (§7.1.1-7.1.2)¶
广播是 SLE 建立通信的起点。G 节点周期性发送广播帧, T 节点通过扫描接收这些帧来发现附近的设备。
广播帧的两级结构¶
SLE 广播帧分为两级:
基础广播帧: 使用 FT1 或 FT4 帧类型, 在 1 至 3 个广播信道上依次发送 3 次
扩展广播帧: 紧随基础广播帧之后发送, 间隔不小于 300 \(\mu\)s, 携带更多信息
基础广播帧提供设备发现所需的最少信息, 扩展广播帧则指示接入资源、传输参数、系统管理帧配置等详细内容。
广播帧数据类型¶
广播帧内部由多个子信息条目组成, 每个条目包含类型索引和载荷, 标准定义了 11 种数据类型:
索引 |
名称 |
用途 |
|---|---|---|
0x00 |
发现接入资源配置 |
指示可用的接入资源时隙 |
0x01 |
传输指示信息 |
首次调度点参数 (58B) |
0x02 |
接入基本信息 |
设备能力和接入参数 (5B) |
0x03 |
接入请求信息 |
T 节点发出的连接请求 |
0x04 |
接入响应信息 |
G 节点回复的连接结果 |
0x05 |
启动系统管理帧信息 |
SMF 资源配置 |
0x06 |
非链接态广播链路信息 |
无连接广播参数 (70B) |
0x07 |
查询请求过滤信息 |
服务发现过滤条件 |
0x08 |
窄带跳频测量配置 |
窄带定位参数 |
0x09 |
UWB 脉冲测量配置 |
超宽带定位参数 |
0xFF |
高层广播数据 |
应用自定义数据 |
代码实现: mac.broadcast 模块定义了 BroadcastDataType 枚举和 21 种子信息数据类, 包括 ExtAdvResourceConfig, DiscoveryAccessResourceConfig, AccessBasicInfo 等, 每个类实现 pack()/unpack() 方法。BroadcastFrame 封装了广播帧的整体编解码。
发现流程 (§7.1.2)¶
发现设备 (T 节点) 监听基础广播帧和扩展广播帧, 从中提取设备信息。可选的主动查询流程:
T 节点发送查询请求帧 (携带过滤信息)
G 节点回复查询响应帧
代码实现: mac.access.DiscoveryManager 管理发现流程, 维护已发现设备列表。
广播帧过滤 (§7.1.5)¶
接收端可配置过滤规则, 只接收满足条件的广播帧, 支持按地址、接入类型等条件过滤。
代码实现: mac.broadcast.BroadcastFilter, 使用 FilterCondition 和 FilterOp 定义规则。
接入流程 (§7.1.3)¶
接入是 T 节点与 G 节点建立连接的过程, 分为以下步骤:
sequenceDiagram
participant G as G节点
participant T as T节点
G->>T: 发送可接入扩展广播帧
T->>G: 接入请求帧 (GT偏好)
G->>T: 接入响应帧 (结果+角色)
Note over G,T: 协商G/T角色完成
Note over G,T: 分配首次调度点
Note over G,T: 建立异步数据链路
Note over G,T: 配对和鉴权管理 或 安全保护
Note over G,T: 加密数据传输开始
接入请求携带 GT 角色偏好, G 节点根据自身策略决定是否接受, 以及最终的角色分配。
角色协商¶
GT 角色协商有四种结果:
协商 T 节点: 接受请求, 发起方为 T
协商 G 节点: 接受请求, 发起方为 G
固定 T 节点: 强制分配为 T
固定 G 节点: 强制分配为 G
接入白名单 (§7.1.6)¶
G 节点可配置地址白名单, 仅允许已知设备接入。白名单基于地址匹配, 支持动态添加/删除。
代码实现: mac.access 模块提供两个管理器:
BroadcasterAccessManager: G 节点侧, 发送广播、处理请求、发送响应InitiatorAccessManager: T 节点侧, 发送请求、处理响应AccessWhitelist: 地址白名单AccessPhase枚举: IDLE → ADV_SENDING → REQ_WINDOW → RSP_WINDOW → LINK_SETUP → COMPLETED
关键时序约束: 广播帧到扩展广播帧间隔不小于 300 \(\mu\)s, 扩展广播帧到接入请求间隔不小于 300 \(\mu\)s。
链路管理状态机 (§7.1/7.2)¶
链路管理器 (LinkManager) 是 MAC 层的核心组件, 通过事件驱动的有限状态机管理链路完整生命周期。
状态定义¶
stateDiagram-v2
IDLE --> BROADCASTING
IDLE --> SCANNING
BROADCASTING --> CONNECTED
SCANNING --> ACCESSING
ACCESSING --> CONNECTED
ACCESSING --> PAIRING
PAIRING --> CONNECTED
CONNECTED --> DISCONNECTED
CONNECTED --> DORMANT
DORMANT --> CONNECTED
8 种状态:
状态 |
含义 |
|---|---|
IDLE |
空闲, 未参与任何通信 |
BROADCASTING |
G 节点正在发送广播帧 |
SCANNING |
T 节点正在扫描广播 |
ACCESSING |
正在执行接入流程 |
CONNECTED |
链路已建立, 可收发数据 |
PAIRING |
正在执行安全配对 |
DORMANT |
休眠状态 (§7.2.14) |
DISCONNECTED |
链路已断开 |
事件类型¶
状态机接收 21 种事件驱动状态转移, 主要类别:
广播/发现: 启动/停止广播和扫描, 接收广播帧
接入: 发送/接收请求和响应
信令: 收发链路控制信令
配对: 启动配对、完成、失败
断开: 主动断开请求、对端断开、监督超时
休眠: 休眠请求、唤醒请求、唤醒接收
链路参数¶
LinkParams 保存当前链路运行参数:
收发间隔 (interval_us)
最大数据长度 (max_data_length)
跳频表 (hop_table)
帧类型 (frame_type)
CRC 长度 (crc_len)
监督超时 (supervision_timeout_ms)
这些参数可通过控制面流程 (§7.2.1-7.2.25) 动态更新。
代码实现: mac.link_manager.LinkManager 类, 提供 process_event(Event) 方法驱动状态转移, 通过 LinkManagerCallback 接口向上层通知状态变化。
控制面流程 (§7.2)¶
标准定义了 25 种控制面流程, 全部支持 G 节点和 T 节点双向发起:
链路参数更新 (§7.2.1-7.2.2)¶
收发间隔更新: 请求→接受/拒绝 或 直接更新
多级收发间隔: 支持在不同优先级间切换间隔参数
链路能力协商 (§7.2.4-7.2.6)¶
特性交互: 交换双方支持的功能特性位图
版本交互: 交换协议版本信息
数据长度更新: 协商最大 PDU 长度
信道管理 (§7.2.7-7.2.12)¶
信道质量上报: 配置信道质量汇报周期和方式
跳频表更新: 更新跳频频点序列
跳频地图更新: 更新信道可用性位图
最少可用信道: 确保可用信道数不低于门限
CRC 切换: 在 CRC24 和 CRC32 之间切换
物理层更新: 切换帧类型或调制参数
连接管理 (§7.2.13-7.2.17)¶
功率控制: 请求→响应→调整发射功率 (§7.2.13)
休眠与唤醒: 一方请求进入休眠, 对方确认; 唤醒时反向操作 (§7.2.14)
角色切换: G/T 角色互换 (§7.2.15)
PING 流程: 检测链路连通性 (§7.2.16)
链路断开: 发送断开指示, 释放资源 (§7.2.17)
高级链路管理 (§7.2.18-7.2.25)¶
链接态异步链路: 参数重配置/更新/建链/断链 (§7.2.18)
同步等时链路: 建链/参数交互/参数更新 (§7.2.19)
广播链路: 建立/参数更新/跳频地图/断开 (§7.2.20)
系统管理帧链路: 参数/时间片更新/信道状态 (§7.2.21)
异步组播链路: 建立/参数/断开/超时 (§7.2.22)
窄带/UWB 测量与感知: 测量和感知流程管理 (§7.2.23-7.2.25)
代码实现: mac.link_manager.LinkManager 内部对全部 25 种流程提供处理逻辑, 通过 mac.link_control 模块的 109 种信令类型驱动。mac.power_control 独立实现功率控制的 3 种信令。
帧结构 (§7.3)¶
MAC 帧分为三种:
控制面帧 (§7.3.2)¶
┌────────────────┬────────────┬──────────┐
│ 数据类型索引 │ 数据长度 │ 载荷 │
│ 2 字节 │ 1 字节 │ N 字节 │
└────────────────┴────────────┴──────────┘
数据类型索引标识信令类型 (130 种), 数据长度指示载荷字节数。
数据面帧 (§7.3.3)¶
异步数据帧 (§7.3.3.2):
┌────────────┬─────────────┬──────────┬──────────┐
│ 分段标志 │ 数据长度 │ 保留 │ 数据 │
│ 2 bit │ 11 bit │ 3 bit │ N 字节 │
└────────────┴─────────────┴──────────┴──────────┘
分段标志 (SegmentType): COMPLETE / FIRST / MIDDLE / LAST, 支持将大 PDU 分段传输。
同步数据帧 (§7.3.3.3): 增加 PDU 序号、事件组编号和时间偏移字段, 适用于等时传输。
复用帧 (§7.3.4)¶
复用帧允许在单个物理帧中同时携带控制面数据和用户面数据:
┌──────────────────────┬────────────────┐
│ 控制面帧列表 │ 可选数据帧 │
│ (多个控制帧级联) │ (异步/同步) │
└──────────────────────┴────────────────┘
代码实现: mac.frame 模块定义 ControlFrame, AsyncDataFrame, SyncDataFrame, MuxFrame, 各有 pack()/unpack() 方法。
信令编解码 (§7.3)¶
SLE 数据链路层共注册了 130 种信令类型:
类别 |
数量 |
索引范围 |
实现模块 |
|---|---|---|---|
链路控制 |
109 |
0x0000-0x0070 |
|
功率控制 |
3 |
0x0019-0x001B |
|
安全配对 |
18 |
0x0133-0x0149 |
|
每种信令都是一个数据类, 包含 DATA_TYPE_INDEX、BYTE_LENGTH、字段定义和 pack()/unpack() 方法。
信令注册表 (mac.signaling) 维护索引到类的映射, 提供统一的编解码接口:
encode_signaling(msg)→ 序列化为ControlFramedecode_signaling(frame)→ 从ControlFrame解析出具体信令对象
QoS 管理 (§6.5)¶
QoS 管理器保障数据传输的可靠性和效率:
ARQ 自动重传¶
序列号管理和重传控制。不同帧类型的模数不同:
帧类型 |
SN 模数 |
|---|---|
FT1 |
2 |
FT2 |
2 |
FT3/FT4 |
32 |
HARQ 混合重传¶
支持两种反馈模式:
TB (传输块): 整个传输块 ACK/NACK
CBG (码块组): 按码块组粒度反馈, 部分重传 (最多 8 个 CBG)
流控¶
基于信用额度的发送窗口控制, 防止发送端淹没接收端。
链路质量跟踪¶
实时统计帧错误率 (FER), 计算推荐 MCS 索引, 支持自适应调制编码 (AMC)。
优先级队列¶
五级优先级: CONTROL > REALTIME > HIGH > NORMAL > LOW, 高优先级载荷优先发送。
代码实现: mac.qos.QosManager 整合 ArqState, HarqController, FlowController, LinkQualityTracker, TxQueue。
时序调度 (§6.3/6.6)¶
超帧结构¶
SLE 时序由超帧 (Superframe) 组织, 两个系统管理帧 (SMF) 之间为一个超帧周期。超帧内部划分为多个时间片 (TimeSlice), 每个时间片分配给特定链路。
系统管理帧 (§6.6)¶
SMF 是 G 节点向所有 T 节点广播的调度信息帧, 包含:
调度信令: 时间片分配和链路调度
链路信令: 链路参数更新通知
偏移信令: 时间偏移校正
SMF 发送调度由 mac.smf_scheduler.SMFTransmitScheduler 管理。
事件组 (§附录 D)¶
事件组将多个传输事件组合为一组, 用于等时场景的同步调度。
代码实现: mac.scheduler.ScheduleManager 管理超帧、事件组和多级收发间隔, mac.smf 模块负责 SMF 帧的编解码, mac.smf_scheduler 负责发送调度。
非链接态广播 (§7.1.7)¶
设备之间无需建立连接即可进行数据广播, 适用于周期性公告信息等场景。非链接态广播帧使用独立的参数配置, 与有连接的数据传输互不干扰。
代码实现: mac.access.NonConnectedBroadcastManager, 配合 NonConnectedBroadcastConfig 使用。