MQTT原理与实践

一、概念与定义

MQTT是一种遵循OASIS(结构化信息标准促进组织)标准的物联网消息协议。其设计目标是以尽量简洁的代码和少的带宽消耗使设备接入物联网。目前,该协议已广泛应用到自动化、生产制造、通信、石油和天然气等领域[1]。

二、原理

MQTT工作原理如下图所示。


MQTT工作原理

MQTT所有消息的传输均要经过MQTT Broker的处理,在物联网体系架构下,Broker运行在网关节点上。MQTT传输的消息由主题(Topic)和负载(Payload)两部分构成。物联网设备端和云端或应用端运行MQTT客户端(Client)进行通信。消息以发布、订阅的方式进行,客户端发布某主题后,需要获取该消息的客户端只需要订阅该主题即可获取通过该主题发布消息的负载(Payload)内容。

2.1MQTT演示

  • MQTT发布
    运行物联网网关iot-gateway,里面包含MQTT Broker服务,监听1883端口。通过MQTTX工具连接MQTT Broker,如下图所示:
    MQTT客户端连接设置

    设置MQTT客户端的连接设置,Host配置MQTT Broker的ip地址,Port配置MQTT Broker的监听端口。连接成功后可以发布消息如下图所示:
    发布MQTT消息

    设置发布消息的主题:test,负载Payload格式:JSON,QoS等级:0,和消息内容:{"msg": "hello222111"}。发送成功后可以在MQTT Broker端监听到报文,如下图所示:
    MQTT Broker监听消息
  • MQTT订阅
    保持物联网网关iot-gateway运行状态,再开一个MQTT客户端用于订阅MQTT发布的消息,采用MQTT Websocket工具,配置如下:
    Websocket MQTT配置

    Host为MQTT Broker ip地址,Port为MQTT Broker监听Websocket端口。连接成功后添加订阅主题:test,这样就能接受MQTT客户端发布的test主题消息,如下图所示:
    接收已订阅主题的MQTT消息
  • 问题已解决方法
    其中,如何将MQTT消息通过Websocket协议传输请参考:[基于Websocket的MQTT协议],如何基于不同底层协议实现MQTT消息的传输请参考[物联网网关跨协议通信]

三、使用

3.1参数设置

  1. QoS等级
    MQTT消息是通过底层网络进行传输的,底层网络并不是100%可靠。因此,MQTT设计了多种QoS模式以满足消息传输的不同服务质量需求。MQTT的QoS模式是针对消息的发布方和接收方而言,并不是消息发布者和订阅者之间的约定。由于MQTT的消息发布订阅要经过Broker代理,因此MQTT的QoS模式是针对MQTT客户端和MQTT代理之间的。MQTT客户端发布消息时指定的QoS模式是该消息从MQTT客户端传输给MQTT代理的要求;MQTT客户端订阅消息时指定的QoS模式时该消息从MQTT代理传输给MQTT客户端的要求。MQTT消息QoS模式设置了三种,如下:
  • QoS0: 至多一次,消息发布完全依赖底层 TCP/IP 网络,消息如果发送失败不会重复发送,因此接收方最多只能接受到一次。这种模式会发生消息丢失或重复。可用于诸如周期性传感器监测数据,单次发送失败不会影响整个生命周期的监测。
  • QoS1: 至少一次,消息如果发送失败会重新发送,直到接收方收到消息为止。因为可能重传,消息可能会重复接收。
  • QoS2: 只有一次,确保接收方能收到且只收到一次。比如在计费事务性系统里,只允许消息被处理一次。
  1. 保留消息标识:Retain
    一般情况下,发布的消息如果没有任何客户端订阅,那么Broker代理将直接丢弃该消息。但是,该发布的消息通常情况下是有意义的。比如设备状态发生变化时才触发发布的状态消息(而非周期性发布),对于需要获取设备状态信息的客户端如果在设备状态变化时没在线或者其它原因导致未订阅该消息;等下次上线订阅设备状态消息时并不能马上获取设备的当前状态,需要设备状态变化后重新触发消息发布才能获取变化后的最新状态。诸如这种场景,可以为消息设置保留标识,消息发布后Broker代理不会丢弃该消息,而是一直保留该消息直至下次发布该主题消息后用新发布的消息替换当前保留的消息。

参考

  • [1] MQTT:https://mqtt.org/

你可能感兴趣的:(MQTT原理与实践)