Mqtt Retained+Lwt Message 实现client状态监控

保留消息: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已上线

流程:

  1. 客户端 A 遗嘱消息设定为”offline“,该遗嘱主题与一个普通发送状态的主题设定成同一个 A/status
  2. 当客户端 A 连接时,向主题 A/status 发送 “online” 的 Retained 消息,其它客户端订阅主题 A/status的时候,获取 Retained 消息为 “online” ;
  3. 当客户端 A 异常断开时,系统自动向主题 A/status 发送”offline“的消息,其它订阅了此主题的客户端会马上收到”offline“消息;如果遗嘱消息被设定了 Retained 的话,这时有新的订阅A/status主题的客户端上线的时候,获取到的消息为“offline”。

实现 Client 连接状态监控的原理很简单:

  1. Client 在连接的时候指定 Will Topic 为“client/status”,遗愿消息为“offline”,Will Retain=1;
  2. 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 的连接状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值