1.5 物联网与MQTT协议
与HTTP和CoAP不同,MQTT协议由IBM牵头制定,而HTTP与CoAP均由IETF组织制定。MQTT协议采用订阅/发布模式,这与HTTP和CoAP的请求/响应模式存在明显区别。MQTT协议虽然不是为物联网应用专门设计的协议,但是在物联网领域依然取得了不俗的成绩。
1.5.1 MQTT协议
MQ遥测传输(MQTT)是轻量级基于代理的发布/订阅模式的消息传输协议,MQTT协议开放、简单、轻量级且易于实现。该协议的特点有:
1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
2)对负载内容屏蔽的消息传输。
3)使用TCP/IP提供网络连接。
4)小型传输,网络传输开销非常小(固定长度的头部是2字节),协议交换最小化以降低网络流量。
5)使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
1.5.2 MQTT主题
MQTT协议包含一个主题的概念,MQTT的主题与HTTP中的资源URI较为相似。MQTT协议通过主题对消息进行分类,主题本质上是一个UTF-8编码的字符串,可通过斜杠表示多个层级关系。主题还可以使用通配符进行过滤。其中,“+”可以过滤一个层级,而“#”只能出现在主题最后,表示过滤任意级别的层级。
下面是几个常见的MQTT主题:
1)building-b/floor-5:表示B栋楼第5层。
2)+/floor-5:表示任何一栋楼的第5层。
3)building-b/#:表示B栋楼的所有楼层。
1.5.3 MQTT服务质量
针对不同的应用场景,MQTT协议提供三种不同消息发布服务质量:
❑ QoS=0“最多一次”:服务质量级别QoS0是最快的传输方式,有时称为“触发并忘记”。消息将最多传递一次,或者可能完全不会传递。网络中的传递不会得到确认,并且不会存储消息。如果客户机断开连接或者服务器发生故障,那么消息可能会丢失。以某个时间间隔发送实时数据时,可使用服务质量级别QoS0。丢失单条消息实际上不会产生很大影响,因为之后很快将发送包含较新数据的另一条消息。在此场景中,使用较高服务质量会带来额外成本,却不会获得任何实际优势。QoS=0的情况如图1-7a所示。
图1-7 MQTT消息发布服务质量
❑ QoS=1“至少一次”:使用服务质量级别QoS1时消息会始终至少传递一次。如果发布者收到应答之前消息传递失败,那么一条消息可能会传递多次。该消息必须存储在发布者本地,直到发布者收到关于接收者已发布此消息的确认消息为止。QoS=1的情况如图1-7b所示。
❑ QoS=2“恰好一次”:服务质量级别QoS2是最安全也是最慢的传输方式。消息始终传递恰好一次,并且必须存储在发布者本地,直到发布者收到关于接收者已发布此消息的确认消息为止。使用服务质量级别QoS2时会采用比QoS1更复杂的握手和应答序列,以确保消息不会重复。QoS=2的情况如图1-7c所示。
与HTTP和CoAP的请求/响应模式不同,MQTT协议这样的订阅/发布模式总是存在三个不同的角色——发布者、代理器(Broker)和订阅者。订阅者向MQTT代理器订阅单个或一系列主题,发布者发布某个主题的具体消息。在MQTT代理器的协调下,所有订阅者将及时收到该主题的消息。MQTT协议的工作过程经常被称为“推送”,在推送过程中某些消息必须保证稳定可靠,而某些消息允许丢失或收到重复内容。为了实现这种灵活可变的机制,MQTT协议提供了以上三种不同的消息发布服务质量。