协议基础与公共规范
概述
本指南定义穿戴类产品对外交互的数据格式和处理要求,覆盖协议分层、链路层帧格式、业务层公共规范,以及设备、升级、助听、文件、设置、维测、手机互联和组网设备等业务命令。
协议架构
穿戴系列产品对外的数据和命令交互一共可以分为三层:业务层、链路层和物理层。
图 1 协议上下文

- 业务层:由各个业务模块组成,对外信息交互的主要实体,包括数据打包、解析、命令处理、结果响应以及处理链路层的状态。
- 链路层:链路的连接管理、能力同步、业务层数据包的分割、重组及安全性检查等。
- 物理层:连接状态同步、收发的接口、MTU等。
业务导航
| 业务域 | Model ID/标识 | 主要能力 | 章节入口 |
|---|---|---|---|
| 设备、升级与助听 | 1~4 | 设备状态、OTA、助听业务和助听参数 | 设备、升级与助听业务 |
| 文件、设置与维测 | 5~12 | 可维可测、文件传输、设备设置及 MCU、BT、Media、Graphic、Audio 维测 | 文件、设置与维测业务 |
| 手机互联与智能应用 | 13 | 消息中心、手机互联、应用与表盘业务 | 手机互联与智能应用业务 |
| 组网设备 | 14 | 组网设备状态查询与参数设置 | 组网设备业务 |
相关 SDK 定义:
链路层协议
链路层简介
数据链路层的传输单元是帧(Frame),每个Frame的最大传输能力由MFS(Max Frame Size)决定。MFS通过应用层命令进行协商。当一个应用层数据包的长度超过MFS时,数据链路层需要对数据包进行拆分,以满足Frame长度不超过MFS。由于驱动层承载能力的限制,Frame在驱动层传输时可能被物理层以MTU(Maximum Transmission Unit)为单位进一步拆分。
链路层功能
链路层主要提供如下功能:
- 从物理层(如:蓝牙协议栈)的字节流中摘出数据帧(Frame),即成帧动作。
- 承载业务层,对业务层数据包进行封装,并视需要进行拆分。
- 通过校验和对常规帧的基础安全性进行检查。
链路层通用帧格式定义
图 1 链路层通用帧格式

详细字段的描述如表1所示。
表 1 数据帧格式
区域 |
字段名称 |
字节数 |
M/O |
字段描述 |
|---|---|---|---|---|
Header |
SOF |
1 |
M |
Start Of Frame,标识数据帧的开始,当前版本固定值为0xAF。 |
CTRL |
1 |
M |
数据链路层控制选项,详细定义请参见“控制域CTRL”。 |
|
CTRL2 |
1 |
O |
数据链路层控制选项扩展字段,在CTRL字段最高位为1时生效。详细定义请参见“控制域CTRL”。 |
|
LEN |
2 |
M |
标识从FID字段到帧尾字段的长度,覆盖CRC和EOF字段。 |
|
FID |
1 |
O |
领域ID:标记目的领域和源领域(高4bits为目的领域,低4bits为源领域),详细定义请参见“领域FID”。 |
|
SN |
1 |
O |
如果CTRL字段中设置了分帧标志,则在Header中必须携带SN(Sequence Number)字段,用以标识帧序列号。SN取值范围为[0,255]。 |
|
ECHO |
1 |
O |
向发送端回复响应。详细定义请参见“回复响应ECHO”。 |
|
Payload |
业务层数据载荷 |
|||
Footer |
CRC16 |
2 |
O |
CRC16字段,详细定义请参见“校验和CRC16”。 |
EOF |
1 |
O |
End Of Frame,标识数据帧的结束,当前版本固定值为0xFA。 |
|
控制域CTRL
表 1 控制域CTRL字段说明
| Bit | Name | 说明 |
|---|---|---|
| bit 7 | EN_EXTEND | • 置1,可选项中使能CTRL2字段。 • 置0,可选项中不使能CTRL2字段。 |
| bit 6 | EN_CRYPTO | • 置1,Payload为加密数据。 • 置0,Payload为不加密数据。 |
| bit 5 | EN_FULL_CRC | • 置1,CRC16覆盖从SOF到Payload域结束的空间。 • 置0,CRC16覆盖LEN之后(不含LEN)到Payload域结束的空间。 • 如果EN_CRC置0,本字段无效。 |
| bit 4 | EN_EOF | • 置1,可选项中使能EOF字段。 • 置0,可选项中不使能EOF字段。 |
| bit[3:2] | EN_SN | 分帧标志位域: • 00,表示本数据帧对应一个完整的业务层数据包,Header中不携带SN字段。 • 01,表示本数据帧对应一个业务层数据包的起始分帧,Header中携带SN字段对该帧进行编号。 • 10,表示本数据帧对应一个业务层数据包的过程分帧,Header中携带SN字段对该帧进行编号。 • 11,表示本数据帧对应一个业务层数据包的结束分帧,Header中携带SN字段对该帧进行编号。 |
| bit 1 | EN_FID | • 置1,可选项中使能FID字段。 • 置0,可选项中不使能FID字段。 |
| bit 0 | EN_CRC | • 置1,可选项中使能CRC16字段。 • 置0,可选项中不使能CRC16字段。 |
表 2 控制域CTRL2字段说明
| Bit | Name | 说明 |
|---|---|---|
| bit[7:2] | Reserved | 协议扩展保留位,默认置0。 |
| bit[1:0] | ACK_TYPE | 链路层请求对端确认标志位。 • 00:对端不需要回复链路层的响应对该帧进行确认。 • 01:对端需要回复一个链路层的响应对该帧进行确认。 • 11:该帧是一个链路层响应ECHO帧,用于向对端进行链路层的确认或者告知CRC校验错误。 注:如没有特殊理由不建议在链路层进行确认,因此默认置00。 |
领域FID
Field ID:占1个字节,标识帧的目标和源领域,用于帧在目标和源领域之间传输。
bit[7:4]:高4bit用于标记帧的目标领域。
bit[3:0]:低4bit用于标记帧的源领域。
为了避免各个领域和产品型态的Field ID冲突,对将要使用的Field ID进行划分如表1所示。
表 1 Field ID字段说明
| Value | Name | 说明 |
|---|---|---|
| 0x00 | 本地预留 | 内部处理预留。 |
| 0x01 | UART设备 | 用于UART通道的帧。 |
| 0x02 | MCU主控设备 | 用于标记MCU主控设备,如果是耳机目标领域本值则表示对耳设备。 |
| 0x03 | GATT设备 | 用于标记蓝牙GATT设备。 |
| 0x04 | SPP设备 | 用于标记蓝牙SPP设备。 |
| ….. | Reserved | 协议扩展保留值,最大0x0F;启用前需完成取值定义和申请。 |
回复响应ECHO
须知: 因为在链路层上对帧进行响应会降低传输效率,因此,请慎用!
当发送端将CTRL2字段中的ACK_TYPE值设置为01时,接收端在收到该帧后,需要向发送端回复一个链路层的响应帧进行确认,响应帧的CTRL2字段中ACK_TYPE值为11,并附带Echo字段,Echo字段值定义如表1所示。
表 1 Echo字段定义
| Echo | 说明 |
|---|---|
| 0 | CRC校验成功 |
| 1 | CRC校验失败 |
| …. | 待定 |
-
示例1:需对端回复ACK响应的发送报文
数据流:AF83010400015A8EC8

-
示例2:校验失败时的ACK报文
数据流:AF81030300012110

校验和CRC16
CRC覆盖的覆盖范围与CTRL字段中的EN_FULL_CRC值有关。
- 当EN_FULL_CRC置1时,CRC覆盖EOF开始(包含EOF)到Payload域结束的空间。
- 当EN_FULL_CRC置0时,CRC覆盖LEN之后(不含LEN)到Payload域结束的空间。
CRC算法均采用CRC-16-XMODEM:多项式公式x16+x12+x5+1,多项式POLY 0x1021。
说明: 为确保设置、查询、主动上报等命令报文传输正确,命令报文必须使用CRC校验。
业务层公共规范
业务层简介
业务层是接口的最上层,使用链路层提供的服务能力进行数据收发。
业务层功能
业务层承载各业务特性的功能,可以通过扩展业务类型加入新的业务。
主要提供如下功能:
- 业务层数据的分发。
- 各业务数据的解析、处理、响应。
Frame格式定义
图 1 Frame格式定义

- 所有业务层的报文都是以Model ID/Command ID作为起始。
- Model ID是每个报文所属的业务模块,如:设备管理、消息通知、闹钟等。
- Command ID是每个业务对应的命令类型,如:设置日期时间、获取设备版本相关信息等。
- TLV为封装消息中的具体信息。
说明: 根据经验,对于BLE设备,单帧的长度尽量控制在20Byte以内,总长度不得超过512Byte。
Model ID
Model ID:占1字节,用于标识模块类型。Model ID定义如表1所示。
表 1 Model ID表
| Model ID | Model Name | 说明 | 必选/可选(M/O) | Version |
|---|---|---|---|---|
| 1 | Device Status | 设备状态查询 | M | 1.0 |
| 2 | OTA Model | OTA | M | 1.0 |
| 3 | HearingAid Business | 助听业务配置 | O | 1.0 |
| 4 | HearingAid Parameter | 助听参数配置 | O | 1.0 |
| 5 | Maintenance Model | 可维可测 | O | 1.0 |
| 6 | File Tranfer Model | 文件传输 | O | 1.0 |
| 7 | Device Config | 设备设置 | O | 1.0 |
| 8 | APP Service Test | MCU业务维测 | O | 1.0 |
| 9 | BT Service Test | BT业务维测 | O | 1.0 |
| 10 | Media Service Test | Media业务维测 | O | 1.0 |
| 11 | Graphic Service Test | Graphic业务维测 | O | 1.0 |
| 12 | Audio Service Test | 音频业务测试 | O | 1.0 |
| 13 | MsgCenter Service | 消息中心业务 | O | 1.0 |
| 14 | MeshDev Service | 组网设备业务 | O | 1.0 |
| 127 | Customization Service | 客户定制化业务 | O | 1.0 |
说明: 为避免各个领域和产品型态的Model ID冲突,将Model ID进行统一划分。 Model ID为127保留给客户定制自己的服务和业务。
表 2 Model ID保留表
| Model ID | 所属领域 | 说明 | Version |
|---|---|---|---|
| 0x01~0x7F | MCU | 手机APP和MCU之间的蓝牙接口使用 | 1.0 |
| 0x80~0xFF | 预留 | 预留 | 1.0 |
Command ID
Command ID:占1字节,用于标识具体命令类型。每个Command ID表示一个独立的命令,每个Model ID对应的Command ID都从1开始,表明真实的逻辑行为,具体的Command ID说明在“Model ID命令定义”中详细介绍。
TLV
Type/Length/Value对应每条报文的具体内容。内容仅允许为TLV和TL形式,其中TL可在下挂子节点时使用,TL的L可以为下挂所有节点的总长度。
Type类型说明
Type占用1个字节:
- bit7表示该类型是否有子节点:1表示无子节点,0表示有子节点。其中有子节点的Type不能包含Value,仅为TL格式,Length表示其子节点的总长度。此外,对于可扩展子节点的类型,如果Length字段为0,Type字段的bit7位取值为0或1均可。
-
bit[6:0]表示Type的值,取值范围0~127,每个Command ID对应的Type都从1开始代表不同的内容类型,在对应Type类型的说明中会体现否包含子节点。
其中127为通用错误码类型。
图 1 Type类型说明

含有子节点的Type格式说明:
图 2 含有子节点的Type格式说明

Length类型说明
Length表示Value的长度,Length占用的字节数可变,用第一个字节的bit7来区分标识Length的字节:
- bit7为1时,表示Length在此字节结束,此字节的bit[6:0]为Length长度。
- bit7为0时,表示此字节后面的7bit,标识了后面几个字节为Length长度。
-
bit7为1时,Length占用1个字节可以表示0~127的长度,示意图如下:

例如:报文03 01 81 8F XX XX XX...
- Model ID=03
- Command ID=01
- Type=81(二进制为1000 0001,无子节点,Type为1)
- Length=8F(二进制为1000 1111,所以Length为15Byte)
-
bit7为0时,bit[6:0]表示了后续几个字节为Length值:

例如:报文03 01 81 01 F3 XX XX XX...
- Model ID=03
- Command ID=01
- Type=81(二进制为1000 0001,无子节点,Type为1)
- Length=F3(Type后字节为01 F3,01二进制为0000 0001,bit7为0,后面7bit为1,表示后续一个字节的数为Length,所以Length为0xF3)
说明: 查询和获取数据时,通常发送TL格式且L=0,回复方填充数据、补充完整的TLV格式回复请参考 “连接参数查询”。
通用错误码
通用错误码Type值为255(最高位为1),格式如下:
- 6位十进制数。
- 最高1位为1,保留后续扩展位。
- 次高2位表示模块。
- 最低3位表示模块中的错误类型。
如:101001,表示01模块中的第001个错误码。
表 1 通用错误码字段描述
| 字段名称 | Type ID | Length Size(Oct) | Value数据类型 | 说明 | 必选/可选(M/O) |
|---|---|---|---|---|---|
| error_code | 255 | 1 | uint32 | 通用错误类型,具体值请参见表2。 | M |

表 2 Error Code表
Error Code |
类别 |
说明 |
版本 |
|---|---|---|---|
100000 |
通用码 |
成功 |
|
100001 |
未知Error类型 |
||
100002 |
不支持该Service的请求 |
||
100003 |
不支持该Command的请求 |
||
100004 |
无权限 |
||
100005 |
系统忙 |
||
100006 |
请求格式错误 |
||
100007 |
参数错误 |
||
100008 |
申请内存失败 |
||
100009 |
响应超时 |
||
100010 |
设备电池电量低(无法进行业务) |
||
100011 |
设备不可用 |
||
100012 |
助听耳机业务未启动 |
||
103001 |
HearingAid Config model |
入参为空/数据非法 |
|
103002 |
数据过长 |
说明: 对于单板不支持的Model ID,单板返回100002(不支持该Model请求),对于单板不支持的Command ID,单板返回100003(不支持该Command请求)。
Data域的定义格式约束
各业务内的定义通用要求如下:
- 业务数据定义考虑扩展性,预留扩展能力。
- 业务内部按照功能进行合理的子类划分。
字节大小头约束
对于多字节传输的字段类型,均按照小端字节(LSB)序格式传输。
索引字段说明
对于本文档中描述到的所有索引,如果没有特殊说明,均是从1开始,并且进行递增。如果有特殊场景,需明确描述在接口字段定义中。
边界条件限制
- APP和穿戴设备间应用层协议最大包长定为2048Byte。
- 新增APP和穿戴设备间的TLV命令嵌套深度不超过5层。