1. 概述

协议设计部分主要用来描述mqtt交互的数据包格式。

#mermaid-svg-iqKAgzLCeIHxInrH {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iqKAgzLCeIHxInrH .error-icon{fill:#552222;}#mermaid-svg-iqKAgzLCeIHxInrH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iqKAgzLCeIHxInrH .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iqKAgzLCeIHxInrH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iqKAgzLCeIHxInrH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iqKAgzLCeIHxInrH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iqKAgzLCeIHxInrH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iqKAgzLCeIHxInrH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iqKAgzLCeIHxInrH .marker.cross{stroke:#333333;}#mermaid-svg-iqKAgzLCeIHxInrH svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iqKAgzLCeIHxInrH .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-iqKAgzLCeIHxInrH .cluster-label text{fill:#333;}#mermaid-svg-iqKAgzLCeIHxInrH .cluster-label span{color:#333;}#mermaid-svg-iqKAgzLCeIHxInrH .label text,#mermaid-svg-iqKAgzLCeIHxInrH span{fill:#333;color:#333;}#mermaid-svg-iqKAgzLCeIHxInrH .node rect,#mermaid-svg-iqKAgzLCeIHxInrH .node circle,#mermaid-svg-iqKAgzLCeIHxInrH .node ellipse,#mermaid-svg-iqKAgzLCeIHxInrH .node polygon,#mermaid-svg-iqKAgzLCeIHxInrH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iqKAgzLCeIHxInrH .node .label{text-align:center;}#mermaid-svg-iqKAgzLCeIHxInrH .node.clickable{cursor:pointer;}#mermaid-svg-iqKAgzLCeIHxInrH .arrowheadPath{fill:#333333;}#mermaid-svg-iqKAgzLCeIHxInrH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iqKAgzLCeIHxInrH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iqKAgzLCeIHxInrH .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-iqKAgzLCeIHxInrH .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-iqKAgzLCeIHxInrH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iqKAgzLCeIHxInrH .cluster text{fill:#333;}#mermaid-svg-iqKAgzLCeIHxInrH .cluster span{color:#333;}#mermaid-svg-iqKAgzLCeIHxInrH 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-iqKAgzLCeIHxInrH :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

MQTT

主题

Mqtt Broker

c1

c2

c3

c4

2. 协议内容

2.1 协议框架

复杂通信系统协议通常采用分层设计,方便不同业务做相对应的过滤和分发处理。
MQTT协议的应用设计包含主题和Payload,可以理解为连接到同一个MQTT Broker的设备同属于一套通信系统,主题和Payload是MQTT的第一分层逻辑。
业务上的分层逻辑可以在主题和Payload进一步设计。

2.2 主题

我们设置两类主题,主要用来明确数据包的目标接收方。
设备端接收主题(文中简称TopicToServer): /v1/[key]/device       
服务端接收主题(文中简称TopicToServer): /v1/[key]/server

【注】主题中[key]做设备的唯一id, 可以是mac地址,UUID等。

2.3 Payload协议设计

协议采用json格式。

2.3.1 基本格式

Payload: {"id":x,"type":"","UUID":"","parm":{}}

说明:
id: 由数据包主动发起方各自维护,应答数据包的id需要跟请求包一致。
type: 数据包类型区分的关键字。
parm: 参数详情根据type的不同而变化。
UUID: 设备唯一ID

2.3.2 文件信息传输

主题: TopicToServer
Payload: {"id":x,"type":"fileInfo","UUID":"","parm":{"fileName":"x","fileType":"x","contentFormat":"","packageNums":x}}

说明:
type: fileInfo 文件信息传输包。
parm:
fileName: 传输的文件名称
fileType: 传输文件类型
raw – 原始文件,没有压缩
zip – zip压缩包
rar – rar压缩包
tar – tar压缩包
tgz – tar.gz压缩包
tbz2- tar.bz2压缩包
contentFormat: 内容格式
ascii – ascii格式
hex – 十六禁止数据格式
packageNums:分包数量

2.3.3 文件信息传输应答

主题: TopicToDevice
Payload: {"id":x,"type":"fileInfoAck","UUID":"","parm":{"fileName":"文件名称","fileType":"raw","contentFormat":"","packageNums":x}}

说明:
type: fileInfoAck 文件信息输应答
parm: 参数详见fileInfo

2.3.4 文件内容传输

主题: TopicToServer
Payload: {"id":x,"type":"fileContent","UUID":"","parm":{"fileName":"文件名称","content":"","packageID":x}}

说明:
type: fileContent 文件内容传输包
parm:
fileName:文件名称
content: 传输的文件内容,以base64编码
packageID: 分包的包序号,范围从0到packageNums-1

2.3.5 文件内容传输应答

主题: TopicToServer
Payload: {"id":x,"type":"fileContentAck","UUID":"","parm":{"fileName":"文件名称","packageID":x}}

说明:
type: fileContentAck 文件内容传输应答
parm:
fileName:文件名称
packageID: 分包的包序号,范围从0到packageNums-1

2.3.6 文件传输完成

主题: TopicToServer
Payload: {"id":x,"type":"fileEnd","UUID":"","parm":{"fileName":"文件名称","fileType":"x","contentFormat":"","packageNums":x,"base64MD5":""}}

说明:
type: fileEnd 文件传输完成。
parm:
fileName: 传输的文件名称
fileType: 传输文件类型
raw – 原始文件,没有压缩
zip – zip压缩包
rar – rar压缩包
tar – tar压缩包
tgz – tar.gz压缩包
tbz2- tar.bz2压缩包
contentFormat: 内容格式
ascii – ascii格式
hex – 十六禁止数据格式
packageNums:分包数量
base64MD5: 传输文件内容MD5

2.3.7 文件传输完成应答

主题: TopicToDevice
Payload: {"id":x,"type":"fileEndAck","UUID":"","parm":{"fileName":"文件名称","base64MD5":""}}

说明:
type: fileEndAck 文件传输完成应答。
parm:
fileName: 传输的文件名称
base64MD5: 传输文件内容MD5

2.4 上传和下载

文件传输包含上传和下载,以上协议完成了协议上传的正给流程。文件的下载步骤跟上传步骤一样,过程总只需互换请求和应答的主题即可满足文件下载功能。
物联沃分享整理
物联沃-IOTWORD物联网 » MQTT文件传输:协议篇

发表评论