HiSpark编程指南

- 调测资料
  - SDK Sample使用指南
    - 前言
    - 概述
    - Sample框架
    - 外设 Sample
    - SLE UART Sample
    - SLE UART DMA Sample
    - SLE Mouse Sample
    - SLE amic vdt with dongle
    - SLE microphone
    - SLE measure dis
    - BLE Lowpower Sample
    - BLE UART Sample
    - BLE Keyboard Sample
    - BLE SLE TAG Sample
    - BLE Mouse Sample
    - USB Keyboard Sample
    - USB Mouse Sample
    - USB AMIC VDT Sample
    - RCU
    - 多连接
    - air mouse
    - SLE MOUSE with Dongle
    - SLE OTA dongle
    - game mouse
    - BLE UUID
    - 缩略语
  - SDK二次开发网络安全注意事项
    - 前言
    - 产品安全解决方案
    - 结论
  - SDK开发环境搭建用户指南
    - 前言
    - 开发环境搭建
    - 编译SDK
    - 新建APP
  - 内存维测指导书
    - 前言
    - 简介
    - 内存维测功能
  - 射频AT测试指南
    - 前言
    - 射频测试AT指令
    - AT指令组包示例
    - 注意事项
  - 维测指导书
    - 前言
    - 概述
    - 日志说明
    - 日志分析
    - 问题定位
    - 典型案例
    - 常见问题FAQ
- 软件资料
  - AT命令使用指南
    - 前言
    - 指令说明
    - 通用AT指令
    - BT业务AT指令
    - 新增AT指令方法
  - DFU升级APK开发指南
    - 前言
    - 功能特性
    - 系统框架
    - 工程文件部署
    - 界面实现
    - 升级界面Fragment实现
    - 关于界面Fragment实现
    - 应用清单AndroidManifest
  - DFX软件开发指南
    - 前言
    - DIAG维测功能
    - 死机诊断
    - Dump解析
  - EFUSE使用指南
    - 前言
    - 概述
    - 使用软件接口读写EFUSE
    - 使用BurnTool烧写EFUSE
  - NFC TAG软件开发指导书
    - 前言
    - 概述
    - 开发指导
  - NV存储用户指南
    - 前言
    - NV简介
    - NV编译预置
    - NV API指南
    - 定制化NV结构使用介绍
    - 通过NV自定义传输数据最大长度
  - Release notes
    - 1.0.18版本描述文件
    - 1.0.17版本描述文件
    - 1.0.16版本描述文件
  - SDK开发指南
    - 前言
    - 概述
    - 系统接口
  - SDK接口变更说明书
    - 前言
    - BLE SDK接口变更说明
  - SP31 SLP使用指南
    - 开源版本
  - USB HID复合设备开发指南
    - 前言
    - 概述
    - 实现方式
  - 代码框架说明
    - 前言
    - SDK模块框架
    - SDK目录结构
    - SDK目录说明
  - 低功耗FAQ
    - 前言
    - 系统无法睡眠
    - IO无法唤醒系统
    - 唤醒后外设异常
    - 低功耗导致OTA升级异常
    - 功耗比预期高
    - 锁中断导致BT业务阻塞
    - 概率性狗超时
    - 供电模式&软件配置
    - 提前唤醒时间问题
  - 低功耗sample使用指南
    - 前言
    - 编译&测试
    - 系统状态管理
    - 用户指南
  - 低功耗开发指南
    - 前言
    - 低功耗概述
    - 低功耗方案
    - 开发指引
    - 功耗优化
    - 常见问题
  - 功率配置说明书
    - 前言
    - 射频功率配置说明
  - 升级方案使用指南
    - 前言
    - 概述
    - 升级包制作
    - 升级包传输
    - 升级包保存
    - 升级包本地升级
    - FAQ
  - 快速入门指南
    - 前言
    - 文档目录
    - 环境搭建
    - 基础功能开发
    - 调优
    - 特性开发
    - 测试报告
  - 星闪应用层SLE-Link协议
    - 前言
    - 概述
    - SLE Frame格式定义
    - 服务接口定义
    - 交互流程示例
  - 星闪软件开发指导书
    - 前言
    - 概述
    - Device Discovery接口
    - Connection Manager接口
    - SSAP Server接口
    - SSAP client接口
    - Low Latency接口
    - Transmission Manager接口
    - SLE Passkey接口
    - SLE Channel Map 接口
  - 红外学习使用指南
    - 前言
    - 红外学习方式
    - 通过比较器进行红外学习
    - 使用指南
  - 蓝牙软件开发指导书
    - 前言
    - 概述
    - GAP接口
    - GATT server接口
    - GATT client接口
  - 设备驱动开发指南
    - 前言
    - Pinctrl
    - GPIO
    - UART
    - SPI
    - I2C
    - ADC
    - DMA
    - PWM
    - WDT
    - Timer
    - Systick
    - TCXO
    - Flash
    - SFC
    - QDEC
    - KEYSCAN
    - PDM
    - USB_HID
    - USB_DFU
    - I2S
    - TRNG
    - 附：MIDDLEWARE
  - 音频编解码开发指导书
    - 前言
    - 概述
    - Audio Encoder
    - Audio Decoder
    - 调试与功能
- 工具资料
  - BurnTool工具使用指导书
    - 前言
    - BurnTool工具简介
    - 操作指南
    - FAQ
  - HiSpark Studio使用指南
    - 前言
    - 工具简介
    - 开发环境搭建
    - 工程管理
    - 工程配置
    - 编译运行
    - 软件包烧录
    - 栈分析和镜像分析
    - 工程调试
    - 串口控制台工具
    - Kconfig配置
    - GUI工程创建与使用
    - 高阶分析功能使用
    - 常见错误

### 该页内容

- 前言
- 概述
  - 背景
  - 需求
- SLE Frame格式定义
  - SLE Frame格式定义
    - Header
    - Service ID
    - Command ID
    - TLV格式
    - 通用错误码
    - MIC校验
    - Frame合法性原则
      - 接收Frame Request
      - 接收Frame Response
- 服务接口定义
  - Device Discovery Service
    - 使能SLE
    - 去使能SLE
    - 设置本地设备地址
    - 获取本地设备地址
    - 设置本地设备名称
    - 获取本地设备名称
    - 设置设备公开数据
    - 设置设备公开参数
    - 开始设备公开
    - 结束设备公开
    - 设置设备扫描参数
    - 上报设备扫描结果
    - 开始设备扫描
    - 停止设备扫描
  - Connection Management Service
    - 发送链接请求
    - 断开链接请求
    - 更新链接参数请求
    - 发送配对请求
    - 删除配对
    - 删除所有配对
    - 获取配对设备数量
    - 获取配对设备
    - 获取配对状态
    - 读取对端设备RSSI值
    - 设置ACB链路参数
    - 设置PHY参数
    - 设置最大功率
    - 发送链接管理能力查询请求
    - 断开所有链接
    - 获取绑定设备
    - 设置调制与编码策略
    - 设置最大payload字节数
    - 发送连接状态查询请求
  - SSAP Client Service
    - 注册SSAP客户端
    - 注销SSAP客户端
    - 查找服务、特征、描述符
    - 发起按照UUID读取请求
    - 发起按照句柄读取请求
    - 发起写请求
    - 发起写命令
    - 发送交换info请求
  - SSAP Server Service
    - 注册SSAP服务端
    - 注销SSAP服务端
    - 异步添加SSAP服务
    - 异步添加SSAP属性
    - 异步添加SSAP描述
    - 同步添加SSAP服务
    - 同步添加SSAP属性
    - 同步添加SSAP描述
    - 开始SSAP服务
    - 删除所有SSAP服务
    - 发送SSAP响应
    - 发送通知或指示
    - 通过UUID发送通知或指示
    - 设置服务端info
  - Factory Test Service
    - 打开射频发送
    - 打开射频接收
    - 关闭射频收发
    - 重置射频收发
    - 设置RSSI阈值
  - Low Latency Service
    - 低延时鼠标侧使能
    - 低延时Dongle侧使能
    - 低延时参数设置
- 交互流程示例

# 前言

概述

本文档介绍应用层相关协议，用于指导客户开发。

读者对象

本文档主要适用于以下工程师：

- 软件开发工程师

符号约定

在本文中可能出现下列标志，它们所代表的含义如下。

符号 | 说明
--- | ---
| 表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。
| 表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。
| 表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。
| 用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。
| 对正文中重点信息的补充说明。 “说明”不是安全警示信息，不涉及人身、设备及环境伤害信息。

修改记录

文档版本 | 发布日期 | 修改说明
--- | --- | ---
01 | 2024-07-04 | 第一次正式版本发布。

# 概述

## 背景

星闪协议要求从机与主机侧交互时，从机和主机侧都搭配星闪芯片。多数场景下，主机侧的星闪芯片只作为桥片使用星闪的controller功能，星闪host部署在主SOC上。但在某些应用场景下，主机侧的星闪芯片需要使用芯片自带的星闪Host，不再作为桥片。为了实现主机SOC应用层与星闪芯片内host之间的交互，需要有对应的协议传输指令和数据。

## 需求

为支撑星闪芯片内host与主机SOC应用层之间进行消息交互，需要在应用层定义新的协议，简称SLE-Link协议。

# SLE Frame格式定义

SLE-Link协议定义了新的SLE Frame格式，格式如下：

## SLE Frame格式定义

注意： Service ID和Command ID使用0作为非法值

字段 | 长度 | 含义
--- | --- | ---
Flag | 1Byte | Flag为固定值，作为星闪消息数据域的识别符，1字节。
Version | 1Byte | Version表示对应的软件版本信息，根据需要添加，1字节。
Total Frame | 1Byte | 表示总包数。
Frame Seq | 1Byte | 表示包序号。
Rsv | 1Byte | 保留字段，便于拓展。
Service ID | 1Byte | 每个报文所属的业务类型，比如：设备发现，连接管理，OTA服务等。
CommandID | 1Byte | 每个业务类型下的具体操作，比如：建立连接，断开连接、参数更新。
BodyLen | 2Byte | 指示后续body部分的数据长度。
Body | Variable Byte | 实际数据，以TLV格式，可以存放多个TLV。
MIC | 2Byte | Message Integrity Check，消息完整性校验，采用CRC算法。对前面所有数据生成校验结果。

### Header

Flag固定值：取值为0x1F。

Version：表示对应的软件版本信息。

Total Frame：表示总包数，不分包，该字段为1；如果分包，则该字段≥2。

Frame Seq：如果不分包则置为0，如果需要分包则该字段为帧序号，从1开始依次添加。

### Service ID

Service ID：占1字节，用于标识服务类型。取值0~255，每个Service ID固定从1开始编号。

Service ID定义如下表。

为了避免各个领域和产品型态的Service ID冲突，将Service ID进行统一划分：

Service ID | Service Name | Description
--- | --- | ---
0x01 | Device Discovery Service | 设备发现。
0x02 | Connection Management Service | 连接管理。
0x03 | SSAP Client Service | SSAP Client服务。
0x04 | SSAP Server Service | SSAP Server服务。
0x05 | Factory Test Service | 产测模式。
0x06 | Low Latency Service | 低延时模式。

### Command ID

Command ID：占1字节，用于标识具体命令类型，每个Service ID对应的Command ID都从1开始，表明真实的逻辑行为，具体的Command ID说明在后续的服务接口定义中详细介绍。

### TLV格式

TLVs封装消息中的具体信息。一个Payload的body下可以对应多个TLV。

- Type：占用1个字节，表示消息类型，取值0~255。其中0x00，0xFF不使用，0x7F固定用作错误码。

- Length：占用2个字节，表示后面value的长度，取值范围0~65535。当Length为0时，表明Value不存在。

- Value：为具体的数据。

注：简化处理，不支持Type下再挂子节点。

### 通用错误码

通用错误码Type值为127，固定为1个字节。格式如下。

Error | 类别 | 描述
--- | --- | ---
0x00 | 通用错误 | 成功。
0x01 | 未知error类型。
0x02 | 不支持该请求。
0x03 | 无权限。
0x04 | 系统忙。
0x05 | 请求格式错误。
0x06 | 参数错误。
0x07 | 申请内存失败。
0x08 | 响应超时。

### MIC校验

发送端和接收端，都采用相同的算法进行校验证，接收到当检测到计算出来的MIC与发送端携带的MIC不同时，认为数据不合法，直接丢弃。

MIC采用CRC-16，算法名称：CRC-16/XMODEM，多项式poly：0x1021

### Frame合法性原则

#### 接收Frame Request

Device侧检查DATA内容，Header是0x1F，且对MIC前的所有字段做校验，得到的结果与MIC的2个字节相同，则认为是合法的SLE Frame消息。

#### 接收Frame Response

Host侧检查DATA内容，Header是0x1F, 且对MIC前的所有字段做校验，得到的结果与MIC的2个字节相同，则认为是合法的SLE Frame消息。

# 服务接口定义

## Device Discovery Service

### 使能SLE

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x01 | 使能SLE协议栈

TLV参数：

无

### 去使能SLE

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x02 | 去使能SLE协议栈

TLV参数：

无

### 设置本地设备地址

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x03 | 去使能SLE协议栈

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value 数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char

### 获取本地设备地址

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x04 | 获取本地设备地址

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value 数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char

### 设置本地设备名称

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x05 | 设置本地设备名称

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
name | 0x01 | 1 | uint8
len | 0x02 | 1 | uint8

### 获取本地设备名称

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x06 | 获取本地设备名称

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
name | 0x01 | 1 | uint8
len | 0x02 | 1 | uint8

### 设置设备公开数据

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x07 | 设置设备公开数据

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
announce_id | 0x01 | 1 | uint8
announce_data_len | 0x02 | 2 | uint16_t
seek_rsp_data_len | 0x03 | 2 | uint16_t
announce_data | 0x04 | 1 | uint8_t
seek_rsp_data | 0x05 | 1 | uint8_t

### 设置设备公开参数

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x08 | 设置设备公开参数

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
announce_id | 0x01 | 1 | uint8
announce_handle | 0x02 | 1 | uint16
announce_mode | 0x03 | 1 | uint16
announce_gt_role | 0x04 | 1 | uint8
announce_level | 0x05 | 1 | uint8
announce_interval_min | 0x06 | 4 | uint32
announce_interval_max | 0x07 | 4 | uint32
announce_channel_map | 0x08 | 1 | uint8
announce_tx_power | 0x09 | 1 | uint8
own_addr_type | 0x0A | 1 | uint8
own_addr | 0x0B | 6 | unsigned char
peer_addr_type | 0x0C | 1 | uint8
peer_addr | 0x0D | 6 | unsigned char
conn_interval_min | 0x0E | 2 | uint16
conn_interval_max | 0x0F | 2 | uint16
conn_max_latency | 0x10 | 2 | uint16
conn_supervision_timeout | 0x11 | 2 | uint16

### 开始设备公开

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x09 | 开始设备公开

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
announce_id | 0x01 | 1 | uint8

### 结束设备公开

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x0A | 结束设备公开

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
announce_id | 0x01 | 1 | uint8

### 设置设备扫描参数

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x0B | 设置设备扫描参数

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
own_addr_type | 0x01 | 1 | uint8
filter_duplicates | 0x02 | 1 | uint8
seek_filter_policy | 0x03 | 1 | uint8
seek_phys | 0x04 | 1 | uint8
seek_type | 0x05 | 3 | uint8
seek_interval | 0x06 | 6 | uint16
seek_window | 0x07 | 6 | uint16

### 上报设备扫描结果

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x0C | 上报设备扫描结果

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
event_type | 0x01 | 1 | uint8
addr_type | 0x02 | 1 | uint8
addr | 0x03 | 6 | unsigned char
direct_addr_type | 0x04 | 1 | uint8
direct_addr | 0x05 | 6 | unsigned char
rssi | 0x06 | 1 | uint8
data_status | 0x07 | 1 | uint8
data_lenth | 0x08 | 2 | uint8
data | 0x09 | n | uint8

### 开始设备扫描

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x0D | 开始设备扫描

TLV 参数：

无

### 停止设备扫描

Service ID | Comand ID | Description
--- | --- | ---
0x01 | 0x0E | 停止设备扫描

TLV 参数：

无

## Connection Management Service

### 发送链接请求

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x01 | 发送链接请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char

### 断开链接请求

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x02 | 断开链接请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char

### 更新链接参数请求

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x03 | 更新链接参数请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 2 | uint16
interval_min | 0x02 | 2 | uint16
interval_max | 0x03 | 2 | uint16
max_latency | 0x04 | 2 | uint16
supervision_timeout | 0x05 | 2 | uint16

### 发送配对请求

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x04 | 发送配对请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char

### 删除配对

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x05 | 删除配对

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char

### 删除所有配对

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x06 | 删除所有配对

TLV 参数：

无

### 获取配对设备数量

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x07 | 获取配对设备数量

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
number | 0x01 | 2 | uint16

### 获取配对设备

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x08 | 获取配对设备

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char
number | 0x03 | 2 | uint16

### 获取配对状态

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x09 | 获取配对状态

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char
state | 0x03 | 1 | uint8

### 读取对端设备RSSI值

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x0A | 读取对端设备RSSI值

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 2 | uint16

### 设置ACB链路参数

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x0B | 设置ACB链路参数

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 2 | uint16
evt_int | 0x02 | 2 | uint16
evt_num | 0x03 | 1 | uint8

### 设置PHY参数

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x0C | 设置PHY参数

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_hdl | 0x01 | 2 | uint16
tx_format | 0x02 | 1 | uint16
rx_format | 0x03 | 1 | uint8
tx_phy | 0x04 | 1 | uint8
rx_phy | 0x05 | 1 | uint8
tx_pilot_density | 0x06 | 1 | uint8
rx_pilot_density | 0x07 | 1 | uint8
g_feedback | 0x08 | 1 | uint8
t_feedback | 0x09 | 1 | uint8

### 设置最大功率

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x0D | 设置最大功率

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
ble_pwr | 0x01 | 1 | uint8
sle_pwr | 0x02 | 1 | uint8

### 发送链接管理能力查询请求

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x0E | 发送链接管理能力查询请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 1 | uint16
relay_capability | 0x02 | 1bit | uint32
trans_mode | 0x03 | 1bit | uint32
measurement_capability | 0x04 | 1bit | uint32
access_slb | 0x05 | 1bit | uint32
access_sle | 0x06 | 1bit | uint32
mtu | 0x07 | 1bit | uint32
mps | 0x08 | 1bit | uint32
reserve | 0x09 | 25bit | uint32

### 断开所有链接

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x0F | 断开所有链接

TLV 参数：

空

### 获取绑定设备

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x010 | 获取绑定设备

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
type | 0x01 | 1 | uint8
addr | 0x02 | 6 | usigned char
number | 0x03 | 2 | uint16

### 设置调制与编码策略

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x11 | 设置MCS

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 2 | uint16
mcs | 0x02 | 1 | uint8

### 设置最大payload字节数

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x12 | 设置最大payload

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 2 | uint16
tx_octets | 0x02 | 2 | uint16

### 发送连接状态查询请求

Service ID | Comand ID | Description
--- | --- | ---
0x02 | 0x13 | 发送连接状态查询请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value 数据类型
--- | --- | --- | ---
conn_status | 0x01 | 1 | uint8

## SSAP Client Service

### 注册SSAP客户端

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x01 | 注册SSAP客户端

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
len | 0x01 | 1 | uint8
uuid | 0x02 | 16 | uint8
client_id | 0x03 | 1 | uint8

### 注销SSAP客户端

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x02 | 注销SSAP客户端

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8

### 查找服务、特征、描述符

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x03 | 查找服务、特征、描述符

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
type | 0x03 | 1 | uint8
start_hdl | 0x04 | 2 | uint16
end_hdl | 0x05 | 2 | uint16
len | 0x06 | 1 | uint8
uuid | 0x07 | 16 | uint8
reserve | 0x08 | 1 | uint8

### 发起按照UUID读取请求

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x04 | 发起按照UUID读取请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
type | 0x03 | 1 | uint8
start_hdl | 0x04 | 2 | uint16
end_hdl | 0x05 | 2 | uint16
len | 0x06 | 1 | uint8
uuid | 0x07 | 16 | uint8

### 发起按照句柄读取请求

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x05 | 发起按照句柄读取请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
handle | 0x03 | 2 | uint16
type | 0x04 | 1 | uint8

### 发起写请求

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x06 | 发起写请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
handle | 0x03 | 2 | uint16
type | 0x04 | 1 | uint8
data_len | 0x05 | 2 | uint16
data | 0x06 | 1 | uint8

### 发起写命令

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x07 | 发起写命令

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
handle | 0x03 | 2 | uint16
type | 0x04 | 1 | uint8
data_len | 0x05 | 2 | uint16
data | 0x06 | 1 | uint8

### 发送交换info请求

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x08 | 发送交换info请求

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
client_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
mtu_size | 0x03 | 4 | uint32
version | 0x04 | 2 | uint16

## SSAP Server Service

### 注册SSAP服务端

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x01 | 注册SSAP服务端

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
len | 0x01 | 1 | uint8
uuid | 0x02 | 16 | uint8
server_id | 0x03 | 1 | uint8

### 注销SSAP服务端

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x02 | 注销SSAP服务端

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8

### 异步添加SSAP服务

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x03 | 异步添加SSAP服务

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
len | 0x02 | 1 | uint8
uuid | 0x03 | 16 | uint8
is_primary | 0x04 | 1 | bool

### 异步添加SSAP属性

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x04 | 异步添加SSAP属性

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
service_handle | 0x02 | 2 | uint16
len | 0x02 | 1 | uint8
uuid | 0x03 | 16 | uint8
permissions | 0x04 | 2 | uint16
operate_indication | 0x05 | 4 | uint32
value_len | 0x06 | 2 | uint16
value | 0x07 | 1 | uint8

### 异步添加SSAP描述

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x05 | 异步添加SSAP描述

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
service_handle | 0x02 | 2 | uint16
property_handle | 0x03 | 2 | uint16
len | 0x02 | 1 | uint8
uuid | 0x03 | 16 | uint8
permissions | 0x04 | 2 | uint16
operate_indication | 0x05 | 4 | uint32
type | 0x06 | 1 | uint8
value_len | 0x07 | 2 | uint16
value | 0x08 | 1 | uint8

### 同步添加SSAP服务

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x06 | 同步添加SSAP服务

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
len | 0x02 | 1 | uint8
uuid | 0x03 | 16 | uint8
is_primary | 0x04 | 1 | bool
handle | 0x05 | 2 | uint16

### 同步添加SSAP属性

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x07 | 同步添加SSAP属性

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
service_handle | 0x02 | 2 | uint16
len | 0x02 | 1 | uint8
uuid | 0x03 | 16 | uint8
permissions | 0x04 | 2 | uint16
operate_indication | 0x05 | 4 | uint32
value_len | 0x06 | 2 | uint16
value | 0x07 | 1 | uint8
handle | 0x05 | 2 | uint16

### 同步添加SSAP描述

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x08 | 同步添加SSAP描述

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
service_handle | 0x02 | 2 | uint16
property_handle | 0x03 | 2 | uint16
len | 0x02 | 1 | uint8
uuid | 0x03 | 16 | uint8
permissions | 0x04 | 2 | uint16
operate_indication | 0x05 | 4 | uint32
type | 0x06 | 1 | uint8
value_len | 0x07 | 2 | uint16
value | 0x08 | 1 | uint8

### 开始SSAP服务

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x09 | 开始SSAP服务

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
service_handle | 0x02 | 2 | uint16

### 删除所有SSAP服务

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x0A | 删除所有SSAP服务

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8

### 发送SSAP响应

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x0B | 发送SSAP响应

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
request_id | 0x03 | 2 | uint16
status | 0x04 | 1 | uint8
value_len | 0x05 | 2 | uint16
value | 0x06 | 1 | uint8

### 发送通知或指示

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x0C | 发送通知或指示

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
handle | 0x03 | 2 | uint16
type | 0x04 | 1 | uint8
value_len | 0x05 | 2 | uint16
value | 0x06 | 1 | uint8

### 通过UUID发送通知或指示

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x0D | 通过UUID发送通知或指示

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
conn_id | 0x02 | 2 | uint16
len | 0x03 | 1 | uint8
uuid | 0x04 | 16 | uint8
start_handle | 0x05 | 2 | uint16
end_handle | 0x06 | 2 | uint16
type | 0x07 | 1 | uint8
value_len | 0x08 | 2 | uint16
value | 0x09 | 1 | uint8

### 设置服务端info

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x0E | 设置服务端info

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
server_id | 0x01 | 1 | uint8
mtu_size | 0x02 | 4 | uint32
version | 0x03 | 2 | uint16

## Factory Test Service

### 打开射频发送

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x01 | 打开射频发送

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
tx_freq | 0x01 | 1 | uint8
tx_power | 0x02 | 1 | uint8
test_data_len | 0x03 | 2 | uint16
pk_payload_type | 0x04 | 1 | uint8
tx_phy | 0x05 | 1 | uint8
tx_format | 0x06 | 1 | uint8
tx_rate | 0x07 | 1 | uint8
tx_pilot_ratio | 0x08 | 1 | uint8
tx_polar_r | 0x09 | 1 | uint8
tx_interval | 0x0A | 2 | uint16

### 打开射频接收

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x02 | 打开射频接收

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
rx_freq | 0x01 | 1 | uint8
rx_phy | 0x02 | 1 | uint8
rx_format | 0x03 | 1 | uint8
rx_pilot_ratio | 0x04 | 1 | uint8
rx_interval | 0x05 | 2 | uint16

### 关闭射频收发

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x03 | 关闭射频收发

TLV 参数：

无

### 重置射频收发

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x04 | 重置射频收发

TLV 参数：

无

### 设置RSSI阈值

Service ID | Comand ID | Description
--- | --- | ---
0x03 | 0x05 | 设置RSSI阈值

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
rssi_sheld | 0x01 | 1 | uint8

## Low Latency Service

### 低延时鼠标侧使能

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x01 | 低延时鼠标侧使能

TLV 参数：

无

### 低延时Dongle侧使能

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x02 | 低延时Dongle侧使能

TLV 参数：

无

### 低延时参数设置

Service ID | Comand ID | Description
--- | --- | ---
0x04 | 0x03 | 低延时参数设置

TLV 参数：

字段名称 | Type(bit0~bit6) | Length Size(Oct) | Value数据类型
--- | --- | --- | ---
conn_id | 0x01 | 2 | uint16
enable | 0x02 | 1 | uint8
rate | 0x03 | 1 | uint8

# 交互流程示例

以SSAP交互流程为例，流程图如图1所示。

图 1 交互流程图