跳转至

概述

认识星闪

星闪(SparkLink) 是中国自主研发的新一代无线短距离通信技术标准,由星闪联盟(SparkLink Alliance)制定和推动。它的设计目标是在功耗、速率、延迟、连接数和抗干扰等方面全面超越传统短距通信技术,覆盖消费电子、智能家居、工业互联和车载场景。

星闪 1.0 标准定义了两大接入模式:

模式 定位 特点 典型场景
SLB(SparkLink Basic) 基础高速率 高带宽、高吞吐 音视频传输、文件分享、无线投屏
SLE(SparkLink Low Energy) 低功耗低延迟 低功耗、超低延迟、多连接 鼠标键盘、游戏手柄、传感器、可穿戴设备

本参考文档聚焦 SLE。如果你的应用场景是鼠标、键盘、传感器上报、固件升级等短距交互场景,SLE 是最适合的选择。


SLE 的通信模型

理解 SLE 的工作方式,可以从一组具体的通信场景入手。以最常见的"鼠标连接电脑"为例:

sequenceDiagram
    participant M as 鼠标
    participant C as 电脑

    M->>C: 广播(我是SLE鼠标)
    C->>M: 连接请求
    M-->>C: 连接建立

    C->>M: 发现HID服务
    loop 鼠标移动/点击
        M->>C: 推送按键/位移/滚轮
    end

通信过程分为四个阶段:

第一阶段:发现。 鼠标上电后,不断向外发送广播包。电脑打开扫描搜索周边设备。当电脑收到鼠标的广播包时就发现了鼠标。

第二阶段:连接。 电脑向鼠标发起连接请求,双方建立一条专用的 ACL 通信通道。

第三阶段:服务交互。 鼠标通过 SLE 定义 HID 服务,包含按键状态、X/Y 轴位移、滚轮值等属性。电脑发现服务后订阅属性——鼠标移动时通过 Notify 推送数据给电脑。

第四阶段:持续维护。 双方根据需要调整连接参数(静止时省电/移动时提速)、切换 PHY 模式,断连后自动重连。

小结:SLE 通信 = 发现 → 连接 → 服务交互 → 持续维护,这是一个完整闭环。后续每一章的"场景"文档都是这个模型的展开。


SLE 协议栈结构

SLE 的软件实现是一个分层协议栈,从底层无线信号到上层应用数据,每一层承担不同的职责:

flowchart TD
    subgraph 应用层
        APP[应用层 Application<br/>HID 服务 / 传感器服务 / OTA 服务<br/>决定: 传什么数据]
    end

    subgraph 协议栈层
        SSAP[SSAP 服务访问协议<br/>Service-Property-Descriptor<br/>Read / Write / Notify / Indicate<br/>决定: 数据怎么组织 怎么访问]
        SMP[SMP 安全管理<br/>配对 绑定 链路加密<br/>保证数据不被窃听篡改]
        CHBA[CHBA IP 承载<br/>把 SLE 链路当网卡<br/>让设备通过 SLE 上网]
        CONN[连接管理 Connection<br/>建立 断开 参数协商<br/>最多 8 路并发<br/>决定: 和谁连 怎么连]
        DISC[设备发现 Discovery<br/>Announce 广播 / Seek 扫描<br/>决定: 谁在那里]
    end

    subgraph 物理层
        PHY[物理层 PHY<br/>1M / 2M / 4M 速率<br/>MCS 0~12 调制编码<br/>决定: 比特怎么在空中飞]
    end

    APP --> SSAP
    SSAP --> SMP
    SSAP --> CHBA
    SSAP --> CONN
    CONN --> DISC
    DISC --> PHY

初学者不需要一下记住所有层。开发时接触最多的是上面两层(应用层 + SSAP),下面四层由协议栈自动处理,你通过调用 API 和注册回调来使用它们。


核心概念

角色模型:G 和 T

SLE 把连接中的两个设备称为 G(Grant,授权端)T(Terminal,终端)

角色 职责 你会在哪里用到
G(Grant) 管理连接参数(间隔、延迟)、调度通信时隙 通常是电脑、手机、网关
T(Terminal) 被动接受 G 的调度安排 通常是鼠标、键盘、传感器

注意:G/T 和 Server/Client 是两套独立的概念。G/T 描述的是谁来管理连接,Server/Client 描述的是谁提供数据、谁消费数据。一个设备可以同时是 Server 和 Client,但在一对连接中只能是一种 G/T 角色。

设备发现:广播与扫描

SLE 设备在建立连接之前,需要通过"发现"找到彼此。发现分为两种行为:

  • Announce(广播):设备周期性地向外发送广播数据包,内容包括设备名称、地址、支持的服务 UUID 等。一个设备最多同时进行 16 路广播。广播有多种模式——可以声明自己"可连接"(等待别人连自己),也可以"仅广播"(只宣告存在,不接受连接)。
  • Seek(扫描):设备在指定 PHY 信道上监听广播包。扫描到广播后,解析出对方设备的信息,决定是否发起连接。

广播-扫描的典型流程:T 端广播 → G 端扫描 → G 端发现 T 端 → G 端发起连接 → G/T 角色协商 → 连接建立。

SSAP:数据如何组织和访问

SSAP(SLE Service Access Protocol) 是 SLE 最核心的上层协议,定义了设备之间如何组织和访问数据。它采用 Service → Property → Descriptor 三级结构:

Service(服务)                 ← 一个"功能模块"
  ├── Property(属性)           ← 一个"数据项"(带读/写权限)
  │     ├── Value               ← 数据本身
  │     └── Descriptor(描述符) ← 属性的元信息
  │           ├── 用户描述       ← "这是干什么的"(给用户看的文字)
  │           └── 客户端配置     ← 客户端是否订阅了通知
  └── Property
        └── ...

以一个温度传感器为例:

层级 实际内容
Service "环境监测服务"(UUID: 0000181A-...
Property 1 "当前温度" — 值: 26.5℃,权限: 只读 + 支持通知
Property 2 "上报间隔" — 值: 5000ms,权限: 可读可写
Descriptor (P1) 用户描述: "温度值,单位摄氏度"

数据交互有五种操作类型:

操作 谁发起 说明 举例
Read Client Client 向 Server 请求读取某个属性的值,Server 返回数据 电脑读取传感器的"当前温度"
Write Req Client Client 向 Server 写入数据,Server 处理后返回确认 电脑修改传感器的"上报间隔"为 10s
Write Cmd Client Client 向 Server 写入数据,不等待确认(更快但不可靠) 快速连续下发配置,丢一两条无所谓
Notify Server Server 主动推送数据给 Client,不需要 Client 确认 传感器每 5s 上报一次温度值
Indicate Server Server 主动推送数据给 Client,Client 必须回复确认 传感器检测到异常高温,必须确保电脑收到

每个 Property 通过权限位控制访问规则:

SSAP_PERMISSION_READ              = 1    // 允许读取
SSAP_PERMISSION_WRITE             = 2    // 允许写入
SSAP_PERMISSION_ENCRYPTION_NEED   = 4    // 需要链路加密
SSAP_PERMISSION_AUTHENTICATION_NEED = 8  // 需要设备认证
SSAP_PERMISSION_AUTHORIZATION_NEED = 16 // 需要用户授权

权限可以组合使用。例如 READ | WRITE | ENCRYPTION_NEED 表示属性可读可写,但必须在加密链路上操作。

连接管理

连接建立后,协议栈提供一套 API 来管理连接的状态和质量:

  • 连接参数 — 三个核心参数:连接间隔(多久收发一次数据)、延迟(可以跳过多少个间隔)、监管超时(多久没收到数据算断开)。这三个参数共同决定了功耗和响应速度的平衡。
  • PHY 切换 — SLE 支持 1M、2M、4M 三种 PHY 速率。高速率传得快但抗干扰能力弱,低速率传得慢但更稳定。可以运行时动态切换。
  • MCS(调制编码方案) — MCS 0~12,数字越大速率越高但对信号质量要求越苛刻。可以把它理解为"档位"——好信号用高档,差信号降档保稳定。
  • RSSI(信号强度) — 读取当前连接的接收信号强度指示,单位 dBm。可用于距离估算,但受环境多径、遮挡等因素影响,精度有限。
  • 多连接 — WS63 最多同时维持 8 路 SLE 连接,通过 conn_id 区分不同设备。
  • 断开与重连 — 断开可能是主动的(本地调用 disconnect)或被动的(对端断开、超时、走出范围)。断开后可以按固定间隔或指数退避策略尝试重连。

配对与安全

SLE 的安全机制分为多个层次,按使用顺序排列:

层次 做什么 使用的算法
配对 两台设备首次建立信任关系,交换密钥材料 Just Works(无界面设备)/ Passkey(输入 PIN 码)
绑定 将配对产生的密钥保存到 NV(非易失存储),下次连接无需重新配对 绑定信息存储在 Flash 中
链路加密 对链路层所有数据进行加密,防止空中嗅探 AC1 / AC2(认证加密)
属性加密 对特定 SSAP 属性做加密和完整性校验,粒度更细 EA1 / EA2

初学者最常见的使用路径:配对(sle_pair_remote_device)→ 绑定(自动,协议栈处理)→ 加密通信(自动,链路层处理)。你只需要调用配对 API 并处理回调,其余由协议栈自动完成。


SLE 还能做什么

除了基础的数据读写和通知推送,SLE 还提供了几个进阶能力:

CHBA — 让设备通过 SLE 上网

CHBA(Converged Host Bus Adapter) 把 SLE 链路虚拟成一张网卡。一旦虚拟网卡建立,上层 TCP/IP 协议栈(lwIP)就能通过 SLE 链路收发 IP 数据包。支持两种模式:
- AP 模式:设备作为热点,其他设备通过 SLE 接入上网
- STA 模式:设备作为终端,通过 SLE 连接到网关上网

Low Latency — 极限低延迟调度

SLE 提供专门的低延迟调度模式,将数据上报频率提升到最高 8000Hz(即每 0.125ms 上报一次)。10 档可选速率:

模式 速率 间隔 适用
基础 125Hz 8ms 普通办公鼠标
低延迟 500Hz 2ms 游戏外设入门
高速 1KHz / 2KHz 1ms / 0.5ms 高性能游戏鼠标/手柄
极限 4KHz / 8KHz 0.25ms / 0.125ms 竞技级外设

OTA — 固件无线升级

SLE 内置 OTA Service,可通过 SLE 链路将新固件传输到设备端。传输过程支持分片、校验和状态机管理,升级失败时可以回滚到旧版本。

HADM — 高精度测距

HADM(High Accuracy Distance Measurement) 基于 Channel Sounding 技术,通过收发双方交换 IQ 数据来计算无线信号的飞行时间(ToF),从而估算两台设备之间的距离。精度远超传统 RSSI 测距。

射频测试

产线和认证场景下,可以通过 sle_factory_manager 让设备进入定频发射/接收模式。可自由配置频率、功率、PHY、调制方式、导频比例和发射间隔。


开发模型

回调驱动模式

SLE 的 API 设计遵循回调驱动(Callback-driven) 模式。这意味着:

  • 你调用 API 发起一个操作(比如发起连接)
  • 操作在后台异步执行
  • 操作完成后,协议栈调用你提前注册的回调函数通知结果

这种模式适合嵌入式环境——不会阻塞主线程,多个操作可以并发进行。

// 1. 定义回调函数
void my_connect_cb(int conn_id, const sle_addr_t *addr,
                   sle_acb_state_t state, sle_pair_state_t pair_state,
                   sle_disc_reason_t reason) {
    if (state == SLE_ACB_STATE_CONNECTED) {
        // 连接成功!可以做后续操作了
    }
}

// 2. 提前注册回调
sle_connection_callbacks_t cbs = { .connect_state_changed_cb = my_connect_cb };
sle_connection_register_callbacks(&cbs);

// 3. 发起连接(异步)
sle_connect_remote_device(&peer_addr);
// 函数立即返回,连接结果通过上面的 my_connect_cb 通知

Server 开发:5 步建立数据提供方

Server 是"提供数据的一方"。典型开发流程:

// Step 1: 注册 Server — 向协议栈申请一个 Server 身份
uint8_t server_id;
ssaps_register_server(&app_uuid, &server_id);

// Step 2: 添加 Service — 定义你提供什么功能
uint16_t service_handle;
ssaps_add_service_sync(server_id, &service_uuid, true, &service_handle);

// Step 3: 添加 Property — 定义功能中的数据项
ssaps_property_info_t prop = {
    .uuid = { .len = 2, .uuid = {0x2A, 0x1F} },  // 温度属性
    .permissions = SSAP_PERMISSION_READ | SSAP_PERMISSION_WRITE,
    .operate_indication = SSAP_OPERATE_INDICATION_BIT_READ
                        | SSAP_OPERATE_INDICATION_BIT_NOTIFY,
    .value_len = 2,
    .value = initial_value,
};
ssaps_add_property_sync(server_id, service_handle, &prop, &prop_handle);

// Step 4: 启动 Service — 让服务对外可见
ssaps_start_service(server_id, service_handle);

// Step 5: 开始广播 — 宣告自己的存在
sle_announce_param_t param = { /* 广播间隔、PHY、数据内容 */ };
sle_set_announce_param(0, &param);
sle_start_announce(0);

Client 开发:6 步建立数据消费方

Client 是"消费数据的一方"。典型开发流程:

// Step 1: 注册 Client
uint8_t client_id;
ssapc_register_client(&app_uuid, &client_id);

// Step 2: 开始扫描
sle_seek_param_t seek_param = { /* 扫描 PHY、过滤策略 */ };
sle_set_seek_param(&seek_param);
sle_start_seek();

// Step 3: 发现目标后建立连接
// 在 seek_result_cb 回调中拿到设备地址后:
sle_connect_remote_device(&target_addr);

// Step 4: 连接成功后,发现对方的服务
// 在 connect_state_changed_cb 回调中确认连接后:
ssapc_find_structure_param_t param = {
    .type = SSAP_FIND_TYPE_PRIMARY_SERVICE,
    .start_hdl = 1, .end_hdl = 0xFFFF
};
ssapc_find_structure(client_id, conn_id, &param);

// Step 5: 发现服务后,读写属性
// 在 find_structure_cb 回调中拿到 service/property 信息后:
ssapc_write_param_t wparam = { .handle = prop_handle, .type = 0, .data = buf, .data_len = len };
ssapc_write_req(client_id, conn_id, &wparam);
ssapc_read_req(client_id, conn_id, prop_handle, 0);

// Step 6: 接收 Server 主动推送的数据
// 在 notification_cb / indication_cb 回调中接收数据

回调注册一览

协议栈的各子模块采用统一的回调注册模式:

// 连接状态变化、参数更新、配对结果、RSSI 读数
sle_connection_register_callbacks(&conn_cbs);

// 广播启用/停用、扫描结果
sle_announce_seek_register_callbacks(&announce_seek_cbs);

// SSAP Server:读请求、写请求、通知发送结果
ssaps_register_callbacks(&server_cbs);

// SSAP Client:发现完成、读完成、写确认、收到通知/指示
ssapc_register_callbacks(&client_cbs);

理解回调驱动是 SLE 开发的关键。不要试图在调用 API 后轮询等待结果——把后续操作写在对应的回调函数中。


WS63 芯片 SLE 能力规格

以下规格适用于 WS63 / WS63E 芯片,使用前请确认你的 SDK 版本。

物理层

参数 规格
PHY 模式 1M / 2M / 4M
Radio Frame Type Type 1 / Type 2 / Type 3(M0~M5) / Type 4(M0~M5)
MCS(调制编码方案) 0 ~ 12
调制方式 GFSK / QPSK / 8PSK
导频密度 4:1 / 8:1 / 16:1 / 无导频
最大发射功率 +20 dBm
功率可调范围 -127 ~ +20 dBm

链路层

参数 规格
最大并发连接数 8
最大并发广播数 16
设备地址类型 Public(固定,0)/ Random(随机,6)
连接间隔范围 12.5ms ~ 2s(步进 1.25ms)
监管超时范围 100ms ~ 32s(步进 10ms)

低延迟调度

速率 上报间隔 典型场景
125Hz 8ms 普通办公外设
500Hz 2ms 入门游戏外设
1KHz 1ms 游戏手柄
2KHz 0.5ms 高性能游戏鼠标
4KHz 0.25ms 电竞级外设
8KHz 0.125ms 极限低延迟,对信号质量要求最高

加密算法

算法 类型 用途
AC1 / AC2 认证加密算法 链路层数据加密与完整性认证
EA1 / EA2 加密算法 SSAP 属性级加密
HA1 / HA2 密钥派生算法 从配对密钥派生会话密钥