mqtt协议和http协议区别 MQTT( 二 )


对负载内容屏蔽的消息传输 。
使用TCP/IP提供网络连接 。主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN 。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了 。
三种消息传输方式QoS:
0代表“至多一次”,消息发布完全依赖底层 TCP/IP 网络 。会发生消息丢失或重复 。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送 。
1代表“至少一次”,确保消息到达,但消息重复可能会发生 。
2代表“只有一次”,确保消息到达一次 。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果 。备注:由于服务端采用Mosca实现,Mosca目前只支持到QoS 1
如果发送的是临时的消息,例如给某topic所有在线的设备发送一条消息,丢失的话也无所谓,0就可以了(客户端登录的时候要指明支持的QoS级别,同时发送消息的时候也要指明这条消息支持的QoS级别),如果需要客户端保证能接收消息,需要指定QoS为1,如果同时需要加入客户端不在线也要能接收到消息,那么客户端登录的时候要指定session的有效性,接收离线消息需要指定服务端要保留客户端的session状态 。
mqtt基于订阅者模型架构,客户端如果互相通信,必须在同一订阅主题下,即都订阅了同一个topic,客户端之间是没办法直接通讯的 。订阅模型显而易见的好处是群发消息的话只需要发布到topic,所有订阅了这个topic的客户端就可以接收到消息了 。
发送消息必须发送到某个topic,重点说明的是不管客户端是否订阅了该topic都可以向topic发送了消息,还有如果客户端订阅了该主题,那么自己发送的消息也会接收到 。
小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量 。这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了 。
使用Last Will和Testament特性通知有关各方客户端异常中断的机制 。Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接 。Testament:遗嘱机制,功能类似于Last Will。
3. MQTT简要介绍——
[1.MQTT项目工程]()
[2.MQTT API说明文档]()
[3.MQTT协议中文版]()
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议 。它的设计思想是轻巧、开放、简单、规范,易于实现 。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT) 。
MQTT协议通过交换预定义的MQTT控制报文来通信 。
报文格式: 固定包头+可变包头+payload 。
固定包头: 由两个字节组成
byte1 高四位表示控制报文的类型,低四位表示控制报文类型的标志位 。
byte2表示剩余长度,包括可变报头和负载的数据 。剩余长度不包括用于编码剩余长度字段本身的字节数 。
可变包头:
某些MQTT控制报文包含一个可变报头部分 。它在固定报头和负载之间 。可变报头的内容根据报文类型的不同而不同 。可变报头的报文标(Packet Identifier)字段存在于在多个类型的报文里 。
有效载荷:
对于PUBLISH来说有效载荷就是应用消息 。
——1. 网络建立连接后,客户端发送的第一个报文必须是CONNECT报文
——2. 客户端只能发送一次CONNECT 报文,发送两次会当作协议违规处理,并断开连接 。
——3. 有效载荷包括:客户端唯一标识符,will主题,will消息,用户名和密码 。
——4.可变包头:协议名(protocol name)+协议级别(protocol level)+连接标志(connect flags)+保持连接(keep alive) 。
——5. 协议名: MQTT的UTF-8编码的字符串 。(MSB+LSB +MQTT 六个字节)
——6. 协议级别:一个字节
——7. 连接标志:一个字节,包含一些用于指定MQTT连接行为的参数 。同时还指出有效载荷中的字段是否存在 。服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接 。
——8. 清理会话:byte8 的bit1位标志 。
这个二进制位指定了会话状态的处理方式 。客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输 。这个标志位用于控
制会话状态的生存时间 。

秒懂生活扩展阅读