接口与单片机连接。
- 接口是抽象接口,可以是CAN、uart,也可以其他。
- 接口对应的上位设备,可以是pc上位机、lora模块、4G模块、wifi模块、蓝牙模块等。
上位设备分成透传设备、需进一步协议处理设备(如,AT指令设备),还有支持二度开发的上位设备。
- 透传设备,单片机直接处理上位设备发过来的内容,这种只需要规定协议格式就好,比如json格式,比如自定义格式(1标头-2字节是长度-3数据)。
- 协议处理设备,单片机需要进一步解析的设备,比如AT指令,需要解析AT指令之后拿到真正的数据,再度解析真正数据,需要两步解析。AT指令是比较完善的指令,不会出现粘包,少包问题。
- 二度开发的设备,这个设备通常需要二度开发,其实就是AT指令的本身,相当于封装了一种AT指令,但是不会定义成AT指令,只会模仿。这种设备通常是一个辅助MCU。
升级方式
方式1
设备上报运行时状态才用MQTT,如果涉及到OTA升级,应该尽量使用HTTP的方式,也就是说,单片机的上位设备模块退出MQTT长连接模式,切换成HTTP短连接模式。
流程:接收到mqtt发送过来的升级指令,或者自己比对版本发现差异,主动断开MQTT连接,切换成HTTP方式。分段下载更新,完成之后,重新建立MQTT连接。
方式2
单片机资源少,ram少,而且又没有外挂flash,上位设备不想进行mqtt和http连接切换。只使用MQTT构建一个自定义的可靠报文传输协议。QoS 1(确保消息至少到达一次),并在设备端做幂等处理。
协议规定
OTA升级协议规定。远程升级。
方式1
这个比较简单,只要把文件传输到oss服务器中就行了,当设备请求后端服务器之后①,返回oss下载链接,通过下载链接分块下载内容。对后端服务器开销很小。第①步记录更新开始,单片机更新完成之后再调用后端接口记录更新结束。
单片机端定义结构体,struct upgrader,包含,第几个块blank,长度firmware_size,crc32,
方式2
全程MQTT,这个比较有挑战。需要后端全程接管,每次处理单片机数据都要从oss中分块拿到数据,再封装返回给单片机。
自定义二进制协议(例如 1 字节类型 + 2 字节块号 + 数据)
**json方式:**1.数据块用数组的方式传输。2.使用base64的方式传输。
数据协议规定:
- 设备端:
- 服务端: