串口协议
更新时间:2020-11-24T09:01:25Z
1修订历史
序号 | 版本 | 日期 | 修改点 | 制修订 | 审核 |
---|---|---|---|---|---|
1 | V0.1 | 2020.07.30 | 首次编写 | 詹小琳 | |
2 | V0.2 | 2020.08.04 | 添加模组透传BLE协议 | 詹小琳 | |
3 | V0.3 | 2020.08.11 | 添加0x12、0x13进入厂测控制码 | 詹小琳 | |
4 | V1.0 | 2020.10.26 | 5.1.1模组通知MCU有ota版本中添加image文件的crc16值 | 詹小琳 | |
5 | V1.1 | 2021.02.05 | 增加0x14、0x15软重启控制码 | 蔡跃光 |
2-协议格式
定义MCU和模组的串口通讯协议,主要分为三种:
- 通用协议,用于心跳和信息查询。
- 功能协议,用于实现MCU的功能点,根据设备功能可分为事件、属性、方法。
- MCU OTA协议,用于升级MCU固件,需要MCU支持双镜像,模组只做数据转发,MCU OTA文件最大为300k。
21-串口设置
串口参数如下:
- 波特率:115200
- 数据位:8
- 奇偶校验:无
- 停止位:1
- 数据流控:无
22-数据大小端
大端格式:所有多字节数据高字节在前,低字节在后。
23-格式说明
字段 | 长度(Bytes) | 说明 |
---|---|---|
帧头 | 2 | 0x5a5a |
长度 | 2 | 大端 |
版本 | 1 | 协议版本 |
会话id | 2 | 会话标识,每次通讯不同 |
控制码 | 1 | 具体控制命令 |
数据 | n | 数据内容 |
校验值 | 2 | crc16检验值 |
帧是传送信息的基本单元,帧格式如上表所示:
- 帧头: 固定为0x5a5a
- 长度: 大端模式,包括版本、会话id、控制码、数据、校验值
- 版本: 控制码和数据对应的版本号
- 会话id:会话标识,可以初始化一个随机值后每次自增1,请求和响应的会话id需要一致
- 控制码:描述具体的控制命令
- 数据: 控制码对应的数据内容
- 校验值:大端模式,采用crc16校验算法,包含帧头、长度、版本、会话id、控制码、数据,计算代码可使用
crc16计算代码
24-控制码说明
控制码 | 说明 |
---|---|
0x00 | 心跳检测 |
0x01 | 心跳应答 |
0x02 | 查询模组wifi信息 |
0x03 | 模组wifi信息 |
0x04 | 查询模组连接状态 |
0x05 | 模组应答或主动下发连接状态 |
0x06 | 查询产品信息 |
0x07 | 模组固化的产品信息 |
0x08 | 查询模组或MCU的版本信息 |
0x09 | 模组或MCU的版本信息 |
0x0a | MCU获取模组当前时间 |
0x0b | 模组当前时间 |
0x0c | 请求MCU或模组进行复位 |
0x0d | MCU或模组响应复位请求 |
0x0e | 模组查询MCU的节点列表 |
0x0f | MCU返回当前的节点列表 |
0x10 | 模组透传BLE协议给MCU |
0x11 | MCU应答BLE协议 |
0x12 | MCU请求模组进入厂测模式 |
0x13 | 模组应答进入厂测结果 |
0x14 | 请求MCU或模组进行软重启 |
0x15 | MCU或模组响应软重启请求 |
0x40 | MCU属性、方法设置,MCU属性值获取 |
0x41 | MCU属性、事件上报,MCU属性、方法响应 |
0x80 | 通知MCU有OTA版本 |
0x81 | MCU请求OTA数据 |
0x82 | 模组应答MCU OTA数据 |
0x83 | MCU通知模组升级结束 |
通讯协议根据数据内容,主要分为3类:
- 通用协议
- 心跳指令:模组上电后,检查MCU与模组的连接状态
- 信息查询:用于MCU查询模组的信息,模组获取MCU的版本信息
- 功能协议
- 用于实现设备功能的控制,数据内容为json格式,分为事件、属性、方法,具体查看
功能协议
- 用于实现设备功能的控制,数据内容为json格式,分为事件、属性、方法,具体查看
- 升级协议
- 升级MCU,具体升级流程查
升级协议
- 升级MCU,具体升级流程查
3-通用协议
31-心跳协议
311-心跳检测
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x00 | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 DB99 00 2DED
312-心跳应答
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x01 | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 DB99 01 ED2C
313-心跳流程
模组启动后,间隔30秒没有收到MCU的数据时,模组发起心跳查询,如果MCU没有应答,改成间隔5秒发送心跳查询,直到MCU应答,用于确认MCU是否正常工作。
MCU也可以通过心跳确认模组是否正常工作。
32-信息查询协议
321-查询wifi模组信息
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x02 | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 2F59 02 1E7D
322-模组应答wifi信息
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x03 | 1 | |
数据 | wifi状态 | 1 | 0:未指定网卡,1:STA模式,2:AP模式,3:AP+STA模式 |
IP地址 | 4 | ||
MAC地址 | 6 | ||
wifi ssid长度 | 1 | ||
wifi ssid | n | 字符串 | |
wifi密码长度 | 1 | ||
wifi密码 | n | 字符串 |
样例:
ap模式,
IP地址:192.168.10.1,
mac地址:98:f4:ab:89:d1:f1,
wifi ssid:SmartLight-d1f0,
wifi密码为空
二进制协议如下:
5A5A 0022 00 2F59 03 02 C0A80A01 98F4AB89D1F1 0F 536D6172744C696768742D64316630 00 752A
323-查询模组连接状态
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x04 | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 2F5A 04 ECFD
324-模组应答通知连接状态
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x05 | 1 | |
数据 | 配网状态 | 1 | 0:未配网,1:配网成功 |
连接状态 | 2 | 0:ap_start1:ap_stop……102:device station start103:device station stop104:device station connected to AP105:device station disconnected from AP……201:获取mqtt服务器地址成功202:获取mqtt服务器地址失败203:获取mqtt服务器地址返回的json数据错误204:mqtt连接成功205:mqtt dns解析失败206:mqtt连接错误,比如连接超时207:mqtt ssl handshake err208:mqtt连接失败209:订阅设备topic失败210:同步信息失败211:绑定成功212:绑定失败213:订阅app topic失败214:mqtt登录成功 215:设备绑定中216:设备绑定成功…… |
样例:5A5A 0009 00 2F5A 05 01 00D6 D24C
325-查询产品信息
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x06 | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 2F5B 06 BD7D
326-模组应答产品信息
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x07 | 1 | |
数据 | 产品uuid | 16 | |
产品modelid长度 | 1 | ||
产品modelid | n | 字符串 |
样例:
uuid:360f0b7d0aa14e88905725e9633ebf9f
modelid:lds.Light_RGBW.050100004
二进制协议如下:5A5A 002F 00 2F5B 07 360F0B7D0AA14E88905725E9633EBF9F 18 6C64732E4C696768745F524742572E303530313030303034 17F9
327-查询版本
模组查询MCU版本,MCU查询模组版本
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x08 | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 2F5D 08 D9FF
328-应答版本
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x09 | 1 | |
数据 | 主版本号 | 1 | |
次版本号 | 1 |
样例: 5A5A 0008 00 2F5D 09 01 00 FA3F
329-查询模组时间
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x0a | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 2F5E 0A E87E
3210-模组应答当前时间
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x0b | 1 | |
数据 | 年 | 2 | |
月 | 1 | ||
日 | 1 | ||
时 | 1 | ||
分 | 1 | ||
秒 | 1 |
样例:时间:2020-7-23 11:33:41
5A5A 000D 00 2F5E 0B 07E4 07 17 0B 21 29 24D4
3211-复位请求
模组请求MCU复位,MCU请求模组复位
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x0c | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 2F5F 0C 7AFF
3212-复位响应
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x0d | 1 | |
数据 | 复位状态 | 1 | 0:复位成功,其他值复位失败 |
样例:5A5A 0007 00 2F5F 0D 00 013A
3213-模组请求mcu节点列表
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x0e | 1 | |
数据 | - | 0 |
样例:5A5A 0006 00 1122 0E 273E
3214-mcu响应节点列表
设备有多个设备节点时,需要响应该协议
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x0f | 1 | |
数据 | 节点个数 | 1 | |
第一个节点id | 1 | ||
…… | …… | ||
第n个节点id | 1 |
样例:2个节点,节点id:01,03
5A5A 0009 00 1122 0F 02 01 03 D1DB
3215-模组透传ble协议给mcu
用于BLE遥控器控制WiFi模组+MCU的产品
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x10 | 1 | |
数据 | BLE数据长度 | 1 | |
BLE数据 | n |
样例: 5A5A 000B 00 124b 10 04 00010201 8668
3216-mcu应答ble协议
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x11 | 1 | |
数据 | 应答状态 | 1 | 0:成功,其他失败 |
应答的BLE数据长度 | 1 | ||
应答的BLE数据 | n |
样例:5A5A 0008 00 124b 11 00 00 E0D7
3217-mcu请求模组进入厂测模式
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x12 | 1 | |
数据 | wifi状态 | 1 | 0:未指定网卡,1:STA模式,2:AP模式,3:AP+STA模式 |
wifi ssid长度 | 1 | ||
wifi ssid | n | 字符串 | |
wifi密码长度 | 1 | ||
wifi密码 | n | 字符串 |
样例:
sta模式,
wifi ssid:LDSWifiLightTest,
wifi密码:123456789
二进制协议如下:5A5A 0022 00 2F59 12 01 10 4C4453576966694C6967687454657374 09 313233343536 373839 7041
3218-模组应答进入厂测结果
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x13 | 1 | |
数据 | 应答状态 | 1 | 0:成功,其他失败 |
样例:5A5A 0007 00 124B 13 00 097E
3219-软重启请求
模组请求MCU复位,MCU请求模组软重启
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x14 | 1 | |
数据 | - | 0 |
样例:样例 5A5A 0006 00 E548 14 BED0
3220-软重启响应
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x15 | 1 | |
数据 | 重启状态 | 1 | 0:响应重启成功,其他值复位失败 |
样例:5A5A 0007 00 E548 15 00 DDBF
4-功能属性协议
41-功能协议
411-设置获取请求
字段 | 说明 | 长度(bytes) | 描述 | ||
---|---|---|---|---|---|
控制码 | 0x40 | 1 | |||
数据 | 节点号 | 1 | 单节点设备为0xff | ||
请求类型 | 1 | 0:设置,1:获取 | |||
请求个数 | 1 | ||||
第一个请求 | 属性/方法ID | 2 | 获取属性ID=0xffff时,需要返回当前节点的所有属性 | ||
参数个数 | 1 | ||||
第一个参数 | 参数类型 | 1 | 1:int,2:string | ||
参数长度 | 1 | ||||
参数值 | n | ||||
…… | …… | ||||
第n个参数 | 参数类型 | 1 | 1:int,2:string | ||
参数长度 | 1 | ||||
参数值 | n | ||||
…… | |||||
第n个请求 | 属性/方法ID | 2 | |||
参数个数 | 1 | ||||
第一个参数 | 参数类型 | 1 | |||
参数长度 | 1 | ||||
参数值 | n | ||||
…… | …… | ||||
第n个参数 | 参数类型 | 1 | |||
参数长度 | 1 | ||||
参数值 | n |
样例:
-
设置属性
设置属性id=0x0001值为1,属性id=0x0002值为32
5A5A 001B 00 D0A2 40 FF 00 02 0001 01 01 04 00000001 0002 01 01 04 00000020 56E7设置属性
-
获取属性
获取属性获取0x0001的属性值
5A5A 000C 00 1741 40 FF 01 01 0001 00 3BFB
-
获取指定节点的所有属性
获取指定节点的所有属性
5A5A 000C 00 FA4D 40 FF 01 01 FFFF 00 6A1A4.
-
方法请求
方法请求方法id=15008,两个入参,第一个int参数=1,第二个int参数=1800
5A5A 0018 00 58FE 40 FF 00 01 3AA0 02 01 04 00000001 01 04 00000708 9A7B
412-设置获取响应,状态变化上报
字段 | 说明 | 长度(bytes) | 描述 | ||
---|---|---|---|---|---|
控制码 | 0x41 | 1 | |||
数据 | 节点号 | 1 | 单节点设备为0xff | ||
响应类型 | 1 | 0:设置,1:获取,2:上报 | |||
响应状态 | 2 | 0:成功,1:格式错误2:不支持0x03-0xffff:预留 | |||
响应/上报个数 | 1 | ||||
第一个响应/上报 | 属性/方法/事件ID | 2 | |||
参数个数 | 1 | ||||
第一个参数 | 参数类型 | 1 | 1:int,2:string | ||
参数长度 | 1 | ||||
参数值 | n | ||||
…… | …… | ||||
第n个参数 | 参数类型 | 1 | 1:int,2:string | ||
参数长度 | 1 | ||||
参数值 | n | ||||
…… | |||||
第n个响应/上报 | 属性/方法/事件ID | 2 | |||
参数个数 | 1 | ||||
第一个参数 | 参数类型 | 1 | |||
参数长度 | 1 | ||||
参数值 | n | ||||
…… | …… | ||||
第n个参数 | 参数类型 | 1 | |||
参数长度 | 1 | ||||
参数值 | n |
样例:
-
设置属性响应
5A5A 0014 00 1234 41 01 00 0000 01 0001 01 01 04 00000001 d136
-
获取属性响应
5A5A 0014 00 1234 41 01 01 0000 01 0001 01 01 04 00000001 5034
-
方法响应
5A5A 0019 00 1234 41 01 00 0000 01 3AA1 02 01 04 00000001 02 03 333436 5098
-
属性上报
当个属性id=0x0001上报
5A5A 0014 00 1122 41 02 02 0000 01 0001 01 01 04 00000001 0e4c
多个属性上报
5A5A 001d 00 1122 41 02 02 0000 02 0001 01 01 04 00000001 0002 01 01 04 00000034 14d5
-
事件上报
5A5A 001b 00 1122 41 02 02 0000 01 61B0 02 01 04 00001234 02 05 3132333435 9F52
42-产品功能
产品功能由云端根据设备的定义生成,分为事件、属性、方法
5-ota协议
51-ota协议
511-模组通知mcu有ota版本
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x80 | 1 | |
数据 | 主版本 | 1 | |
次版本 | 1 | ||
固件id | 16 | 字符串 | |
image文件大小 | 4 | ||
image文件crc16值 | 2 |
512-mcu请求ota数据
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x81 | 1 | |
数据 | 文件偏移值 | 4 | |
MCU可以接收image数据的最大长度 | 2 |
513-模组应答mcu-ota数据
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x82 | 1 | |
数据 | 状态值 | 1 | 0:成功,其他失败 |
文件偏移值 | 4 | ||
image数据长度 | 2 | ||
image数据 | n |
514-mcu通知模组升级结束
字段 | 说明 | 长度(bytes) | 描述 |
---|---|---|---|
控制码 | 0x83 | 1 | |
数据 | 状态值 | 1 | 0:成功,其他失败 |
升级重启时间(秒) | 1 |
52-ota流程
521-流程说明
- Wifi模组接收到升级通知后,获取MCU当前版本进行比对,如果版本不一样,通知MCU要升级的版本信息
例:版本1.20,image文件大小264192字节,固件id: ”123456789”
模组发送:
0x5a5a 001e 00 xxxx 80 01 14 00000000000000313233343536373839 00040800 xxxx xxxx
- MCU开始OTA,需要带上文件偏移值和每帧允许的最大image数据长度
例:
(1)第一帧数据,最大每帧256字节:
MCU发送:0x5a5a 000c 00 xxxx 81 00000000 0001 xxxx
MCU接收:0x5a5a xxxx 00 xxxx 82 00 00000000 0001 xx……xx xxxx
(2)第二帧数据,最大每帧256字节:
MCU发送:0x5a5a 000c 00 xxxx 81 00010000 0001 xxxx
MCU接收:0x5a5a xxxx 00 xxxx 82 00 00010000 0001 xxx……xx xxxx
……
- MCU获取OTA数据完成后,通知模组此次OTA是否成功和切换镜像重启MCU需要的时间
例:
MCU发送:0x5a5a 0008 00 xxxx 83 00 05 xxxx
- 模组接收到MCU的升级结束信息后,如果升级成功,升级重启时间后开始查询MCU版本信息,如果版本跟要升级的一样,通知云端升级成功
522-异常处理
- 模组下载中断电,不做处理
- 模组下载完成,与MCU传输文件中断电,重新上电后,通知MCU有升级信息,待MCU来请求数据
6-附录
61-crc16计算代码
unsigned short get_crc16(unsigned char *data, signed int len, unsigned short crc)
{
static unsigned short poly[2] = {0, 0xa001};
signed int i, j;
for (j = len; j > 0; j--) {
signed int ds = *data++;
for (i = 0; i < 8; i++) {
crc = (crc >> 1) ^ poly[(crc ^ ds) & 1];
ds = ds >> 1;
}
}
return crc;
}