MQTTv5.0协议介绍Jade2020/02目录概述MQTT控制包MQTT交互流程订阅通配符前言本胶片描述MQTTv5.0协议基于2019年3月7号版本协议链接:本胶片可作为正式规范的导读和参考材料,也可作为规范的速查手册概述MQTT是Client和Server间基于订阅、发布的消息通讯协议,它是一个轻量级、开放、简单并且易于实现的协议。基于这样的特性,使其可以适用于资源受约束的环境,比如IoT/M2M等要求更小的代码空间、更低或更宝贵的网络带宽等场景下的应用MQTT需要运行在TCP/IP或其他能够提供有序、无损、双向字节流传输的协议之上MQTT核心功能采用订阅/发布消息传递机制,为应用消息提供了一对多的消息传输通道提供3种QoS等级的消息交付服务至多一次至少一次仅有一次较小的头部开销和协议交换开销,最小化网络流量提供遗嘱机制协议栈说明MQTT可以基于TCP和WebSocket(MQTTv5.0引入)MQTT的TCP端口为8883(TLS)和1883MACIPHTTP/HTTPsWebSocketMQTTTCPServerAPPClientAPP术语NetworkConnection:网络连接:MQTT依赖的为Client和Server提供有序、无损、双向字节流的连接ApplicationMessage:应用消息:作为MQTT协议的载荷,由几个部分构成:载荷、QoS、属性集合、主题名称Client:客户端:MQTT的参与方之一,主要功能:打开到Server的网络连接发布其他Client感兴趣的应用消息(以主题标识)订阅自身感兴趣的应用消息取消订阅自身感兴趣的应用消息关闭到Server的网络连接Server:服务端:MQTT的参与方之一,主要功能:接收来自Client的网络连接接收Client感兴趣的应用消息(以主题标识)处理来自Client的订阅、取消订阅请求为Client转发其订阅的应用消息关闭与Client的网络连接术语Session:会话:Client和Server端之间有状态的交互,有些Session随着网络连接(NetworkConnection)的关闭而结束;而有的Session可以跨多个网络连接存在,换句话说,即使Client和Server间的网络连接断开,但是双方仍然各自保存着会话状态Subscription:订阅:订阅由一个主题过滤器(TopicFilter)和最大的QoS等级组成,Session与订阅是一对多的关系,每个订阅只能属于一个session,而一个session可以包含多个订阅SharedSubscription:共享订阅:基本概念同订阅,MQTTv5.0引入,区别在于共享订阅用于在一个/类应用消息在多个订阅者之间的负载均衡,而订阅会个所有订阅者都发送应用消息WildcardSubscription:野匹配订阅:订阅中的主题过滤器包含一个或多个通配符,从而可以匹配多个主题。通配符与正则表达式的通配符含义类似,但是语法上存在差异,只存在3个通配符TopicName:主题:应用消息的标识,以便Server将应用消息和Client订阅中的主题过滤器相匹配TopicFilter:主题过滤器:订阅中关于Client感兴趣的主题的表达式,可以包括通配符,即订阅过滤器可以通过通配符同时匹配多个主题MQTTControlPacket:MQTT控制包:协议定义的Client和Server间的交互报文WillMessage:遗嘱:当Client的连接非正常断开时,由Server为Client发布的临终遗言目录概述MQTT控制包介绍MQTT交互流程主题通配符MQTT控制包MQTT控制包是Client和Server交互的协议报文,规范定义了15个控制包控制包名称类型方向描述Reserved0Forbidden保留CONNECT1Client-Server连接请求CONNACK2Server-Client连接确认PUBLISH3Both发布消息PUBACK4Both发布确认(QoS1)PUBREC5Both发布收到(QoS2deliverypart1)PUBREL6Both发布释放(QoS2deliverypart2)PUBCOMP7Both发布完成(QoS2deliverypart3)SUBSCRIBE8Client-Server订阅请求SUBACK9Server-Client订阅确认UNSUBSCRIBE10Client-Server取消订阅UNSUBACK11Server-Client取消订阅确认PINGREQ12Client-ServerPING请求PINGRESP13Server-ClientPING确认DISCONNECT14Both断开通知AUTH15Both认证交换控制包整体结构控制包结构固定头(必选)可变头(可选,由控制包类型决定)载荷(可选,由控制包类型决定)FixedHeader固定头部分,出现在所有控制包中VariableHeader:可变头部分,出现在特定控制包中Payload载荷,出现在特定控制包中控制包整体结构控制包固定头固定头结构控制包类型:BIT4-BIT7Flags:由控制包类型决定(见下页)控制包剩余长度:随后的可选的可变头和载荷的长度,可以取值为0Bit76543210byte1Type:控制包类型Flags:不同控制包的特定FLAGbyte2…控制包剩余长度固定头固定头Flags关于PUBLISH的FlagsDUP:PUBLISH包的重传标志(见备注)QoS:PUBLISH控制包的QoS等级RETAIN:标识本次发布的应用消息是否是保留消息(见备注)固定头Flags取值取决于控制包类型控制包固定头FlagsBit3Bit2Bit1Bit0CONNECTReserved0000CONNACKReserved0000PUBLISHv5.0DUPQoSRETAINPUBACKReserved0000PUBRECReserved0000PUBRELReserved0010PUBCOMPReserved0000SUBSCRIBEReserved0010SUBACKReserved0000UNSUBSCRIBEReserved0010UNSUBACKReserved0000PINGREQReserved0000PINGRESPReserved0000DISCONNECTReserved0000AUTHReserved0000控制包可变头可变头结构可变头的内容不是固定的,其特定于消息类型其中封包标识(PacketIdentifier)会出现在大部分的控制包中(见封包标识页)可变头一般都包括一组属性(Properties)字段(见属性下页)应答封包可变头中一般包含原因码字段(见下页)可变头-封包标识封包标识/属性与控制包映射关系封包标识:是2个字节的无符号整数,用于Client和Server匹配一次控制包交互事物(注意协议并未定义事物的概念,用于匹配请求和应答控制包)控制包类型封包标识属性CONNECTNOYESCONNACKNOYESPUBLISHYes(QoS大于0)YESPUBACKYESYESPUBRECYESYESPUBRELYESYESPUBCOMPYESYESSUBSCRIBEYESYESSUBACKYESYESUNSUBSCRIBEYESYESUNSUBACKYESYESPINGREQNONOPINGRESPNONODISCONNECTNOYESAUTHNOYES可变头-属性属性属性特定于不同控制包,见上页规范定义的属性集合见下页不同控制包可能包含一组属性集,属性为LV格式,属性集定义:属性集长度属性(可能有多个)属性的Length属性的Value可变头-属性集属性与控制包映射关系标识名字类型封包/遗嘱消息属性DecHex10x01PayloadFormatIndicatorBytePUBLISH,WillProperties20x02MessageExpiryInterval四字节整数PUBLISH,WillProperties30x03ContentTypeUTF-8编码字符串PUBLISH,WillProperties80x08ResponseTopicUTF-8编码字符串PUBLISH,WillProperties90x09CorrelationDataBinaryDataPUBLISH,WillProperties110x0BSubsriptionIdentifier变长整数PUBLISH,SUBSCRIBE170x11SessionExpiryInterval四字节整数CONNECT,CONNACK,DISCONNECT180x12AssignedClientIdentifierUTF-8编码字串CONNACK190x13ServerKeepAlive2字节整数CONNACK210x15AuthenticationMethodUTF-8编码字串CONNECT,CONNACK,AUTH220x16AuthenticationDataBinaryDataCONNECT,CONNACK,AUTH230x17RequestProblemInformationByteCONNECT240x18WillDelayInterval四字节整数WillProperties250x19RequestResponseInformationByteCONNECT260x1AResponseInformationUTF-8编码字串CONNACK280x1CServerReferenceUTF-8编码字串CONNACK,DISCONNECT310x1FReasonStringUTF-8编码字串CONNACK,PUBACK,PUBREC,PUBREL,PUBCOMP,SUBACK,UNSUBACK,DISSCONNECT,AUTH330x21ReceiveMaxinum两字节整数CONNECT,CONNACK340x22TopicAliasMaxinum两字节整数CONNECT,CONNACK350x23TopicAlias两字节整数PUBLISH360x24MaximumQoSByteCONNACK370x25RetainAvailableByteCONNACKS380x26UserPropertyUTF-8字串对CONNECT,CONNACK,PUBLISH,WillProperties,PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE,UNSUBACK,DISCONNECT,AUTH390x27MaximumPacketSize四字节整数CONNECT,CONNACK400x28WildcardSubscriptionAvailableByteCONNACK410x29SubscriptionIdentifierAvailableByteCONNACK420x2ASharedSubscritionAvailabeByteCONNACK可变头-原因码原因码原因字名字封包DecHex00x00SuccessCONNACK,PUBACK,PUBREC,PUBREL,PUBCOMP,UNSUBACK,AUTH00x00NormaldisconnectionDISCONNECT00x00GrantedQoS0SUBACK10x01GrantedQoS1SUBACK20x02GrantedQoS2SUBACK40x04DisconnectwithWillMessageDISCONNECT160x10Nomatchings