解决mqtt在线或离线监听问题的多种方法

目录

前言

优缺点:

1.创建 DeviceMqttCallBacked类,实现 MqttCallbackExtended 接口,添加带cleintId参数的构造方法。

2. 在Mqtt连接成功之后,设置回调类。

3.执行上述代码,查看emqx界面 

4.从emqx上踢除设备

5.观察控制台结果

6.由于mqtt的尝试重连机制,防止意外掉线,影响消息的传输,会立即重连。


前言

        简单说明一下三种Mqtt监听上线或者离线方法。

方法一:在连接Mqtt的逻辑中添加主题订阅,设置设备上线或离线主题,所有的设备均订阅此主题,在连接时,向该主题发布消息。

方法二: Mqtt物联网云平台,在emqx修改系统主题订阅权限,允许某个ip订阅系统级别主题。

方法三:实现  MqttCallbackExtended,接口,通过构造方法初始化clientId,获取ClientId,从而监听设备的在线或者离线方法。

优缺点:

        方法一:简单方便,只需约定好相关主题即可实现。(基本使用所有应用场景)

        方法二:需要修改emqx的配置文件,能够灵敏的监听设备设备的在线和离线(基本使用所有应用场景)

        方法三:只适用于模拟设备创建的应用场景。

1.创建 DeviceMqttCallBacked类,实现 MqttCallbackExtended 接口,添加带cleintId参数的构造方法。

package com.example.mq.mqtt.callback;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DeviceMqttCallBacked  implements MqttCallbackExtended {

    private Logger logger = LoggerFactory.getLogger(DeviceMqttCallBacked.class);
    private String clientId;

    public DeviceMqttCallBacked(){

    }

    public DeviceMqttCallBacked(String clientId){
        this.clientId =clientId;

    }

    @Override
    public void connectComplete(boolean b, String url) {
        logger.info("设备{}:上线啦!",this.clientId);

    }

    @Override
    public void connectionLost(Throwable throwable) {
        logger.info("设备{}:离线啦!",this.clientId);
    }

    @Override
    public void messageArrived(String clientId, MqttMessage mqttMessage) throws Exception {
        logger.info("{}:收到消息{}",this.clientId,mqttMessage.getPayload().toString());

    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        try {
            logger.info("{}消息送达,消息内容为{}",this.clientId,iMqttDeliveryToken.getMessage());
        }catch (Exception e){
            logger.error("消息异常:{}",e);
        }

    }
}

2. 在Mqtt连接成功之后,设置回调类。

  mqttClient.setCallback(new DeviceMqttCallBacked(mqttClient.getClientId()));

3.执行上述代码,查看emqx界面 

4.从emqx上踢除设备

5.观察控制台结果

6.由于mqtt的尝试重连机制,防止意外掉线,影响消息的传输,会立即重连。

        

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之所想,行则将至

创作不易,希望大家多多鼓励支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值