20.mqtt
MQTT 简介
DJI上云API部分接口采用了物联网通用的MQTT5.0协议标准,具体的MQTT5.0协议详细介绍可以参考链接:MQTT5.0
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。
本协议运行在TCP/IP,或其它提供了有序、可靠、双向连接的网络连接上。它有以下特点:
使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。
消息传输不需要知道负载内容。
提供三种等级的服务质量(QoS):
“最多一次”:尽操作环境所能提供的最大努力分发消息。消息可能会丢失。例如,这个等级可用于环境传感器数据,单次的数据丢失没关系,因为不久之后会再次发送。
“至少一次”:保证消息可以到达,但是可能会重复。
“仅一次”:保证消息只到达一次。例如,这个等级可用在一个计费系统中,这里如果消息重复或丢失会导致不正确的收费。
很小的传输消耗和协议数据交换,最大限度减少网络流量。
异常连接断开发生时,能通知到相关各方。
MQTT 术语
应用消息 Application Message
MQTT协议通过网络传输应用数据。应用消息通过MQTT传输时,它们有关联的服务质量(QoS)和主题(Topic)。
客户端 Client
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以
打开连接到服务端的网络连接
发布应用消息给其它相关的客户端
订阅以请求接受相关的应用消息
取消订阅以移除接受应用消息的请求
关闭连接到服务端的网络连接
服务端 Server
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
接受来自客户端的网络连接
接受客户端发布的应用消息
处理客户端的订阅和取消订阅请求
转发应用消息给符合条件的已订阅客户端
关闭来自客户端的网络连接
会话 Session
客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
订阅 Subscription
订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器。
共享订阅 Shared Subscription
一个共享订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。一个共享订阅可以与多个订阅会话相关联,便于支持大范围消息交换模式。一条主题匹配的应用消息只发送给关联到此共享订阅的多个会话中的一个会话。一个会话可以包括多个共享订阅,可以同时包含共享订阅与非共享订阅。
通配符订阅 Wildcard Subscription
通配符订阅是指主题过滤器(Topic Filter)包含一个或多个通配符的订阅。通配符订阅使得一次订阅匹配多个主题名(Topic Name)。
主题名 Topic Name
附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
主题过滤器 Topic Filter
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。
MQTT控制报文 MQTT Control Packet
通过网络连接发送的信息数据包。MQTT 规范定义了十四种不同类型的MQTT控制报文,其中一个(PUBLISH 报文)用于传输应用消息。
无效报文 Malformed Packet
根据规范不能被正确解析的控制报文。
协议错误 Protocol Error
在报文解析之后发现包含协议不允许或与客户端或服务端当前状态不一致的数据的错误。
遗嘱消息 Will Message
在网络连接非正常关闭的情况下,由服务端发布的应用消息。
MQTT 消息模型
设备上云平台采用的是消息模型Pub/Sub架构。所有接入上云的设备都为消息模型中的一个Client。
Client
在消息模型中,所有与中心化Broker建立连接的设备都为 Client。
Broker
消息网关,在消息模型中,有消息的生产者和消费者,类似房产行业的买方和卖方,broker要促成两者的交易,即完成消息从生产者到消费者中转的功能。
Topic
多个客户端基于同样的Topic进行订阅,然后基于该Topic进行信息发送和消费。在有些消息模型方案中也称为Subject或者Channel。分隔符DJI无人机云平台以正斜线(/)进行分层, 如/sys/device/register。
Message
基于Topic发送的消息内容。
Subscription
当Client连接Broker后,需要进行Topic的订阅,才可以收到该Topic下的所有消息,否则不会收到任何来自其他Client的消息。
消息模型

大疆机场、DJI Pilot 2以及Web网页,都可以以Client身份与Broker建立长连接,通过Broker将信息精准推送到各个需要的Client。比如Pilot将设备状态信息推送到Broker,通过两个Web客户端实时显示。
Broker为连接消息路由的服务器。通过Broker,可以实现订阅了某个Topic的Client能及时的收到来自该Topic Pub的信息。

MQTT Topic格式
Topic前缀列表
基础类Topic
sys/
任何设备都通用的上云功能,比如设备注册,设备生命周期状态更新等功能
物模型类Topic
thing/
支撑实现各设备物模型定义的功能的Topic,主要围绕Property,Service,Event展开
message(payload)格式
{
"tid": "xxxx", # 该消息的tid,用于reply监听
"bid": "xxxx", # 监听service结果的消息bid,service中的异步方法不需要监听
"method": "xxx", # 物模型文件中的service的tidentifier
"data": { # Payload具体信息
"properties":{}, # 用于表示设备属性
"result":{}, # 用于表示ack消息中的事件结果(是否成功)
"output":{}, # 用户表示上行的event或者service附带的额外信息,属于extention内容
"event":{}, # 用于表示设备事件,具体使用在物模型的event Topic中
},
"timestamp": xxxx, # 消息发送时的13位Unit时间戳(毫秒)
}Last updated