-
发布订阅模式:消费者(客户端)订阅服务器(作为代理Broker)上的主题,当有生产者(客户端)在主题中发布消息时,消费者可以收到。
-
MQTT:基于发布订阅模式的轻量级通讯协议,可以以极少的代码和有限带宽,为连接远程设备提供实时可靠的消息服务。广泛应用于物联网,小型设备。MQTT传输的消息分为两部分:主题Topic和负载payload 订阅者订阅主题topic后,就会收到该主题的消息内容payload,数据通过MQTT时,MQTT就会把与之相关的Qos服务质量和主题topic相关联, 发送消息的服务质量:保证消息传递的次数。使用了MQTT协议的设备或应用即为MQTT客户端。
-
MQTT协议中的方法
-
Publish:客户端发送消息请求。发送完成后返回应用程序线程。
-
Subscribe:等待完成订阅。
-
Connect:等待与服务器建立连接。
-
Disconnect:等待客户端完成工作,之后断开TCP/IP会话。
-
-
MQTT QoS种类
-
QoS 0:消息最多传送一次,即发即弃,如果当前客户端不可用-如TCP连接关闭或重置,它将丢失这条消息。 常用于传输高频而不重要的数据 如传感器数据。
-
QoS 1:消息至少传送一次,保证收到消息,但消息可能重复 发送方只有收到接收方的PUBACK报文后才能认为消息投递成功,在此之前,发送方要存储PUBLISH以待重传 原理在PUBLISH报文设置Packet ID 相应报文返回该ID以便发送方删除对应报文 此中如果接收方收到消息而发送PUBACK报文失败,就会重复收到。用于接收端允许消息重复或能处理重复的。
-
QoS 2:消息只传送一次。保证消息不丢失不重复。 QoS等级越高,可靠性越高,复杂度越高。
-
-
MQTT连接参数
-
客户端ID Client ID每个客户端要有唯一的ID ,如果重复则把已有的踢下线
-
用户名和密码
-
连接超时 Connect Timeout 收到服务器连接确认的等待时间,等待时间内没收到则认为超时
-
保活周期 Keep Alive 以秒为单位,客户端无报文发送时将按照此时间定时向服务端发送心跳报文以确保连接不会断开,如果服务器在KeepAlive的1.5倍时间内没收到,则会断开连接。
-
-
MQTT工作流程
-
客户端使用TCP/IP协议与Broker建立连接,可以选择使用TLS/SSL加密,客户端提供认证信息,指定会话类型。
-
客户端发布消息,将消息发送给Broker,客户端订阅消息,接收订阅主题的信息。
-
服务器接收发布的消息,将消息转发给订阅了主题的客户端,其根据Qos确保消息可靠性,根据会话类型为断开连接的客户端存储消息。
-
创建连接,设置连接参数
MqttClient client = new MqqtClient(“tcp://192.168.14.144:1883”)
MqttConnectOptions options=new MqttConnectOptions()
options.setConnectionTimeout(60)
options.setKeepAliveInterval(60)
client.connect(options)
-
/发布端 创建消息,设置QoS
MqttMessage message =new MqttMessage(content.getBytes())
message.setQos(qos)
client.publish(topic,message)
-
/接收端 设置回调
MqttClient client = new MqqtClient(“tcp://192.168.14.144:1883”)
MqttConnectOptions options=new MqttConnectOptions()
options.setConnectionTimeout(60)
options.setKeepAliveInterval(60)
client.setCallback(new MqttCallback()){
public void connectionLost(){连接丢失时被调用}
public void messageArrived(){接收到消息时被调用}
public void deliveryComplete()}{消息发送完成时被调用}
}
client.connect(options)
clien.subscribe(topic,qos)
-
-
-
MQTT Retain:客户端向服务端发布消息时,可以设置是否保留消息,其存储在消息服务器上,后续订阅该主题的客户端仍然可以收到该消息(只会为主题保留最近的一条保留消息)。
-
MQTT Clean Session :通常客户端离线后无法收到订阅的主题消息,如果客户端连接时设置Clean Session为false 表示创建一个持久会话,断开连接后仍然保存离线消息,直到会话超时注销,为true则表示创建一个新的临时会话,客户端断开时,会话自动销毁。
-
MQTT Last Will:如果异常离线,断开连接前没有向服务器发送disconnect消息,服务器将发布遗嘱信息。
-
MQTT会话:物联网中,设备可能因为网络或电源频繁断开连接,错过离线消息,重连后还要重新订阅,为避免这些问题,MQTT设计了会话机制。以Clean Start和Session Expiry Innterval两个连接字段来控制会话的生命周期。
-
Clean Start:位于CONNECT报文的可变包头,通过此字段指定是否复用存在的会话,0为复用-需要服务器存在连接时关联的Client ID,1为不复用
-
Session Expiry Interval:用以指定会话在网络断开后能够在服务器保留的时间。默认为0,立即结束。大于0,相应秒数过期。
-
订阅客户端离线后,发布客户端发布消息,会话保留时间内,消息将在服务器上保留,这时如果订阅客户端选择Clean Start 0 ,重新连接,将会收到离线期间缓存的消息。客户端想要复用的话必须使用与之前一致的ClientID。
2024.7.15
-