1. MQTT协议介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。
MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
2. MQTT协议原理
- 实现MQTT协议需要:客户端和服务器端
- MQTT协议中有三种身份:发布者(publishers)、代理(Broker,服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
- MQTT传输的消息分为:主题(Topic)和负载(payload)两部分
Topic - 可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
payload - 可以理解为消息的内容,是指订阅者具体要使用的内容
参考连接:http://itbilu.com/other/relate/4kHBsx_Pg.html#mqtt-topic
3. 方法
3.1 connect
连接服务器
<request>
<mqtt type="connect" clean_start="true" keepalive="20" will_topic="will_topic" will_qos="0" will_msg="will_msg" will_retain="false">
</mqtt>
</request>
说明:
连接
clean_start - true:开启一个新的会话。false:不清空会话信息,沿用之前相同Client_id的会话
keepalive - 以秒为单位,会话心跳时间,即从客户端传输一个控制报文结束到开始传输下一个控制报文,允许的最大时间间隔。客户端必须保证控制报文之间的传输时间间隔不能超过心跳时间。在没发送其它任何控制报文的时候,客户端必须发送一个PINGREQ报文。
客户端可以不管keepalive 时间,在任意时刻,发送PINGREQ,一遍检测网络和服务器正在工作。
如果keepalive值不为0,且服务器在1个半的keepalive时间内,没有收到来自客户端的控制报文,必须断开客户端的网络连接,正如网络连接失败
如果keepalive值为0,表示关闭心跳机制,这意味着服务器不要求断开处于不活动状态的客户端
keepalive实际值是由应用程序指定的,通常为几分钟。
will_qos - 指定发布will_msg时的QoS级别。如果Will Flag为0,那么will_qos必须为0,如果Will Flag为1,那么will_qos可以为0,1,2。不能为3。
will_topic - 主题名称
will_msg - 定义要发布到will_topic的应用程序消息。如果客户端意外的断开触发服务器PUBLISH此消息(消息主题名为:will_topic中指定的内容, 消息内容为 will_msg指定的内容)。
will_retain - 用于判断当will_msg发布后,是否保留will_msg。如果Will Flag设置为0,will_retain必须设置为0,如果如果Will Flag设置为1,如果will_retian设置为0,服务器发布will_msg后,必须不保留will_msg消息,如果will_retian设置为1,服务器发布消息will_msg后,必须保留will_msg。tsung中will_retain可选值true(对应1),false(对应0)
参考连接:
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718028
3.2 publish
发布消息
<request subst="true">
<mqtt type="publish" topic="test_topic" qos="1"
retained="true">test_message
</mqtt>
</request>
说明:
topic - 主题名称
qos - 值为0:至多发送一次,为1: 至少发布一次,为2: 只发送一次
retained - 如果设置为1,服务器必须存储来自客户端发送给服务器的发布消息中的应用消息和Qos,这样当订阅匹配其主题名称时,把存储的内容发送给订阅者。如果设置为0,服务器必须存储来自客户端发送给服务器的发布消息,且不允许移除、替换已经存在的保留消息。
参考连接:
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718037
3.3 disconnect
断开连接
<request>
<mqtt type="disconnect"></mqtt>
</request>
3.4 subscribe
订阅主题
<request subst="true">
<mqtt type="subscribe" topic="test_topic" qos="1"></mqtt>
</request>
说明:
topic - 想要订阅的主题名称
qos - 如果设置为1,针对QoS 0应用程序消息,客户端最多只能收到一份消息,针对Qos 2,客户端可能会收到两份重复的消息。
如果设置为0,以Qos2发送的应用消息在传输给客户端,可能会丢失,而以Qos 1发送的应用消息在传输给客户端时也可能会丢失或者重复。
参考连接:
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718063
3.5 waitForMessages
等待消息
<request>
<mqtt type="waitForMessages" timeout="60"></mqtt>
</request>
说明:
timeout - 设置等待消息超时时间,单位秒
3.6 unsubscribe
取消订阅主题
<request subst="true">
<mqtt type="unsubscribe" topic="test_topic"></mqtt>
</request>
说明:
topic - 想要取消订阅的主题名称