更多内容请访问:Harmonyos.51cto.com/#zz,与华为官方共同成立的鸿蒙技术社区1.MQTT简介(MessageQueuingTelemetryTransport,MessageQueuingTelemetryTransmissionProtocol)是一种基于发布/订阅(publish/subscribe)模型的“轻量级”通信协议,它建立在TCP/IP协议之上,由IBM于1999年发布。MQTT最大的优势在于它可以提供真实的-以极少的代码和有限的带宽为连接的远程设备提供时间和可靠的消息服务。作为一种低开销、低带宽的即时通讯协议,它在物联网、小型设备和移动应用中有着广泛的应用。MQTT是一种基于客户端-服务器的消息发布/订阅传输协议。MQTT协议轻量级、简单、开放、易于实现。这些特点使其应用广泛。在许多情况下,包括受限环境,例如机器对机器(M2M)通信和物联网(IoT)。它广泛用于通过卫星链路通信的传感器、偶尔拨号的医疗设备、智能家居和一些小型化设备。2.设计规范由于物联网环境非常特殊,MQTT遵循以下设计原则:(1)精简,不添加可有可无的功能;(2)发布/订阅(Pub/Sub)模式,方便传感器之间的消息传递;(3)允许用户动态创建话题,零运维成本;(4)尽量减少传输量,提高传输效率;(5)低带宽、高延迟、网络不稳定等因素综合考虑;(6)支持连续会话控制;(7)了解客户端的计算能力可能较低;(8)提供服务质量管理;(9)假设数据是不可知的,不强制传输数据的类型和格式,要灵活。3.主要特点MQTT协议是一种旨在在低带宽、不可靠网络中与远程传感器和控制设备进行通信的协议。它具有以下主要特点:(1)采用发布/订阅消息模式,提供一对多的发布消息,解耦应用。这一点和XMPP很相似,但是MQTT的信息冗余比XMPP要小很多,因为XMPP使用XML格式的文本来传输数据。(2)有效载荷内容屏蔽的消息传输。(3)使用TCP/IP提供网络连接。主流的MQTT是基于TCP连接进行数据推送的,但是也有基于UDP的版本,叫做MQTT-SN。由于这两个版本基于不同的连接方式,其优缺点自然是不同的。(4)消息发布有3种服务质量:“最多一次”,消息发布完全依赖于底层的TCP/IP网络。可能会发生消息丢失或重复。这个级别可以用在以下几种情况,环境传感器数据,一条读记录丢了也没关系,因为近期会有第二次发送。这种方式主要针对普通APP的推送。如果消息推送时您的智能设备没有联网,则之前没有收到推送,再次联网时也不会收到。“至少一次”,确保消息到达,但可能会出现消息重复。“仅一次”,确保消息到达一次。该级别可用于一些要求严格的计费系统。在计费系统中,重复或丢失的消息会导致不正确的结果。这种最高质量的消息发布服务,也可以用于即时通讯APP推送,保证用户收到且只收到一次。(5)开销很小的小规模传输(定长头为2字节),尽量减少协议交换,减少网络流量。这就是为什么在介绍中说它非常适合“在物联网领域,传感器和服务器之间的通信,以及信息采集”。要知道嵌入式设备的计算能力和带宽都比较弱,使用这种协议来传输消息是比较合适的。但仅此而已。(6)利用LastWillandTestament特性通知相关方客户端异常中断的机制。LastWill:即最后遗嘱机制,用于通知同一主题下的其他设备,发送最后遗嘱的设备已断开连接。遗嘱:遗嘱机制,功能类似于LastWill。4.MQTT协议的原理4.1MQTT协议的实现MQTT协议的实现需要完成客户端与服务端的通信。在通信过程中,MQTT协议中存在三种身份:发布者(Publish)、代理者(Server)、订阅者(Subscribe)。其中,消息的发布者和订阅者是客户端,消息代理是服务器,消息的发布者可以同时是订阅者。MQTT传输的消息分为主题(Topic)和负载(payload)两部分:(1)主题,可以理解为消息的类型,订阅者订阅(Subscribe)后,会收到消息内容(payload)ofthetopic);(2)payload,可以理解为消息的内容,是指订阅者要使用的具体内容。4.2网络传输和应用消息MQTT将构建底层网络传输:它将建立从客户端到服务器的连接,并在两者之间提供有序、无损、基于字节流的双向传输。当应用数据通过MQTT网络发送时,MQTT会将相关的服务质量(QoS)与主题名称(Topic)相关联。4.3MQTTClient始终与服务器建立网络连接的使用MQTT协议的应用程序或设备。客户端可以:(1)发布其他客户端可能订阅的信息;(2)订阅其他客户端发布的消息;(3)取消订阅或删除应用程序中的消息;(4)断开与服务器的连接。4.4MQTT服务器MQTT服务器称为“消息代理”(Broker),可以是一个应用程序,也可以是一个设备。它位于消息发布者和订阅者之间,它可以:(1)接受来自客户的网络连接;(2)接受客户发布的申请信息;(3)处理客户端的订阅和退订请求;(4))将应用程序消息转发给订阅的客户端。4.5MQTT协议中的Subscription、Topic、Session1和SubscriptionSubscription包括TopicFilter和最大服务质量(QoS)。订阅与会话相关联。一个会话可以包含多个订阅。每个会话中的每个订阅都有不同的主题过滤器。2.会话(Session)每个客户端与服务器建立连接后,就是一个会话,客户端与服务器之间存在有状态的交互。会话存在于网络中,也可能跨越客户端和服务器之间的多个连续网络连接。3.主题名称连接到与服务器订阅相匹配的应用程序消息标签。服务器会将消息发送给每个订阅了匹配标签的客户端。4.主题过滤器(TopicFilter)是主题名称的通配符过滤器,用在订阅表达式中表示订阅匹配的多个主题。5.有效载荷(Payload)消息订阅者收到的具体内容。4.6MQTT协议中的方法MQTT协议中定义了一些方法(也称为动作)来表示对某些资源的操作。此资源可以表示预先存在的数据或动态生成的数据,具体取决于服务器实现。通常,资源是指服务器上的文件或输出。主要方法有:(1)连接。等待建立与服务器的连接。(2)断开连接。等待MQTT客户端完成它所做的事情并断开与服务器的TCP/IP会话。(3)订阅。等待订阅完成。(4)退订。等待服务器取消客户端对一个或多个主题的订阅。(5)发布。MQTT客户端发送消息请求,发送后返回应用线程。五、MQTT协议数据包结构在MQTT协议中,一个MQTT数据包由三部分组成:固定头(Fixedheader)、可变头(Variableheader)、消息体(payload)。MQTT报文结构如下:(1)固定报头。它存在于所有MQTT数据包中,表示数据包类型和数据包的分组类标识。(2)可变头(Variableheader)。它存在于一些MQTT数据包中,数据包类型决定了可变头是否存在以及具体内容。(3)消息体(Payload)。它存在于一些MQTT报文中,表示客户端收到的具体内容。5.1MQTT固定头固定头存在于所有MQTT数据包中,其结构如下:5.1.1MQTT数据包类型位置:Byte1中的bits7-4。与一个4bit的无符号值相比,type,取值及说明如下:5.1.2标识位位置:Byte1中的bits3-0。在不使用flags的消息类型中,flags被保留。如果收到无效标志,接收方必须关闭网络连接:(1)DUP:发布消息的副本。它用于确保消息的可靠传输。如果设置为1,则在下面的可变长度中加上MessageId,需要回复确认,以保证消息发送完成,但不能用于检测重复发送消息。(2)QoS:发布消息的服务质量,即保证消息传递的次数?00:最多一次,即:<=1?01:至少一次,即:>=1?10:一次,即:=1?11:reserved(3)RETAIN:发布保留标志,表示服务器希望保留本次推送的信息。如果有新的订阅者,将消息推送给它。如果已设置,则将其推送到当前订阅者并释放它。5.1.3RemainingLength地址:字节2。固定头的第二个字节用于保存变长头和消息体的总大小,但不能直接保存。这个字节是可以扩展的,它的存储机制,前7位用来存储长度,后面作为标识。当最后一位为1时,表示长度不足,需要用两个字节继续保存。例如:计算以下大小为05.2MQTT可变报头MQTT数据包包含一个可变报头,它位于固定报头和负载之间。可变报头的内容因数据包的类型而异。更常见的应用是作为数据包标识:许多类型的数据包都包含一个2字节的数据包标识字段。这些类型的数据包是:PUBLISH(QoS>0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK。5.3Payload消息体Payload消息体是MQTT数据包的第三部分,包括CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种消息:(1)CONNECT,消息体的内容主要是:客户端的ClientID,订阅主题,消息和用户名和密码。(2)SUBSCRIBE,消息体的内容是一系列要订阅的主题和QoS。(3)SUBACK,消息体内容是服务器对SUBSCRIBE申请的主题和QoS的确认和回复。(4)UNSUBSCRIBE,消息体内容为要订阅的主题。了解更多请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz
