MQTT协议梯影--技术部:李栋(MessageQueuingTelemetryTransport,消息队列遥测传输协议)大纲1、什么是mqtt协议7、主题3、mqtt特性4、MQTT协议原理5、MQTT协议数据包结构6、发布/订阅模式2、物联网协议有哪些8、服务质量9、遗嘱消息10、MQTT代理什么是MQTT协议•MQTT是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。•MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。•2014年发布的MQTTv3.1.1是当前MQTT协议的最新版本。除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备。大纲2、物联网协议有哪些7、主题3、mqtt特性4、MQTT协议原理5、MQTT协议数据包结构6、发布/订阅模式1、什么是mqtt协议8、服务质量9、遗嘱消息10、MQTT代理四大协议的基本介绍ProtocolCoAPXMPPRESTfulHTTPMQTTTransportUDPTCPTCPTCPMessagingRequest/ResponsePublish/SubscribeRequest/ResponseRequest/ResponsePublish/SubscribeRequest/Response2G,3G,4GSuitability(1000snodes)ExcellentExcellentExcellentExcellentLLNSuitability(1000snodes)ExcellentFairFairFairComputeResources10KsRAM/Flash10KsRAM/Flash10KsRAM/Flash10KsRAM/FlashSuccessStoriedUtilityFieldAreaNetworksRemotemanagementofconsumerwhitegoodsSmartEnergyProfile2(premiseenergymanagement/homeservices)ExtendingenterprisemessagingintoIoTapplications大纲3、mqtt特性7、主题2、物联网协议有哪些4、MQTT协议原理5、MQTT协议数据包结构6、发布/订阅模式1、什么是mqtt协议8、服务质量9、遗嘱消息10、MQTT代理MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:•(1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。•这一点很类似于XMPP,但是MQTT的信息冗余远小于XMPP,,因为XMPP使用XML格式文本来传递数据。•(2)对负载内容屏蔽的消息传输。•(3)使用TCP/IP提供网络连接。•主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。MQTT特性:•(4)有三种消息发布服务质量:•“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。•“至少一次”,确保消息到达,但消息重复可能会发生。•“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。MQTT特性:•(5)小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。•这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。•(6)使用LastWill和Testament特性通知有关各方客户端异常中断的机制。•LastWill:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。•Testament:遗嘱机制,功能类似于LastWill。大纲4、MQTT协议原理7、主题2、物联网协议有哪些3、mqtt特性5、MQTT协议数据包结构6、发布/订阅模式1、什么是mqtt协议8、服务质量9、遗嘱消息10、MQTT代理MQTT协议原理MQTT协议原理-协议实现方式•实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:•发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。•MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:•(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);•(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。MQTT协议原理-网络传输与应用消息•MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。•当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。MQTT协议原理-客户端•一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:•(1)发布其他客户端可能会订阅的信息;•(2)订阅其它客户端发布的消息;•(3)退订或删除应用程序的消息;•(4)断开与服务器连接。MQTT协议原理-服务器•MQTT服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:•(1)接受来自客户的网络连接;•(2)接受客户发布的应用信息;•(3)处理来自客户端的订阅和退订请求;•(4)向订阅的客户转发应用程序消息。MQTT协议原理-订阅、主题、会话•MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:•(1)Connect。等待与服务器建立连接。•(2)Disconnect。等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。•(3)Subscribe。等待完成订阅。•(4)UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。•(5)Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。大纲5、MQTT协议数据包7、主题2、物联网协议有哪些3、mqtt特性4、MQTT协议原理6、发布/订阅模式1、什么是mqtt协议8、服务质量9、遗嘱消息10、MQTT代理MQTT协议数据包结构•在MQTT协议中,一个MQTT数据包由:固定头(Fixedheader)、可变头(Variableheader)、消息体(payload)三部分构成。MQTT数据包结构如下:固定头(Fixedheader)•第一个字节:包括消息类型和标识(DUP,QoSlevel,RETAIN)字段•第二个字节:(至少一个字节)包括剩余的信息字段•所有的数据排序规则是顺序值越大越优先。1个16bit的字母出现在最重要的字节,后面是最不重要的字节。可变报头Variableheader•报文标识符消息体•MQTT控制报文在报文的最后部分包含一个有效载荷。对于PUBLISH来说有效载荷就是应用消息。以下是支持有效负载的协议。大纲6、发布/订阅模式7、主题2、物联网协议有哪些3、mqtt特性4、MQTT协议原理5、MQTT协议数据包1、什么是mqtt协议8、服务质量9、遗嘱消息10、MQTT代理发布与订阅模式•打个比方,你打电话给朋友,一直要等到朋友接电话了才能够开始交流,是一个典型的同步请求/回答的场景;而给一个好友邮件列表发电子邮件就不一样,你发好电子邮件该干嘛干嘛,好友们到有空了去查看邮件就是了,是一个典型的异步发布/订阅的场景。•熟悉编程的同学一定非常熟悉这种设计模式了,因为它带来了这些好处:发布者与订阅者不用了解彼此,只要认识同一个消息代理即可。•发布者和订阅者不需要交互,发布者无需等待订阅者确认而导致锁定。•发布者和订阅者不需要同时在线,可以自由选择时间来消费消息。大纲7、主题6、发布/订阅模式2、物联网协议有哪些3、mqtt特性4、MQTT协议原理5、MQTT协议数据包1、什么是mqtt协议8、服务质量9、遗嘱消息10、MQTT代理主题与订阅机制•MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用就是了。•主题还可以通过通配符进行过滤。其中,层级数量没有限制不能包含任何的下文中提到的特殊符号(/、+、#),必须至少包含一个字符–/A”和“A”是不同的。–“A”和“A/”是不同的•层级分隔符/•只能匹配本级不能匹配上级。例如,“sport/+”不匹配“sport•多层通配符#•单层通配符+•一个Subsribe请求可订阅多个Topic(节省带宽,多订阅尽量用一次请求)。大纲8、服务质量7、主题2、物联网协议有哪些3、mqtt特性4、MQTT协议原理5、MQTT协议数据包1、什么是mqtt协议6、发布/订阅模式9、遗嘱消息10、MQTT代理QoS0•级别0:尽力而为。消息发送者会想尽办法发送消息,但是遇到意外并不会重试。QoS1•级别1:至少一次。消息接收者如果没有知会或者知会本身丢失,消息发送者会再次发送以保证消息接收者至少会收到一次,当然可能造成重复消息。QoS2•级别2:恰好一次。保证这种语义肯待会减少并发或者增加延时,不过丢失或者重复消息是不可接受的时候,级别2是最合适的。大纲9、遗嘱消息7、主题2、物联网协议有哪些3、mqtt特性4、MQTT协议原理5、MQTT协议数据包1、什么是mqtt协议6、发布/订阅模式8、服务质量10、MQTT代理遗嘱消息•MQTT本身就是为信号不稳定的网络设计的,所以难免一些客户端会无故的和Broker断开连接。当客户端连接到Broker时,可以指定LWT,Broker会定期检测客户端是否有异常。当客户端异常掉线时,Broker就往连接时指定的topic里推送当时指定的LWT消息。•当客户端断开连接时,发送给相关的订阅者的遗嘱消息。以下情况下会发送WillMessage:•服务端发生了I/O错误或者网络失败;•客户端在定义的心跳时期失联;•客户端在发送下线包之前关闭网络连接;•服务端在收到下线包之前关闭网络连接。使用场景•在客户端A进行连接时候,遗嘱消息设定为”offline“,客户端B订阅这个遗嘱主题。当A异常断开时,客户端B会收到这个”offline“的遗嘱消息,从而知道客户端A离线了。高级使用场景•这里介绍一下如何将Retained消息与Will消息结合起来进行使用。•客户端A遗嘱消息设定为”offline“,该遗嘱主题与一个普通发送状态的主题设定成同一个A/status;•当客户端A连接时,向主题A/