# YAT 通信协议与指令集
#一、软件协议
串口协议自下而上分为SLIP层、IMC层。SLIP层负责原始数据的封包和解包。IMC层负责业务逻辑处理。
#1.1 SLIP(Serial Line Internet Packet)层
... | START | PAYLOAD | END | ... | START | PAYLOAD | END | ... |
1 Byte | 2...1026 Byte | 1 Byte | 1 Byte | 2...1026 Byte | 1 Byte |
START | 起始符,标志数据包的开始,定义十六进制:0xC0 |
PAYLOAD | 载荷数据。 其中:
|
END | 结束符,标志数据包的结束,定义十六进制:0xD0 |
#1.2 IMC(inter MCU Communication)层
TYPE | PAYLOAD | CRC8 |
1 Byte | 0...1024 Byte | 1 Byte |
命令 | 载荷数据 | PAYLOAD 的CRC校验值 |
CRC8校验算法见附件
数据传输采用小端模式,如:timeout_s=0x3C00 表示 60s.
#二、串口配置
#2.1 默认配置
- Band rate: 115200
- Data bites: 8
- Parity: None
- Stop bites: 1
#2.2 修改方法
串口的波特率及引脚是可以修改。
方法一:
调试阶段可以在debug串口输入cli命令 uart [bandrate]
,uart <rx_pin>|<tx_pin> <pin num>
。
查看波特率命令 uart
设置波特率为9600,命令 uart 9600
.
设置uart的rx引脚,命令 uart rx_pin 12
.
设置uart的tx引脚,命令 uart tx_pin 11
.
方法二:
生产阶段使用BAT批量生产时,通过配置文件的方式烧录。id类型选择 UCPP(一型一密)
。
json文件:📎uart_profile.json
{
"yat.uart.baudrate": "9600",
"yat.uart.rx.pin": "12",
"yat.uart.tx.pin": "11"
}
#三、指令集
#1\. 基础指令集
#0x01 测试指令
MCU端可以通过这条指令验证串口通讯是否正常。
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x01 | n Byte | echo. n取值范围 1~1024 |
Wifi->MCU
TYPE | PAYLOAD | 说明 |
0x01 | n Byte | echo. n取值范围 1~1024 |
#0x02 重启指令
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x02 | 0x00 | 预留 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x02 | 0x00 | 设置成功 |
0x01 | 设置错误 |
说明:重启指令回复ACK后,延时500ms后重启系统。 模组重启时间至少1s。
#0x03 恢复出厂设置
恢复出厂设置,只能恢复通过指令设置的参数。
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x03 | 0x01 | 清除配网参数,并重启设备(ssid pwd等) |
0x02 | 清除配网参数,清除配网类型, 配网超时时间,并重启设备 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x03 | 0x00 | 设置成功 |
0x01 | 设置错误 |
#0x04 设置云平台产品配置参数
平台产品参数可以不通过指令设置,可以是WiFi模组固件的出厂时默认配置,如果默认请联系mxchip。
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Cloud code | CONFIG | ||
0x04 | 1 Byte | n Byte | Cloud code:云平台识别码 CONFIG:云平台配置,格式见附件 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x04 | 0x00 | 设置成功 |
0x01 | 设置错误 |
#0x05查询云平台产品配置参数
只能查询通过指令配置平台产品配置参数。
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x05 | 1 Byte | PAYLOAD为云平台识别码 |
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
Cloud Code | CONFIG | ||
0x05 | 1 Byte | n Byte | Cloud Code:云平台识别码 CONFIG:云平台配置,格式见附件 |
#0x06 设置产品属性配置表
属性配置表可以通过指令设置,也可以在固件中出厂默认设置。
如果云平台支持透传方式,强烈建议使用透传方式,模组中就不需要属性配置表。
属性配置表由mxchip生成。配置文件大于 512 Bytes 后需要分片传输。
MCU->WiFi
TYPE | PAYLOAD | 说明 | ||
File length | Start Addr | End Addr | ||
0x06 | 2 Byte | 2 Byte | 2 Byte | File length : 属性配置表长度 Start Addr : 文件起始地址 End Addr : 文件截止地址 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x06 | 0x00 | 设置成功 |
0x01 | 设置错误 |
如:
配置文件长度为 606 Bytes,文件大于 512 Bytes,需要分包传输。第一包发送512 Bytes 数据,第二包发送 94 Bytes 数据。
- MCU->WiFi : 06 5E 02 00 00 00 02 <省略512 Bytes>CRC8
- WiFi->MCU : 06 00 00
- MCU->WiFi : 06 5E 02 00 02 5E 02 <省略512 Bytes>CRC8
- WiFi->MCU : 06 00 00
Note:
- 配置文件可以由MXCHIP烧录,也可以由客户自己烧录
- 当配置文件小于4K,配置文件与固件分开烧录,配置文件烧录在KV中
- 当配置文件大于4k,配置文件与固件一起烧录,配置文件与固件合成新固件,属于定制固件
#0x07 查询模组软件版本
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x07 | 0x00 | 预留 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x07 | n Byte | 获取模组软件版本号,string类型 |
#0x0A LOTA 配置 MCU 信息
本指令主要用于生产阶段,通过无线工具将产品信息通过模组传输给MCU(比如产品序列号等信息)
指令超时时间1s
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
Method | Data | ||
0x0A | 0x01 | 1-512 byte | 配置写入 |
0x02 | 读取配置 |
- 当 Method = 0x01 时
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Method | Res | ||
0x0A | 0x01 | 0x00 | 配置写入成功 |
0x01 | 配置写入失败 |
- 当 Method = 0x02 时
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Method | Data | ||
0x0A | 0x02 | 1-512 byte | 配置查询结果 |
#1\. LOTA 配置写入格式
# Lota 配置的json格式
{
"method": "mcu_set",
"mcu_set": {
"sn": "1234567",
"cmei": "asdfgh"
}
}
# mcu 收到的json格式
{
"sn": "1234567",
"cmei": "asdfgh"
}
# Lota 的返回值. 0:成功 1:失败
{
"method":"mcu_res",
"mcu_res": 0,
}
#2\. LOTA 配置查询格式
# Lota 配置的json格式
{
"method": "mcu_get",
"mcu_get": [
"sn",
"cmei"
]
}
# mcu 收到的json格式
[
"sn",
"cmei"
]
#3\. LOTA 配置查询上报格式
# mcu上报的格式
{
"sn": "1234567",
"cmei": "asdfgh"
}
# Lota接收到的格式
{
"method": "mcu_reply",
"mcu_reply":{
"sn": "1234567",
"cmei": "asdfgh"
}
}
#2\. 网络指令集
#0x11 WiFi模组网络状态主动下发
当模组的网络状态发生改变时,模组将状态主动下发给MCU。
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x11 | 0x00 | 路由器连接断开 |
0x01 | 路由器连接成功 | |
0x02 | 配网状态下,模组收到手机发来的ssid,并开始连接路由器 |
MCU->WiFi
无
#0x12 查询WiFi模组的网络状态 MCU->WiFi
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x12 | 0x00 | 预留 |
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
WiFi Status | RSSI | ||
0x12 | 0x00 | 1 Byte | 初始状态 |
0x01 | 1 Byte | 配网状态 | |
0x02 | 1 Byte | 正在连接路由器 | |
0x03 | 1 Byte | 连接到路由器 |
当模组未连接到路由器时 RSSI=0x00。
当模组连接到路由器时 RSSI的取值范围时 -100~0,int8_t类型。
状态说明:
- 0x00 出厂状态,或者恢复出厂设置后的状态
- 0x01 表示配网状态,该状态维持到连上路由器
- 0x02 表示重连路由器的状态。已经连上过路由器,又与路由器断开连接,模块会尝试重新连接路由器。
- 0x03 表示模块已经连上路由器
#0x13 配网指令
MCU->WiFi
TYPE | PAYLOAD | 说明 | ||
Cloud Code | Type | TimeOut | ||
0x13 | 0x00 | 0x00 | 2 Byte | 默认配网方式,不限制平台 |
1 Byte | 0x01 | 2 Byte | 一键配网 | |
0x02 | 2 Byte | 设备热点配网 | ||
0x03 | 2 Byte | 蓝牙配网 | ||
0x04 | 2 Byte | MESH配网 | ||
0xFF | 2 Byte | 停止配网 |
Cloud Code: 平台识别码。
TimeOut:配网超时时间,单位秒。TimeOut=0, 表示不超时。
不同平台对应的配网方式不同,详见附件。
WiFi模组收到配网指令后,重新启动,进入相应的配网模式。配网超时 或 Type=0xFF(停止配网),若模组配置过WiFi,模组将尝试回连;若模组未配置过WiFi,模组将恢复到初始状态。
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x13 | 0x00 | 设置成功 |
0x01 | 设置错误 |
#0x14 扫描热点指令
热点扫描的超时时间是3秒。
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x14 | 0x00 | 扫描热点信息 |
n Bytes | 扫描指定SSID的热点信息, n的取值范围 1~32,String类型 |
WiFI-MCU
TYPE | PAYLOAD | 说明 | |
ap_num | ap_list | ||
0x14 | 1 Byte | ap_num * 33 Byte | 扫描结果 |
ap_num:AP热点数,最多20个
ap_list:AP热点信息表
# ap_list 结构体
typedef struct _ap_list
{
char ssid[32];
int8_t rssi;
} ap_list_t;
#0x15 产测指令
模组端扫描指定路由器,“mxchip_qc_test”,模组端判断信号强度,如果rssi<-70dbm,返回MCU失败。如果rssi>-70dbm,返回MCU产测成功。
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x15 | 0x00 | mxchip指定的产测路由器 |
n Bytes | 客户指定的产测路由器, n的取值范围 1~32,String类型 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x15 | 0x00 | 产测成功 |
0x01 | 产测失败 |
- 产测流程图:
#0x16 WiFi开关指令
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x16 | 0x00 | 关闭 WiFi |
0x01 | 开启WiFi |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x16 | 0x00 | 设置成功 |
0x01 | 设置失败 |
说明:指令发送成功后,WiFi模组会重启。
1、如果模组配置过wifi和cloud,MCU 发送 0x16 0x01 指令后,模组重启,尝试连接配置过的WiFi和Cloud。
2、如果MCU发送 0x16 0x00,模组先断开wifi和cloud,然后重启模组;模组重启或重新上电,都不会去尝试连接WiFi及Cloud。
#0x17 WiFi低功耗指令
设置命令
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Set | Status | ||
0x17 | 0x00 | 0x00 | 关闭低功耗功能 |
0x01 | 开启低功耗功能 |
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
Set | Status | ||
0x17 | 0x00 | 0x00 | 设置成功 |
0x01 | 设置失败 |
获取状态指令
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Get | Status | ||
0x17 | 0x01 | 0x00 | 获取低功耗状态 |
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
Get | Status | ||
0x17 | 0x01 | 0x00 | 低功耗功能关闭 |
0x01 | 低功耗功能开启 |
#0x18 获取模组的WiFi信息
获取指令
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x18 | 0x00 | 查询模组的WiFi信息 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x18 | n bytes | WiFi相关信息,json格式 后续会扩展 |
{
"mac": "C89346000001",
"ssid": "mxchip-ae",
"pwd": "emc3080",
"ip": "192.168.1.1"
}
当某个字段没有时,不返回该字段。比如出厂状态时,查询WiFi信息时,仅返回mac字段。
#3\. 云平台指令集
#0x21 WiFi模组服务器状态主动下发
当模组的网络状态发生改变时,模组将状态主动下发给MCU。
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
Cloud Code | Status | ||
0x21 | 1 Byte | 0x00 | 服务器连接断开 |
0x01 | 服务器连接成功 | ||
0x02 | 绑定通知,由平台决定 | ||
0x03 | 解绑通知,由平台决定 |
MCU->WiFi
无
#0x22 查询WiFi模组的服务器连接状态
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x22 | 0x00 | 所有平台的连接状态 |
1 Byte | Cloud Code |
WiFi->MCU
TYPE | PAYLOAD | 说明 | |
Cloud Code | Status | ||
0x22 | 1 Byte | 0x00 | 未连接到服务器 |
0x01 | 连接到服务器 |
#0x23 解绑指令
解除设备与手机APP的绑定关系。
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x23 | 0x00 | 解绑所以平台 |
1 Byte | PAYLOAD为云平台识别码,解绑对应的平台 |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x23 | 0x00 | 设置成功 |
0x01 | 设置错误 |
#0x24 查询UTC时间
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x24 | 0x00 | String |
0x01 | Hex |
WiFi->MCU
TYPE | PAYLOAD | 说明 |
0x24 | n Byte | 获取UTC时间, String类型 |
8 Byte | 对应MCU请求0x01, Byte 0:获取成功标志,成功为1 Byte 1:为年份,0x00表示2000年 Byte 2:为月份,1-12 Byte 3:为日期,1-31 Byte 4:为时钟,0-23 Byte 5:为分钟,0-59 Byte 6:为秒钟,0-59 Byte 7:为星期,1-7 |
#0x25 控制指令-TLV格式
如果模组与云平台交互协议选择非透传方式进行通信,设备上报属性可以采用TLV格式,模组端必须设置属性配置表,属性配置表由mxchip生成。
MCU可以单属性上报,也可以多属性上报。
建议当模组每次连上服务器后,将设备的所有状态都上报一次。
#1\. 设备属性上报
MCU->WiFi
TYPE | PAYLOAD | 说明 | ||
TYPE | LENTH | VALUE | ||
0x25 | 1 Byte | 1 Byte | n Byte |
|
WiFi->MCU
无
#2\. 模组属性下发
模组下发属性采用TLV格式,模组下发单属性还是多属性,由平台决定。
WiFi->MCU
TYPE | PAYLOAD | 说明 | ||
TYPE | LENTH | VALUE | ||
0x25 | 1 Byte | 1 Byte | n Byte |
|
MCU->WiFi
无
#0x26 控制指令-透传格式
如果模组与云平台交互协议选择透传方式进行通信,如果云端脚本由mxchip提供,设备上报属性必须采用TLV格式。用户也可以自定义数据格式,云端脚本自行开发。
MCU可以单属性上报,也可以多属性上报。
建议当模组每次连上服务器后,将设备的所有状态都上报一次。
#1\. 设备属性上报
MCU->WiFi
TYPE | PAYLOAD | 说明 | ||
TYPE | LENTH | VALUE | ||
0x26 | 1 Byte | 1 Byte | n Byte |
|
WiFi->MCU
无
#2\. 模组属性下发
WiFi->MCU
TYPE | PAYLOAD | 说明 | ||
TYPE | LENTH | VALUE | ||
0x26 | 1 Byte | 1 Byte | n Byte |
|
WiFi->MCU
<span class="ne-text">无</span>
#0x27 控制指令JSON格式
如果模组与云平台交互协议选择非透传方式进行通信,设备上报属性可以采用JSON格式,模组端不需要设置属性配置表。
MCU可以单属性上报,也可以多属性上报。
建议当模组每次连上服务器后,将设备的所有状态都上报一次。
#1\. 设备属性上报
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x27 | n Byte | 上报JSON格式数据 n取值范围 1~1024 |
WiFi->MCU
<span class="ne-text">无</span>
#2\. 模组属性下发
MCU->WiFi
TYPE | PAYLOAD | 说明 |
0x27 | n Byte | 下发JSON格式数据 n取值范围 1~1024 |
WiFi->MCU
<span class="ne-text">无</span>
#0x29 指定平台id的控制指令-透传格式
#1\. 数据上报
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Cloud Code | Data | ||
0x29 | 1 byte | n Byte | 不限格式 n取值范围 1~1023 |
WiFi->MCU
无
#2\. 数据下发
MCU->WiFi
TYPE | PAYLOAD | 说明 | |
Cloud Code | Data | ||
0x29 | 1 byte | n Byte | 不限格式 n取值范围 1~1023 |
WiFi->MCU
无
#4\. BT & BLE Mesh 指令集
#0x51 BT 模式开关指令
注:Master模式暂不支持
MCU->WiFi:
TYPE | PAYLOAD | 说明 |
0x51 | 0x00 | 关闭蓝牙功能 |
0x01 | 开启BT LE Slave模式 | |
0x02 | 开启BT MESH模式 |
WiFi->MCU:
TYPE | PAYLOAD | 说明 |
0x51 | 0x00 | 设置成功 |
0x01 | 设置错误 |
#0x52 BT 模式开关状态查询指令
MCU->WiFi:
TYPE | PAYLOAD | 说明 |
0x52 | 0x00 | 查询BLE开关状态 |
WiFi->MCU:
TYPE | PAYLOAD | 说明 |
0x52 | 0x00 | 蓝牙功能关闭 |
0x01 | BT LE Slave开启 | |
0x02 | BT MESH模式开启 |
#0x53 BT 连接状态主动下发指令
WiFi->MCU:
TYPE | PAYLOAD | 说明 |
0x53 | 0x00 | 当 BT模式为BLE Slave,表示断开;当BT模式为MESH,表示未配网 |
0x01 | 当 BT模式为BLE Slave,表示连接;当BT模式为MESH,表示配网成功 |
#0x54 BT 连接状态查询指令
MCU->WiFi:
TYPE | PAYLOAD | 说明 |
0x54 | 0x00 | 查询BLE Slave SPP 连接状态 |
WiFi->MCU:
TYPE | PAYLOAD | 说明 |
0x54 | 0x00 | 当 BT模式为BLE Slave,表示断开;当BT模式为MESH,表示未配网 |
0x01 | 当 BT模式为BLE Slave,表示连接;当BT模式为MESH,表示配网成功 |
#0x55 BT 属性上报与下发(only BT)
#a. 数据上报-RAW
MCU->BLE:
TYPE | PAYLOAD | 说明 |
0x55 | n Bytes | 数据接收 |
BLE->MCU:
无
注释:数据只在BT通道传输
#b. 数据下发-RAW
BLE->MCU:
TYPE | PAYLOAD | 说明 |
0x55 | n Bytes | 数据接收 |
MCU->BLE:
无
#0x56 BT 属性上报与下发(BT&WiFi)
#a. 数据上报-RAW
MCU->BT&WiFi:
TYPE | PAYLOAD | 说明 |
0x56 | n Bytes | 数据接收 |
BLE->MCU:
注释:数据在BLE和WiFi通道同时传输
#b. 数据下发-RAW
BT数据下发,通过命令 0x55。
WiFi数据下发,参数通用指令集。
#0x57 BT 属性查询
BT->MCU
TYPE | PAYLOAD | 说明 |
0x57 | n Bytes | 属性查询 |
#四、附件
#云平台识别码
电商 | 云平台 | 识别码 |
阿里 | 飞燕/启明星 | 0x01 |
京东 | 小京鱼 | 0x02 |
苏宁 | 苏宁智能 | 0x03 |
国美 | 国美智能 | 0x04 |
华为 | Hilink/HormonyOS | 0x05 |
小米 | 米家 | 0x06 |
腾讯 | 腾讯连连 | 0x07 |
BT | BT LE Slave | 0x08 |
BT | BT MESH | 0x09 |
杭研 | 和家亲 | 0x0A |
#CRC8算法
#计算法
//CRC-8 x8+x2+x+1
unsigned char crc8(unsigned char *vptr, unsigned char len)
{
const unsigned char *data = vptr;
unsigned crc = 0;
int i, j;
for (j = len; j; j--, data++) {
crc ^= (*data << 8);
for (i = 8; i; i--) {
if (crc & 0x8000)
crc ^= (0x1070 << 3);
crc <<= 1;
}
}
return (unsigned char)(crc >> 8);
}
#查表法
//CRC-8 x8+x2+x+1
unsigned char CRC8_Table[256] = {
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F,
0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E, 0x79,
0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53,
0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90, 0x97,
0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1,
0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC,
0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88,
0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E,
0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04,
0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E,
0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8,
0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2,
0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56,
0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10,
0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A,
0x33, 0x34, 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39,
0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F,
0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5,
0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1,
0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 };
unsigned char crc8(unsigned char *p, char counter)
{
unsigned char crc = 0;
for (; counter > 0; counter--) {
crc = CRC8_Table[crc ^ *p]; //查表得到CRC码
p++;
}
return crc;
}
#TLV编码介绍
TLV是指由数据的类型Tag,数据的长度Length,数据的值Value组成的结构体,几乎可以描任意数据类型,TLV的Value也可以是一个TLV结构,正因为这种嵌套的特性,可以让我们用来包装协议的实现。
T | L | V | ||
Tag | Length | Value | ||
Tag | Length | Value |
Tag在本协议中表示属性ID。
# One TLV Object is shown as follow:
#
# 1Byte 1Byte $Length Bytes
# +-------+----------+-------------+
# | Tag | Length | Value |
# +-------+----------+-------------+
#
# Serial TLV Objects can be connected like this:
#
# 1Byte 1Byte $Length Bytes 1Byte 1Byte $Length Bytes
# +-------+----------+-------------+-------+----------+-------------+
# | Tag | Length | Value | Tag | Length | Value |
# +-------+----------+-------------+-------+----------+-------------+
#
# You can also put a TLV Object into another TLV Object, like this:
#
# 1Byte 1Byte |---------$Length Bytes----------|
# 1Byte 1Byte $Length Bytes
# +-------+----------+-------+----------+-------------+
# | Tag | Length | Tag | Length | Value |
# +-------+----------+-------+----------+-------------+
#
#数据类型
value的数据类型:
类型 | 标识符 | 大小 |
布尔型 | bool | 1 Byte |
枚举 | enum | 1 Byte |
字符型 | char | 1 Byte |
短整型 | short | 2 Bytes |
整型 | int | 4 Bytes |
单精度浮点型 | float | 4 Bytes |
双精度浮点型 | double | 8 Bytes |
文本型 | text | 1-254 Bytes |
嵌套型 | struct | 1-254 Bytes |
#变更记录
版本 | 说明 | 日期 |
2.5 |
| 2022.12.6 |
2.4 | 增加Hex格式的UTC时间 | 2021.8.24 |
2.3 | 修改配网指令,适配停止配网功能 | 2021.6.4 |
2.2 | 增加WiFi低功耗指令 | 2021.2.3 |
2.1 | 1 增加WiFi开关指令 2 可以通过cli或bat配置uart的引脚 | 2020.12.30 |
2.0 | 1 增加BT相关指令 2 增加MESH配网指令 | 2020.12.11 |
1.1 | 增加串口配置文件,支持BAT烧写 | 2020.8.21 |
1.0 | 初次发布 | 2020.7.20 |