[TOC]
概述
通信流程
相对usb 64byte传输,json格式命令数据长度大多都是比较长的。使用常规的一问一答的方式效率较低; 所以设计了如下通信方式:
- STEP 1,发送包头数据信息 ==》 发送纯数据 ==》 发送询问
- STEP 2,接收方回复:
- 正确->本次通信结束; ==》 后续接收方附加信息可以在ACK之后紧跟回复。再进step1
- 错误->回复丢失包 进入step3
- STEP 3,发送方法发送丢数据 ==》 发送询问 进入step2
说明:
- 为了避免通信失败时重发的代价太大,在step 1中将数据包拆分成N个以1024bytes为单位的小数据包; 当如上传输出错时,只需重传当前的1024bytes即可;
- 为了解决通信双方随时都可以主动发起,通信双方在所有数据头上加上明显辨识,用于接收方识别收到的数据是对方主动发送还是ack;
如下是基站主动发送的数据头 | 基站发送数据头 | 描述 | sdk回复数据头 | | --- | --- | --- | | 0xB1 | 基站主动发送数据信息 | 0xB1 | | 0xB2 | 基站主动发送纯数据 | 无需回复 | | 0xB3 | 基站主动发送询问 | 0xB3 |
如下是SDK主动发送的数据头 | SDK发送数据头 | 描述 | 基站回复数据头 | | --- | --- | --- | | 0xD1 | SDK主动发送数据信息 | 0xD1 | | 0xD2 | SDK主动发送纯数据 | 无需回复 | | 0xD3 | SDK主动发送询问 | 0xD3 |
一, 协议描述
1.1 发送数据信息
发送方发送数据:(所有非1字节数据都是高字节在前)
| 字节 | 标识符 | 描述 |
| --- | --- | --- |
| 0 | Header | 数据包头:基站主动发送0xB1;sdk主动发送0xD1 |
| 1-2 | defualt | |
| 3-4 | com seq | 通信序号 |
| 5 | BASEID | 指定的基站编号,为0时候不指定 |
| 6 | DATA-type | 1:json数据
2:普通数据; |
| 7-10 | DATA_total| 数据总字节数 |
| 11-14 | total DATA crc32 | 总数据(DATA_total长度)crc32|
| 15 | transfer total | 总传输次数 |
| 16 | transfer cur | 当前传输次数 |
| 17-18 | This PACK Len |本次要传输的数据包长度 |
| 19-22 | This Pack crc32 | 本次要传输的数据(This PACK Len长度)crc32 |
|default | | |
|60-63 | crc32 | 此数据包的crc32;从byte0-59共60个字节 |
举例:sdk要发送(1071 * 2 +512 bytes)数据给基站
第一个发送单元:
step1:
3-4:100
7-10 bytes: (1071 * 2 +512 bytes)
11-14 :数据总长度的crc
15 : 3
16 : 0
17-18 : 1071
19-22 :1071数据的crc
60-63 : crc
step2: 基站ack
step3: sdk发送1071长度数据;63byte * 17包;
step4: sdk发送询问信息
step5: 基站ack
第二个发送单元:
step1:
3-4:100
7-10 bytes: (1071 * 2 +512 bytes)
11-14 :数据总长度的crc
15 : 3
16 : 1
17-18 : 1071
19-22 :1071数据的crc
60-63 : crc
step2: 基站ack
step3: sdk发送1071长度数据;63byte * 17包;
step4: sdk发送询问信息
step5: 基站ack
第三个发送单元:
step1:
3-4:100
7-10 bytes: (1071 * 2 +512 bytes)
11-14 :数据总长度的crc
15 : 3
16 : 2
17-18 : 512
19-22 :512数据的crc
60-63 : crc
step2: 基站ack
step3: sdk发送512长度数据;63byte * 9包;
step4: sdk发送询问信息
step5: 基站ack
接收方应答:
| 字节 | 标识符 | 描述 |
| --- | --- | --- |
| 0 | Header | 数据包头:sdk应答0xB1;基站应答0xD1 |
| 1-2 | defualt | |
| 3-4 | com seq | 通信序号 |
| 5 | BASEID | 指定的基站编号,为0时候不指定 |
| 6 | DATA-type | 1:json数据
2:普通数据; |
| 7-10 | DATA_total| 数据总字节数 |
| 11-14 | total DATA crc32 | 总数据crc32 |
| 15 | transfer total | 总传输次数 |
| 16 | transfer cur | 当前传输次数 |
| 17-18 | This PACK Len |本次要传输的数据包长度 |
| 19-22 | This Pack crc32 | 本次要传输的数据crc32 |
1.2 发送方连续发送N包数据包,接收方无需回复
每个数据包都带一个字节的数据头:
- 基站主动发送0xB2;下一字节表示当次传输序号从1开始 1-N
- sdk主动发送0xD2下一字节表示当次传输序号从1开始 1-N
1.3 发送方发送询问
字节 | 标识符 | 描述 |
---|---|---|
0 | Header | 数据包头:基站主动发送0xB3;sdk主动发送0xD3 |
1-2 | defualt | |
3-4 | com seq | 通信序号 |
5 | BASEID | 指定的基站编号,为0时候不指定 |
6 | DATA-type | 1:json数据 2:普通数据; |
7-10 | DATA_total | 数据总字节数 |
11-14 | total DATA crc32 | 总数据crc32 |
15 | transfer total | 总传输次数 |
16 | transfer cur | 当前传输次数 |
17-18 | This PACK Len | 本次要传输的数据包长度 |
19-22 | This Pack crc32 | 本次要传输的数据crc32 |
接收方应答:
| 字节 | 标识符 | 描述 |
| --- | --- | --- |
| 0 | Header | 数据包头:基站主动发送0xB3;sdk主动发送0xD3 |
| 1-2 | defualt | |
| 3-4 | com seq | 通信序号 |
| 5 | BASEID | 指定的基站编号,为0时候不指定 |
| 6 | DATA-type | 1:json数据
2:普通数据; |
| 7-10 | DATA_total| 数据总字节数 |
| 11-14 | total DATA crc32 | 总数据crc32 |
| 15 | transfer total | 总传输次数 |
| 16 | transfer cur | 当前传输次数 |
| 17-18 | This PACK Len |本次要传输的数据包长度 |
| 19-22 | This Pack crc32 | 本次要传输的数据crc32 |
| 23 | result | 接收方验证后回复结果:1-成功;2-失败 |
| 24-N | result_information | 接收到的包号,依次往下写。接收方判断result为失败的时候查看这里可以直接做补传,后续直接发送0XB2 or0XD2 补传对应包 再询问|
二, 功能协议
2.1 固件升级类协议
2.1.0 固件升级类的流程:
- step1: 上层软件发送固件升级指令信息:
- 升级对象(基站,键盘,字库...)
- 固件字节数
- 固件crc32
- 其他
- step2: 基站回复表示收到命令,开始为固件升级做准备
- step3: 基站发送数据申请信息:
- 固件起始位置
- 固件数据长度
- step4: 上层软件根据基站申请读取对应数据发送给基站;
- 固件起始地址
- 固件数据长度
- 数据数据
- 重复step3,step4直到基站获取到全部固件数据
- step5: 基站发送固件升级完成信息,通知上层可以退出固件升级模式
- 升级对象
2.1.1 固件升级协议
2.1.1.1 setFwUpdateState
- 功能描述:固件升级
- 参数说明
参数名 | 类型 | 限制 | 是否必填 | 说明 |
---|---|---|---|---|
fun | string | - | 是 | 指令名称 |
dataTag | string | - | 否 | 数据包标识,可为空字符串 |
baseSn | string | 是 | 基站的出厂编码 | |
data | object | - | 是 | 传送参数的对象 |
+state | string | 是 | 状态 "start"-开始升级 "stop"-停止升级 |
|
+partition | string | 是 | "base_fw" 基站固件 "base_fw_bk" 基站备份固件 "keypad_fw" 键盘固件 "front" 字库文件 |
|
+file len | uint | 是 | 升级固件文件的大小(字节数),10进制数字 | |
+version | string | 是 | 待升级的基站固件版本 | |
+crc | uint | 是 | 固件CRC校验码,10进制数字 | |