1、会话清除标识session
标识 Client 是否建立一个持久化的会话。当 Clean Session 的标识被设置时候,代表 Client 希望建立一个持久会话的连接,Broker 将存储该 Client 订阅的主题和未接受的消息(QoS 大于 1 ),client离线重启后将收到这些消息;否则 Broker 不会存储这些数据,client离线重启后也不会收到消息。
应用场景:接收离线消息
Java代码设置:
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false)
如何测试:可以先启动sender端,发送一条retained消息,在启动receiver端,可以查看是否收到消息。在设置setRetained为false可以对比
2、保留消息Retained Messages
当设置Retain标识位的时候,该消息即为遗言消息。broker收到该消息后会保存此消息,当有新的订阅者订阅此主题时候,broker会立即发送此消息。有点类似于会话清除,不同的是遗言只有一条,后面的遗言消息会覆盖前面的。如果需要删除retain消息,可以发布一个空的retain消息,因为每个新的retain消息都会覆盖最后一个retain消息
MqttMessage message = new MqttMessage();
message.setRetained(true);
3、最后遗嘱LWT(Last Will & Testament)
遗言的设计初衷:物联网设备不少部署在网络信号很不好的环境下,难免有一些客户端会无故的和Broker断开连接。 当客户端连接到Broker时,可以指定LWT,Broker会定期检测客户端是否有异常。 当客户端异常掉线时,Broker就往连接时指定的topic里推送当时指定的LWT消息。入下:
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
// 设置超时时间
options.setConnectionTimeout(20);
// 设置会话心跳时间
options.setKeepAliveInterval(20);
//设置遗言消息
options.setWill("home/rome/light1","test".getBytes(),1,true);
try {
client.setCallback(new PushCallback());
client.connect(options);
topic11 = client.getTopic(TOPIC);
} catch (Exception e) {
e.printStackTrace();
}