# 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 节点) 监听基础广播帧和扩展广播帧, 从中提取设备信息。可选的主动查询流程: 1. T 节点发送查询请求帧 (携带过滤信息) 2. G 节点回复查询响应帧 **代码实现**: `mac.access.DiscoveryManager` 管理发现流程, 维护已发现设备列表。 ### 广播帧过滤 (§7.1.5) 接收端可配置过滤规则, 只接收满足条件的广播帧, 支持按地址、接入类型等条件过滤。 **代码实现**: `mac.broadcast.BroadcastFilter`, 使用 `FilterCondition` 和 `FilterOp` 定义规则。 ## 接入流程 (§7.1.3) 接入是 T 节点与 G 节点建立连接的过程, 分为以下步骤: ```{mermaid} 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 层的核心组件, 通过事件驱动的有限状态机管理链路完整生命周期。 ### 状态定义 ```{mermaid} 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) ```text ┌────────────────┬────────────┬──────────┐ │ 数据类型索引 │ 数据长度 │ 载荷 │ │ 2 字节 │ 1 字节 │ N 字节 │ └────────────────┴────────────┴──────────┘ ``` 数据类型索引标识信令类型 (130 种), 数据长度指示载荷字节数。 ### 数据面帧 (§7.3.3) **异步数据帧** (§7.3.3.2): ```text ┌────────────┬─────────────┬──────────┬──────────┐ │ 分段标志 │ 数据长度 │ 保留 │ 数据 │ │ 2 bit │ 11 bit │ 3 bit │ N 字节 │ └────────────┴─────────────┴──────────┴──────────┘ ``` 分段标志 (SegmentType): COMPLETE / FIRST / MIDDLE / LAST, 支持将大 PDU 分段传输。 **同步数据帧** (§7.3.3.3): 增加 PDU 序号、事件组编号和时间偏移字段, 适用于等时传输。 ### 复用帧 (§7.3.4) 复用帧允许在单个物理帧中同时携带控制面数据和用户面数据: ```text ┌──────────────────────┬────────────────┐ │ 控制面帧列表 │ 可选数据帧 │ │ (多个控制帧级联) │ (异步/同步) │ └──────────────────────┴────────────────┘ ``` **代码实现**: `mac.frame` 模块定义 `ControlFrame`, `AsyncDataFrame`, `SyncDataFrame`, `MuxFrame`, 各有 `pack()`/`unpack()` 方法。 ## 信令编解码 (§7.3) SLE 数据链路层共注册了 **130 种信令类型**: | 类别 | 数量 | 索引范围 | 实现模块 | |------|------|----------|----------| | 链路控制 | 109 | 0x0000-0x0070 | `mac.link_control` | | 功率控制 | 3 | 0x0019-0x001B | `mac.power_control` | | 安全配对 | 18 | 0x0133-0x0149 | `mac.security` | 每种信令都是一个数据类, 包含 `DATA_TYPE_INDEX`、`BYTE_LENGTH`、字段定义和 `pack()`/`unpack()` 方法。 信令注册表 (`mac.signaling`) 维护索引到类的映射, 提供统一的编解码接口: - `encode_signaling(msg)` → 序列化为 `ControlFrame` - `decode_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` 使用。