保留消息:https://blog.csdn.net/z69183787/article/details/108899618
遗嘱消息:https://blog.csdn.net/z69183787/article/details/108899667
一言以敝之
被订阅的client-B,存在一个状态 topic,该topic 为 will topic
Retained Message:存储 will topic 最后的一条消息的状态内容,当有订阅的新client-A上线后可以获取最新状态取值
Will Message:被订阅的client-B断开连接后,对will topic发送一条消息,取值为预设的offline,标示下线
client-B每次链接成功后,对will topic 发送一条 online 的消息,标示Client-B已上线
流程:
- 客户端 A 遗嘱消息设定为”offline“,该遗嘱主题与一个普通发送状态的主题设定成同一个
A/status
; - 当客户端 A 连接时,向主题
A/status
发送 “online” 的 Retained 消息,其它客户端订阅主题A/status
的时候,获取 Retained 消息为 “online” ; - 当客户端 A 异常断开时,系统自动向主题
A/status
发送”offline“的消息,其它订阅了此主题的客户端会马上收到”offline“消息;如果遗嘱消息被设定了 Retained 的话,这时有新的订阅A/status
主题的客户端上线的时候,获取到的消息为“offline”。
实现 Client 连接状态监控的原理很简单:
- Client 在连接的时候指定 Will Topic 为“client/status”,遗愿消息为“offline”,Will Retain=1;
- Client 在连接成功以后向同一个主题“client/status”,发布一个内容为“online”的 Retained 消息。
那么订阅者在任何时候订阅“client/status”,都会获取 Client 当前的连接状态。
client.js 代码如下:
var mqtt = require('mqtt')
var client = mqtt.connect('mqtt://iot.eclipse.org', {
clientId: "mqtt_sample_publisher_chapter_8",
clean: false,
will:{
topic : 'client/status',
qos: 1,
retain: true,
payload: JSON.stringify({status: 'offline'})
}
})
client.on('connect', function (connack) {
if(connack.returnCode == 0){
client.publish("client/status", JSON.stringify({status: 'online'}), {qos: 1, retain: 1})
}else{
console.log(`Connection failed: ${connack.returnCode}`)
}
})
monitor.js 代码如下:
var mqtt = require('mqtt')
var client = mqtt.connect('mqtt://iot.eclipse.org', {
clientId: "mqtt_sample_subscriber_id_chapter_8_2",
clean: false
})
client.on('connect', function () {
client.subscribe("client/status", {qos: 1})
})
client.on("message", function (_, message) {
var jsonPayload = JSON.parse(message.toString())
console.log(`client is ${jsonPayload.status}`)
})
在 monitor.js 中,我们每次连接的时候都重新订阅“client/status”,这样的话每次运行都能收到关于 Client 连接状态的 Retained 消息。
首先运行 node client.js,然后运行 node monitor.js,会得到以下输出:
client is online
在运行 client.js 的终端上,使用 Ctrl+C 终止 client.js,之后在运行 monitor.js 的终端上会得到以下输出:
client is offline
然后重新运行 node client.js,在运行 monitor.js 的终端上会得到以下输出:
client is online
Ctrl+C 终止 monitor.js,然后重新运行 node monitor.js,会得到以下输出:
client is online
这样我们就完美地监控了 Client 的连接状态。