MQTT文件传输 -1. 设计篇

1. 前言

IOT嵌入式开发中,三方交互MQTT已经成为很多人的首选。但是MQTT通常只用来做小数据量的业务传输。文件的上传和下载主要还是用http实现。最近实现远程日志查询时,选择通过MQTT实现文件上传。下面分析下实现逻辑。

2. MQTT文件上传设计

MQTT文件上传分为以下几步:

2.1 文件压缩

文件压缩类型可以有多种可选: 源文件 / zip / .tar.gz / .tar
具体类型根据文件大小和收发双发支持类型具体定义。

发送文件信息,包含文件大小,压缩格式,分包总数。并作ack确认。

2.2 文件分包

嵌入式设备内存资源相对较小,且MQTT是居于CS模式,交互双方是C->S->C, 降低Broker负担,逻辑上会设计分包传输。

#mermaid-svg-Va7RQNsUCMEpuS8Q {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .error-icon{fill:#552222;}#mermaid-svg-Va7RQNsUCMEpuS8Q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Va7RQNsUCMEpuS8Q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .marker.cross{stroke:#333333;}#mermaid-svg-Va7RQNsUCMEpuS8Q svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Va7RQNsUCMEpuS8Q .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .cluster-label text{fill:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .cluster-label span{color:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .label text,#mermaid-svg-Va7RQNsUCMEpuS8Q span{fill:#333;color:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .node rect,#mermaid-svg-Va7RQNsUCMEpuS8Q .node circle,#mermaid-svg-Va7RQNsUCMEpuS8Q .node ellipse,#mermaid-svg-Va7RQNsUCMEpuS8Q .node polygon,#mermaid-svg-Va7RQNsUCMEpuS8Q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Va7RQNsUCMEpuS8Q .node .label{text-align:center;}#mermaid-svg-Va7RQNsUCMEpuS8Q .node.clickable{cursor:pointer;}#mermaid-svg-Va7RQNsUCMEpuS8Q .arrowheadPath{fill:#333333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Va7RQNsUCMEpuS8Q .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Va7RQNsUCMEpuS8Q .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Va7RQNsUCMEpuS8Q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Va7RQNsUCMEpuS8Q .cluster text{fill:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q .cluster span{color:#333;}#mermaid-svg-Va7RQNsUCMEpuS8Q div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Va7RQNsUCMEpuS8Q :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

设备端

业务服务端

MQTT Broker

2.3 文件编码

文件内容格式有二进制或者字符串,协议设计上通过base64编码成字符串,然后做MD5技算。

2.4 MQTT传输

将base64编码后的数据打包成mqtt对应的文件传输协议包,发送到指定主题。
文件传输,我们业务上采用req->ack方式,每包都做ack确认。收到ack确认包后,才做下一帧传输。如果没收到确认包,可增加重传机制。
循环执行2.3->2.4步骤,直到整包文件传输结束。 

2.5 传输完成

文件传输完成后,设备上报文件传输完成包,并带上对应的MD5校验。

3. 文件接收

3.1 接收文件信息.
3.2. 接收文件分包,直到接收文件传输完成。
3.2 通过MD5校验确认包完整性.
3.3 base64解码。
3.4 根据文件的压缩格式解压得到目标文件。

4. 完成

至此完成mqtt文件的发送和接收完整设计思路。
物联沃分享整理
物联沃-IOTWORD物联网 » MQTT文件传输 -1. 设计篇

发表评论