新大陆云平台 MQTT协议
-
下面引用新大陆云平台的MQTT协议说明:http://www.nlecloud.com/doc/devicedev/#MQTT%E5%8D%8F%E8%AE%AE
-
MQTT协议接入
1.协议介绍
请移步至“资料下载” -> “NLECloud MQTT协议”下载打开查看,协议定义了 连接请求、连接响应、 上报数据、上报数据确认、命令请求、命令响应、心跳请求、心跳响应等过程的报文格式;以JSON数据格式定义。
2.建立TCP连接
开展和接入服务器的TCP连接。
连接协议 证书 地址 端口
MQTT mqtt.nlecloud.com 1883
MQTTS 证书下载 mqtt.nlecloud.com 8883
MQTTS在MQTT协议的基础上加入了SSL/TLS(在SSL/TLS上的MQTT)来提供物联网设备与云平台直接的安全通信功能,设备携带云平台提供的根证书;在使用8883端口建立TLS连接时,设备客户端既对NLECloud进行单向验证, 由此,便对中间人攻击带来了较高的要求。TLS单向验证大致流程如下:
云平台和设备从CA证书中心取得CA证书(也称根证书),云平台申请生成自已的私钥和证书,客户端用CA证书对云平台的证书进行验证,验证通过说明服务端是合法的,如果验证不过则不与云平台通信。 验证通过之后使用一对公钥和密钥进行加解密通信,中间的报文都是加密的。
3.设备与平台进行握手连接
使用记录好的“设备标识”和“传输密钥”做为参数,组织相应的CONNECT报文发送到平台进行握手,建立MQTT连接。 云平台支持"普通鉴权"或"安全鉴权"方式进行接入验证连接,详见 接入安全鉴权,以下为安全鉴权方式的代码示范:设备创建时,平台为每个设备分配了唯一的传输密钥(SecretKey),设备接入时需要使用 SecretKey 计算出的访问token 来进行访问安全认证, 设备可通过MQTT connnect报文进行连接,connect报文中三要素填写方法如下:
参数 是否必须 参数说明
clientId 是 设备序列号
username 是 创建设备时平台分配的设备ID
password 是 填写经过 SecretKey 计算的 token
本例中,password = 经过SecretKey计算的token = clientId & username & method & timestamp & sign
timestamp:表示访问过期时间戳 timestamp,当访问参数中的timestamp时间小于当前时间时,平台会认为访问参数过期从而拒绝该访问。
method:表示签名算法类型。支持md5,sha1和sha256。
sign:表示clientId,projectId,method,timestamp,secretKey五个参数值按固定排序依次拼接(参数间不需要任何拼接字符),使用method对应的签名算法加签。 详见 安全鉴权方式 -
新大陆物联网云平台 《设备接入MQTT协议.doc》
版本 日期 修订内容 创建/修订者
v1.1 2017-07-19 初始版本 cs
v2.0 2019-03-29 修改CONNECT的UserName值为项目ID;加入订阅/取消订阅功能;补充接入流程的详细说明等 cs
v2.1 2019-06-13 修改命令请求与响应的cmdid为字符型 cs
v2.2 2019-08-20 添加CONNECT的鉴权方式 cs
v2.3 2020-06-09 添加SSL/TLS说明描述 cs
V2.4 2020-08-24 修改订阅与/取消订阅固定头报文输写错误 cs
1说明
MQTT逐渐成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和执行器的通信协议。MQTT原版协议介绍请参见MQTT version 3.1.1官方文档,本文档对此不做详细说明。
2接入流程
2.1访问平台http://www.nlecloud.com 注册帐号
2.2平台以项目为单位,一个项目下可以有多个设备,每个设备可以包含多个传感器,所以依次添加项目、设备、传感器,其中在添加设备时在“通讯协议”一栏中可以选择TCP\MQTT\CoAP\HTTP等方式
2.3操作以上功能时顺便记录下:设备标识(device)、设备传输密钥(key)等信息
2.4硬件设备发送TCP连接请求到以下地址,发送以下各项数据报文与平台进行交互
2.5平台接入服务器地址mqtt.nlecloud.com,MQTT端口1883
2.6(可选)平台实现了SSL/TLS,来提供物联网设备与云平台直接的安全通信功能,如果使用TLS加密,需要下载根证书,端口为8883
3MQTT Packet格式说明
包格式包含三部分:
Fixed Header 所有packet中都必须有
Varable Header 部分包含有
Payload 部分包含有
3.1 Fixed header
Bit 7 6 5 4 3 2 1 0
byte 1 MQTT Packet Type 0 0 0 0
byte2 - 5 Remaining Length(该字段占用1-4个字节)
该版本支持的所有类型:
名字 值 流向 描述
CONNECT 1 C->S 客户端请求与服务端建立连接
CONNACK 2 S->C 服务端确认连接建立
PUBLISH 3 CS 发布消息
PUBACK 4 CS 收到发布消息确认
PUBREC 5 CS 发布消息收到
PUBREL 6 CS 发布消息释放
PUBCOMP 7 CS 发布消息完成
SUBSCRIBE 8 C->S 订阅请求
SUBACK 9 S->C 订阅确认
UNSUBSCRIBE 10 C->S 取消订阅
UNSUBACK 11 S->C 取消订阅确认
PING 12 C->S 客户端发送PING(连接保活)命令
PINGRSP 13 S->C PING命令回复
DISCONNECT 14 C->S 断开连接
3.2 Variable Header &Payload
消息类型 Variable Header Payload
CONNECT 有 有
CONNACK 有 有
PUBLISH 有 有
PUBACK 有 无
PUBREC 有 无
PUBREL 有 无
PUBCOMP 有 无
SUBSCRIBE 有 有
SUBACK 有 有
UNSUBSCRIBE 有 有
UNSUBACK 有 无
PING 无 无
PINGRSP 无 无
DISCONNECT 无 无
4支持的Packet列表
4.1 CONNECT:连接请求(client)->(server)
客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文,请求报文格式如下:
4.1.1 Fixed Header
Bit 7 6 5 4 3 2 1 0
byte 1 MQTT Packet Type 0 0 0 0
byte2 - 5 Remaining Length(该字段占用1-4个字节)
4.1.2 VariableHeader
Bit Description 7 6 5 4 3 2 1 0
byte 1-2 ProtocolName Length 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
byte 3 ‘M’ 0 1 0 0 1 1 0 1
byte 4 ‘Q’ 0 1 0 1 0 0 0 1
byte 5 ‘T’ 0 1 0 1 0 1 0 0
byte 6 ‘T’ 0 1 0 1 0 1 0 0
Byte7 Protocol Level 0 0 0 0 0 1 0 0
Byte8 Connect Flag User
flag Password
flag WillRetain
Flag WillQos Flag WillFlag CleanSession
Flag Reserve
Byte9-10 KeepAlive
详细分解说明
名称 说明 示例
Protocol Level 版本 必须设置为4,平台只支持版本v 3.1.1,不支持更老的版本。使用第三方客