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, 使用 FilterConditionFilterOp 定义规则。

接入流程 (§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

mac.link_control

功率控制

3

0x0019-0x001B

mac.power_control

安全配对

18

0x0133-0x0149

mac.security

每种信令都是一个数据类, 包含 DATA_TYPE_INDEXBYTE_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 使用。