目录
1.创建 DeviceMqttCallBacked类,实现 MqttCallbackExtended 接口,添加带cleintId参数的构造方法。
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的尝试重连机制,防止意外掉线,影响消息的传输,会立即重连。