# 阿里云MCU OTA协议

日期

版本

说明

2020.7.20

1.0

初次发布

2020.9.17

1.1

删除0x33的mcu响应指令

新增0x34指令

2020.10.12

1.2

MCU收到 0x34 指令后,需要延时 200ms 进入Ymodem

2020.12.30

1.3

1 增加WiFi 固件OTA时的通知指令

2 增加MCU查询MCU OTA固件的版本、长度、MD5

2021.1.6

1.4

1 增加MCU OTA示例

2 增加 MCU OTA 的版本、长度MD5的通知指令

2021.9.3

1.5

1 删除33指令

2022.9.19

1.6

mcu版本号可以自定义

#MCU OTA 指令集

#获取MCU固件版本号

WiFi->MCU

CMD

PAYLOAD

说明

0x31

0x00

预留

MCU->WiFi

#上报MCU固件版本号

MCU->WiFi

CMD

PAYLOAD

说明

0x32

n bytes (string)

MCU固件版本号; 最大值32

WiFi->MCU

CMD

PAYLOAD

说明

0x32

0x00

MCU固件版本号设置成功

0x01

MCU固件版本号设置失败

  • mcu 版本号,必须是 xxxx-abc****

    • xxxx 不能包含 - ;将会成为 mcu ota时的模块名称
    • abc 必须是数字 0~9
    • 例如:stm32f215-100

#MCU请求开始固件升级

MCU->WiFi

CMD

PAYLOAD

说明

0x34

0x00

进入MCU OTA模式,128字节

0x01

进入MCU OTA模式,1024字节

WiFi->MCU

CMD

PAYLOAD

说明

0x34

0x00

WiFi模组进入Ymodem模式成功

0x01

WiFi模组进入Ymodem模式失败

#MCU查询MCU OTA固件版本

MCU->WiFi

CMD

PAYLOAD

说明

0x35

0x00

查询MCU OTA固件版本信息

WiFi->MCU

CMD

PAYLOAD

说明

0x35

0x00

没有MCU OTA固件

n bytes

json 字符串格式,后续会扩展

该指令可以在指令模式下任意时间发送。 json格式:

{
    "fw_ver": "mcu-101",
    "fw_len": 886864,
    "fw_md5": "8E8DD18D6B4C1006A0BB57EFCFD41874"
}

#通知MCU开始WiFi模组自身固件升级

WiFi->MCU

CMD

PAYLOAD

说明

0x36

n bytes(string)

设备当前WiFi固件版本号(OTA之前的版本)

MCU->WiFi

该指令说明,固件已经下载完成,并且校验正确,模组将重启启动,开始模组自身的更新,持续时间20s~30s不等。

#通知MCU OTA的版本、长度、MD5

WiFi->MCU

CMD

PAYLOAD

说明

0x37

n bytes

json 字符串格式,后续会扩展

MCU->WiFi

该指令的数据格式与0x35指令的数据格式一致

#升级流程

#流程说明

  1. WiFi模组接收到云端下发的 MCU OTA 升级指令
  2. WiFi模组下载固件并校验固件完整性
  3. WiFi模组发送通知MCU开启固件升级的指令
  4. MCU请求WiFi模组进入Ymode模式,
  5. WIFI响应请求应答,如果检查到WiFi模组中存在MCU固件,WiFi模组进入 Ymodem 模式, WiFi模组关闭所有串口指令MCU端延时 200ms 后,再进入Ymodem模式
  6. MCU与WiFi模组通过 Ymodem 协议,传输 mcu 的ota 固件,固件传输完成后,WiFi模组打开所有串口指令
  7. MCU OTA成功后,发送 重启指令
  8. WiFi模组应答指令
  9. 重启模组
  10. 模组通过获取MCU固件版本号指令,请求MCU固件版本号
  11. MCU通知上报MCU固件版本号指令,上报MCU固件版本号
  12. WiFi模组应答指令
  13. WiFi模组向云端上报MCU固件版本号

#升级要求

  1. MCU应用程序必须要有bootloader模式
  2. bootloader必须支持Ymodem协议
  3. OTA固件必须包含完整性校验
  4. MCU应用程序应该在适当的时候上报版本号,一是在WiFi请求mcu版本时;二是在mcu升级成功后
  5. MCU可以在模组启动初期上报版本号
  6. 如果模组在发送请求固件版本号之前收到了MCU上报的固件版本,模组将不再发送请求MCU固件版本号指令

#Ymodem 协议

     Ymodem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。

YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送会使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。

Ymodem支持128字节和1024字节一个数据包。128字节以(SOH)开始,1024字节以(STX)开始。

1.起始帧的数据格式

YModem的起始帧并不直接传输文件的数据,而是将文件名与文件的大小放在数据帧中传输,它的帧长=3字节数据首部+128字节数据+2字节CRC16校验码=133字节。它的数据结构如下:

SOH 00 FF  filename  filezise NUL  CRCH CRCL

其中SOH=0x01,表示这个数据帧中包含着128个字节的数据(STX表示1024字节,初始帧只有128个),00表示数据帧序号,初始是0,依次向下排,FF是帧序号的取反,filename是要传输的文件名,如USTB_V3_1.0.1.26_NMEA.Bin,它在数据帧中的格式为:55 53 54 42 5F 56 33 5F 31 2E 30 2E 31 2E 32 36 5F 4E 4D 45 41 2E 42 69 6E 00,也就是把ASCII码转成十六进制,但是最后一定要在文件名后加上00,表示文件名的结束;filesize表示文件的大小,如上面的USTB_V3_1.0.1.26_NMEA.Bin大小是132KB,也就是135168Byte,它在数据帧中的格式就是31 33 35 31 36 38 ,也就是ASCII的“135168”,同样最后要加上00表示结束,NUL就是数据部分的128字节中除去文件名和文件大小占据的剩下的字节都用00填充,CRCH和CRCL分别表示16位CRC校验码的高8位与低8位。

2.数据帧的数据格式

    YModem的数据帧中会预留1024字节空间用来传输文件数据,它跟起始帧接收差不多,如下:

STX 01 FEdata[1024] CRCH CRCL

其中STX=0x02,表示这帧数据帧后面包含着1024字节的数据部分;01是表示帧序号,FE是它的取反,再下一帧数据就是02 FD,以此类推;data[1024]表示存放着1024字节的文件数据;CRCH与CRCL是CRC16检验码的高8位与低8位。

如果文件数据的最后剩余的数据在128~1024之间,则是使用SOH的128字节传输,

有一种特殊的情况:如果数据不满128字节,剩余的数据用0x1A填充这是数据帧的结构就变成了:

文件大小小于128字节

SOH 01 FE data[ ] 1A ...1A CRCH CRCL  

文件最后剩余数据小于128字节

SOH 01 FE data[ ] 1A...1A CRCH CRCL

3.结束帧数据结构

    YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:

SOH 00 FF NUL[128] CRCH CRCL

结束帧同样以SOH开头,表示后面跟着128字节大小的数据;结束帧的帧序也认为是00 FF;结束帧的128字节的数据部分不存放任何信息,即全部用00填充。

#示例

以 128字节为一个数据包的Ymodem例。数据交互以MCU为视角,OTA数据包大小为 656 bytes。

Phase  Data                                                               Description
-----  --------------------------------------------------------------     ------------
OUT    c0 34 00 00  d0                                                    MCU 请求开启 MCU OTA
IN     c0 34 00 00  d0                                                    WiFi 响应 MCU 成功 
OUT    43                                                                 C
IN     01 00 ff 6d  63 75 2d 31  30 31 00 36  35 36 00 00  ... CRC16      文件名:mcu-101 ;长度:656
OUT    06                                                                 ACK
OUT    43                                                                 C
IN     01 01 fe 31  32 33 34 35  36 37 38 39  30 31 32 33  ... CRC16      128 Data
OUT    06                                                                 ACK
IN     01 02 fd 37  38 39 30 31  32 33 34 35  36 37 38 39  ... CRC16      128 Data
OUT    06                                                                 ACK
IN     01 03 fc 31  32 33 34 35  36 37 38 39  30 31 32 33  ... CRC16      128 Data
OUT    06                                                                 ACK
IN     01 04 fb 37  38 39 30 31  32 33 34 35  36 37 38 39  ... CRC16      128 Data
OUT    06                                                                 ACK
IN     01 05 fa 31  32 33 34 35  36 37 38 39  30 31 32 33  ... CRC16      128 Data
OUT    06                                                                 ACK
IN     01 06 f9 37  38 39 30 31  32 33 34 35  36 37 38 39  ... CRC16      128 Data
OUT    06                                                                 ACK
IN     04                                                                 EOT
OUT    15                                                                 NAK
IN     04                                                                 EOT
OUT    06                                                                 ACK
OUT    43                                                                 C
IN     01 00 ff 00  00 00 00 00  00 00 00 00  00 00 00 00  ... CRC16      结束包
OUT    06                                                                 ACK

通过 Bus Hound 抓包,完整的交互流程如下图。

更新时间: 2023/7/12 14:10:31