二进制协议
- 考虑到传输数据大小,流量约束等需求,支持二进制协议
- 使用枚举的方式,参照 TLV(type,length,value)协议~
- 预定义枚举类型,每个 type 是定长数据
- 支持版本号,为以后迭代准备
1.定义
1.1 数据包结构
Tpye | Byte |
---|---|
Command | 1 |
Payload Length | 1 |
Payload | N |
1.2 Command 定义
Command | Value |
---|---|
CONNECT | 0x01 |
PUB | 0x02 |
SUB | 0x03 |
UNSUB | 0x04 |
MSG | 0x05 |
PING | 0x06 |
PONG | 0x07 |
ACK | 0x08 |
ERR | 0x09 |
1.3 Type 定义
Name | Type | Value |
---|---|---|
info | 0x00 | 炉具类别 |
rom_version | 0x01 | 软件版本号 |
idh | 0x02 | 硬件版本(高 8 位) |
idl | 0x03 | 硬件版本(低 8 位) |
yy | 0x04 | 生产年份(第 1 字节) yy 年 |
mm | 0x05 | 生产月份(第 2 字节) mm 月 |
dd | 0x06 | 生产日期(第 3 字节) dd 日 |
status | 0x07 | 工作状态(1 字节) |
working_mode | 0x08 | 工作模式(1 字节) |
heat_mode | 0x09 | 加热模式(1 字节) |
gear | 0x0A | 工作档位(1 字节) |
child | 0x0B | 童锁状态(1 字节) |
timingh | 0x0C | 定时状态值(高 8 位) |
timingl | 0x0D | 定时状态值(低 8 位) |
error | 0x0E | 错误信息(1 字节) |
temph | 0x0F | 炉面温度 AD(高 8 位)4 位 16 进制数 (电磁炉用高 8 位,低 8 位不用) |
templ | 0x10 | 炉面温度 AD(低 8 位)0、1、2、3、... 、1100(度)(辐热炉用 2 字节) |
igbt | 0x11 | IGBT 温度 AD(1 字节) 关键功率器件温度(电磁炉) |
voltage | 0x12 | 工作电压 AD(1 字节) 工作电压(电磁炉) |
furnace_temp | 0x13 | 炉腔温度 AD(1 字节) 0 — 100 度(辐热炉) |
offon | 0x14 | 功率通断比(1 字节) 0、1、2、3、...、255(× 100/ 256 %)(辐热炉) |
- 以上是主要的数据推送类型,目前所有的 Length 默认都是 1 一个字节 *
Name | Type | Value |
---|---|---|
token | 0xA0 | 当前设备的唯一标识 (长度未确定) |
version | 0xA1 | 当前协议版本号 (一个字节) |
nonce | 0xA2 | 随机响应值 (两个字节) |
2.目前需要的指令
2.1 PING
发送两个字节: | 0x04 | 0x0 |
2.2 PONG
对 PING 的响应,两个字节: | 0x05 | 0x0 |
2.3 PUB
第一次连接服务器,需要推送 token,version,分别是设备的认证和协议版本号: | 0x01 | length | 0xA0 | ... | 0xA1 | 0x01 |
2.4 PUB
根据需要(第一次启动 / 周期性推送)发送不同的数据,比如推送 info 字段: | 0x02 | 2 | 0x00 | 0x01 |
可以大量的推送数据,使用 | key1 | value1 | key2 | value2 | 的方式
3. 工作流程
1 第一次连接之后使用 CONNECT,发送 token,version 进行认证和协议协商
2 周期性的 PUB 指令推送数据
3 使用 PING 机制,得到 PONG 回应。如果一定时间 PONG 没有收到,认为网络不可用,进行重启操作
TODO
1 预留了反向控制指令,其他指令需要的时候可以用上
2 SUB / UNSUB / MSG / ACK / ERR 是预留的命令
3 PUB 之后是否要回应?