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文件的发送和接收完整设计思路。
版权归原作者 菠萝卜 所有, 如有侵权,请联系我们删除。