|
|
@ -6,16 +6,17 @@ import android.os.Looper; |
|
|
|
import android.util.Log; |
|
|
|
|
|
|
|
import com.ouxuan.oxface.utils.LogManager; |
|
|
|
import com.tencent.iot.hub.device.android.core.gateway.TXGatewayConnection; |
|
|
|
import com.tencent.iot.hub.device.android.core.util.TXLog; |
|
|
|
import com.tencent.iot.hub.device.java.core.log.TXMqttLogCallBack; |
|
|
|
import com.tencent.iot.hub.device.java.core.mqtt.TXMqttActionCallBack; |
|
|
|
import com.tencent.iot.hub.device.java.core.mqtt.TXMqttConstants; |
|
|
|
|
|
|
|
import org.eclipse.paho.client.mqttv3.IMqttActionListener; |
|
|
|
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; |
|
|
|
import org.eclipse.paho.client.mqttv3.DisconnectedBufferOptions; |
|
|
|
import org.eclipse.paho.client.mqttv3.IMqttToken; |
|
|
|
import org.eclipse.paho.client.mqttv3.MqttAsyncClient; |
|
|
|
import org.eclipse.paho.client.mqttv3.MqttCallback; |
|
|
|
import org.eclipse.paho.client.mqttv3.MqttConnectOptions; |
|
|
|
import org.eclipse.paho.client.mqttv3.MqttException; |
|
|
|
import org.eclipse.paho.client.mqttv3.MqttMessage; |
|
|
|
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; |
|
|
|
import org.json.JSONObject; |
|
|
|
|
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
import java.util.Date; |
|
|
@ -24,6 +25,7 @@ import java.util.concurrent.ExecutorService; |
|
|
|
import java.util.concurrent.Executors; |
|
|
|
import java.util.concurrent.ScheduledExecutorService; |
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
|
|
|
|
/** |
|
|
|
* 腾讯云MQTT管理器 |
|
|
@ -37,7 +39,7 @@ import java.util.concurrent.TimeUnit; |
|
|
|
* 5. 门闸控制和设备重启命令处理 |
|
|
|
* |
|
|
|
* @author AI Assistant |
|
|
|
* @version 1.0 |
|
|
|
* @version 2.0 |
|
|
|
* @date 2024/09/16 |
|
|
|
*/ |
|
|
|
public class MqttManager { |
|
|
@ -53,10 +55,10 @@ public class MqttManager { |
|
|
|
private static final String PRODUCT_KEY = "qr3rximCZnT6ZU0NsAAiTC7O"; |
|
|
|
|
|
|
|
// MQTT连接配置 |
|
|
|
private static final String BROKER_URL = "ssl://iotcloud-mqtt.gz.tencentcloudapi.com:8883"; |
|
|
|
private static final int KEEP_ALIVE_INTERVAL = 60; // 心跳间隔(秒) |
|
|
|
private static final int CONNECTION_TIMEOUT = 30; // 连接超时(秒) |
|
|
|
private static final int QOS = 1; // 消息质量 |
|
|
|
private static final String BROKER_URL = null; // 传入null,使用腾讯云IoT默认地址 |
|
|
|
private static final int KEEP_ALIVE_INTERVAL = 120; // 心跳间隔(秒) |
|
|
|
private static final int CONNECTION_TIMEOUT = 10; // 连接超时(秒) |
|
|
|
private static final int QOS = TXMqttConstants.QOS1; // 消息质量 |
|
|
|
|
|
|
|
// 重连配置 |
|
|
|
private static final int MAX_RECONNECT_ATTEMPTS = 5; // 最大重连次数 |
|
|
@ -65,9 +67,8 @@ public class MqttManager { |
|
|
|
|
|
|
|
// 上下文和状态管理 |
|
|
|
private Context context; |
|
|
|
private MqttAsyncClient mqttClient; |
|
|
|
private TXGatewayConnection mqttConnection; |
|
|
|
private String deviceName; |
|
|
|
private String clientId; |
|
|
|
private String subscribeTopic; |
|
|
|
|
|
|
|
// 连接状态管理 |
|
|
@ -78,6 +79,9 @@ public class MqttManager { |
|
|
|
private ExecutorService executorService; |
|
|
|
private ScheduledExecutorService scheduledExecutor; |
|
|
|
|
|
|
|
// 请求ID生成器 |
|
|
|
private static AtomicInteger requestID = new AtomicInteger(0); |
|
|
|
|
|
|
|
// 监听器接口 |
|
|
|
private ConnectionStatusListener connectionStatusListener; |
|
|
|
private MessageReceivedListener messageReceivedListener; |
|
|
@ -142,6 +146,19 @@ public class MqttManager { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* MQTT请求上下文 |
|
|
|
*/ |
|
|
|
private static class MQTTRequest { |
|
|
|
public String action; |
|
|
|
public int requestId; |
|
|
|
|
|
|
|
public MQTTRequest(String action, int requestId) { |
|
|
|
this.action = action; |
|
|
|
this.requestId = requestId; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取单例实例 |
|
|
|
*/ |
|
|
|
public static MqttManager getInstance() { |
|
|
@ -175,12 +192,11 @@ public class MqttManager { |
|
|
|
// 生成设备名称 |
|
|
|
generateDeviceName(); |
|
|
|
|
|
|
|
// 构建客户端ID和主题 |
|
|
|
// 构建MQTT配置 |
|
|
|
buildMqttConfig(); |
|
|
|
|
|
|
|
LogManager.logInfo(TAG, "MQTT管理器初始化完成"); |
|
|
|
LogManager.logInfo(TAG, "设备名称: " + deviceName); |
|
|
|
LogManager.logInfo(TAG, "客户端ID: " + clientId); |
|
|
|
LogManager.logInfo(TAG, "订阅主题: " + subscribeTopic); |
|
|
|
|
|
|
|
// 启动健康检查 |
|
|
@ -203,9 +219,6 @@ public class MqttManager { |
|
|
|
* 构建MQTT配置 |
|
|
|
*/ |
|
|
|
private void buildMqttConfig() { |
|
|
|
// 客户端ID格式:ProductID + DeviceName |
|
|
|
clientId = PRODUCT_ID + deviceName; |
|
|
|
|
|
|
|
// 订阅主题格式:ProductID/DeviceName/control |
|
|
|
subscribeTopic = PRODUCT_ID + "/" + deviceName + "/control"; |
|
|
|
|
|
|
@ -234,78 +247,67 @@ public class MqttManager { |
|
|
|
/** |
|
|
|
* 连接MQTT服务器 |
|
|
|
*/ |
|
|
|
private void connectMqtt() throws MqttException { |
|
|
|
private void connectMqtt() { |
|
|
|
LogManager.logInfo(TAG, "开始连接MQTT服务器..."); |
|
|
|
isConnecting = true; |
|
|
|
|
|
|
|
// 创建MQTT客户端 |
|
|
|
MemoryPersistence persistence = new MemoryPersistence(); |
|
|
|
mqttClient = new MqttAsyncClient(BROKER_URL, clientId, persistence); |
|
|
|
|
|
|
|
// 设置回调 |
|
|
|
mqttClient.setCallback(new MqttCallbackHandler()); |
|
|
|
|
|
|
|
// 配置连接选项 |
|
|
|
MqttConnectOptions options = new MqttConnectOptions(); |
|
|
|
options.setCleanSession(true); |
|
|
|
options.setKeepAliveInterval(KEEP_ALIVE_INTERVAL); |
|
|
|
options.setConnectionTimeout(CONNECTION_TIMEOUT); |
|
|
|
options.setAutomaticReconnect(false); // 手动控制重连 |
|
|
|
|
|
|
|
// 设置用户名和密码(腾讯云IoT平台) |
|
|
|
options.setUserName(clientId + ";" + PRODUCT_KEY); |
|
|
|
options.setPassword(DEV_PSK.toCharArray()); |
|
|
|
|
|
|
|
// 异步连接 |
|
|
|
IMqttToken connectToken = mqttClient.connect(options, null, new IMqttActionListener() { |
|
|
|
@Override |
|
|
|
public void onSuccess(IMqttToken asyncActionToken) { |
|
|
|
LogManager.logInfo(TAG, "MQTT连接成功"); |
|
|
|
isConnected = true; |
|
|
|
isConnecting = false; |
|
|
|
reconnectAttempts = 0; |
|
|
|
|
|
|
|
// 订阅主题 |
|
|
|
subscribeToTopic(); |
|
|
|
|
|
|
|
// 通知连接成功 |
|
|
|
notifyConnectionStatus(true, "连接成功"); |
|
|
|
} |
|
|
|
try { |
|
|
|
// 创建MQTT连接实例 |
|
|
|
mqttConnection = new TXGatewayConnection( |
|
|
|
context, |
|
|
|
BROKER_URL, |
|
|
|
PRODUCT_ID, |
|
|
|
deviceName, |
|
|
|
DEV_PSK, |
|
|
|
null, |
|
|
|
null, |
|
|
|
true, // 启用日志 |
|
|
|
new MqttLogCallback(), |
|
|
|
new MqttActionCallback() |
|
|
|
); |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(IMqttToken asyncActionToken, Throwable exception) { |
|
|
|
LogManager.logError(TAG, "MQTT连接失败", exception); |
|
|
|
isConnecting = false; |
|
|
|
|
|
|
|
// 通知连接失败 |
|
|
|
notifyConnectionStatus(false, "连接失败: " + exception.getMessage()); |
|
|
|
|
|
|
|
// 调度重连 |
|
|
|
scheduleReconnect(); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
LogManager.logInfo(TAG, "MQTT连接请求已发送"); |
|
|
|
// 配置连接选项 |
|
|
|
MqttConnectOptions options = new MqttConnectOptions(); |
|
|
|
options.setConnectionTimeout(CONNECTION_TIMEOUT); |
|
|
|
options.setKeepAliveInterval(KEEP_ALIVE_INTERVAL); |
|
|
|
options.setAutomaticReconnect(true); |
|
|
|
options.setCleanSession(false); // 关闭clean session |
|
|
|
|
|
|
|
// 使用PSK认证 |
|
|
|
LogManager.logInfo(TAG, "使用PSK认证连接"); |
|
|
|
|
|
|
|
// 连接MQTT |
|
|
|
MQTTRequest mqttRequest = new MQTTRequest("connect", requestID.getAndIncrement()); |
|
|
|
mqttConnection.connect(options, mqttRequest); |
|
|
|
|
|
|
|
// 配置断线缓冲选项 |
|
|
|
DisconnectedBufferOptions bufferOptions = new DisconnectedBufferOptions(); |
|
|
|
bufferOptions.setBufferEnabled(true); |
|
|
|
bufferOptions.setBufferSize(1024); |
|
|
|
bufferOptions.setDeleteOldestMessages(true); |
|
|
|
bufferOptions.setPersistBuffer(true); // 持久化缓冲区 |
|
|
|
|
|
|
|
mqttConnection.setBufferOpts(bufferOptions); |
|
|
|
|
|
|
|
LogManager.logInfo(TAG, "MQTT连接请求已发送"); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
LogManager.logError(TAG, "创建MQTT连接失败", e); |
|
|
|
isConnecting = false; |
|
|
|
scheduleReconnect(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 订阅主题 |
|
|
|
*/ |
|
|
|
private void subscribeToTopic() { |
|
|
|
if (mqttClient != null && isConnected) { |
|
|
|
if (mqttConnection != null && isConnected) { |
|
|
|
try { |
|
|
|
IMqttToken subToken = mqttClient.subscribe(subscribeTopic, QOS, null, new IMqttActionListener() { |
|
|
|
@Override |
|
|
|
public void onSuccess(IMqttToken asyncActionToken) { |
|
|
|
LogManager.logInfo(TAG, "主题订阅成功: " + subscribeTopic); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(IMqttToken asyncActionToken, Throwable exception) { |
|
|
|
LogManager.logError(TAG, "主题订阅失败: " + subscribeTopic, exception); |
|
|
|
} |
|
|
|
}); |
|
|
|
} catch (MqttException e) { |
|
|
|
MQTTRequest mqttRequest = new MQTTRequest("subscribeTopic", requestID.getAndIncrement()); |
|
|
|
mqttConnection.subscribe(subscribeTopic, QOS, mqttRequest); |
|
|
|
LogManager.logInfo(TAG, "开始订阅主题: " + subscribeTopic); |
|
|
|
} catch (Exception e) { |
|
|
|
LogManager.logError(TAG, "订阅主题异常", e); |
|
|
|
} |
|
|
|
} |
|
|
@ -356,8 +358,8 @@ public class MqttManager { |
|
|
|
* 检查连接健康状态 |
|
|
|
*/ |
|
|
|
private void checkConnectionHealth() { |
|
|
|
if (mqttClient != null) { |
|
|
|
boolean clientConnected = mqttClient.isConnected(); |
|
|
|
if (mqttConnection != null) { |
|
|
|
boolean clientConnected = mqttConnection.isConnected(); |
|
|
|
|
|
|
|
if (isConnected && !clientConnected) { |
|
|
|
LogManager.logWarning(TAG, "检测到连接状态不一致,触发重连"); |
|
|
@ -374,12 +376,41 @@ public class MqttManager { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* MQTT回调处理器 |
|
|
|
* MQTT动作回调处理器 |
|
|
|
*/ |
|
|
|
private class MqttCallbackHandler implements MqttCallback { |
|
|
|
private class MqttActionCallback extends TXMqttActionCallBack { |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onConnectCompleted(int status, boolean reconnect, Object userContext, String msg) { |
|
|
|
if (status == TXMqttConstants.MQTT_SDK_SUCCESS) { |
|
|
|
LogManager.logInfo(TAG, "MQTT连接成功 - 重连: " + reconnect); |
|
|
|
isConnected = true; |
|
|
|
isConnecting = false; |
|
|
|
reconnectAttempts = 0; |
|
|
|
|
|
|
|
// 订阅主题 |
|
|
|
subscribeToTopic(); |
|
|
|
|
|
|
|
// 通知连接成功 |
|
|
|
if (connectionStatusListener != null) { |
|
|
|
mainHandler.post(() -> connectionStatusListener.onConnected()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
LogManager.logError(TAG, "MQTT连接失败: " + msg); |
|
|
|
isConnecting = false; |
|
|
|
|
|
|
|
// 通知连接失败 |
|
|
|
if (connectionStatusListener != null) { |
|
|
|
mainHandler.post(() -> connectionStatusListener.onConnectionFailed(msg)); |
|
|
|
} |
|
|
|
|
|
|
|
// 调度重连 |
|
|
|
scheduleReconnect(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void connectionLost(Throwable cause) { |
|
|
|
public void onConnectionLost(Throwable cause) { |
|
|
|
LogManager.logError(TAG, "MQTT连接丢失", cause); |
|
|
|
isConnected = false; |
|
|
|
isConnecting = false; |
|
|
@ -394,7 +425,37 @@ public class MqttManager { |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void messageArrived(String topic, MqttMessage message) throws Exception { |
|
|
|
public void onDisconnectCompleted(int status, Object userContext, String msg) { |
|
|
|
LogManager.logInfo(TAG, "MQTT连接已断开: " + msg); |
|
|
|
isConnected = false; |
|
|
|
isConnecting = false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onPublishCompleted(int status, IMqttToken token, Object userContext, String msg) { |
|
|
|
if (status == TXMqttConstants.MQTT_SDK_SUCCESS) { |
|
|
|
LogManager.logDebug(TAG, "消息发布成功"); |
|
|
|
} else { |
|
|
|
LogManager.logError(TAG, "消息发布失败: " + msg); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onSubscribeCompleted(int status, IMqttToken token, Object userContext, String msg) { |
|
|
|
if (status == TXMqttConstants.MQTT_SDK_SUCCESS) { |
|
|
|
LogManager.logInfo(TAG, "主题订阅成功: " + subscribeTopic); |
|
|
|
} else { |
|
|
|
LogManager.logError(TAG, "主题订阅失败: " + msg); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onUnSubscribeCompleted(int status, IMqttToken token, Object userContext, String msg) { |
|
|
|
LogManager.logInfo(TAG, "取消订阅完成: " + msg); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onMessageReceived(String topic, MqttMessage message) { |
|
|
|
String messageContent = new String(message.getPayload()); |
|
|
|
String timestamp = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault()).format(new Date()); |
|
|
|
|
|
|
@ -403,10 +464,31 @@ public class MqttManager { |
|
|
|
// 处理消息 |
|
|
|
processMessage(topic, messageContent); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* MQTT日志回调处理器 |
|
|
|
*/ |
|
|
|
private class MqttLogCallback extends TXMqttLogCallBack { |
|
|
|
|
|
|
|
@Override |
|
|
|
public void deliveryComplete(IMqttDeliveryToken token) { |
|
|
|
LogManager.logDebug(TAG, "消息发送完成"); |
|
|
|
public String setSecretKey() { |
|
|
|
return null; // 不设置密钥,使用默认日志 |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void printDebug(String message) { |
|
|
|
LogManager.logDebug(TAG, "MQTT Debug: " + message); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean saveLogOffline() { |
|
|
|
return false; // 不保存离线日志 |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean uploadLogFile() { |
|
|
|
return false; // 不上传日志文件 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -526,8 +608,8 @@ public class MqttManager { |
|
|
|
mainHandler.post(() -> messageReceivedListener.onLogLevelQueryReceived()); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: 实现设备信息上报 |
|
|
|
LogManager.logInfo(TAG, "设备信息上报功能待实现"); |
|
|
|
// 自动上报设备信息 |
|
|
|
uploadDeviceInfo(); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
LogManager.logError(TAG, "处理日志级别查询异常", e); |
|
|
@ -546,28 +628,45 @@ public class MqttManager { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 上报设备信息 |
|
|
|
*/ |
|
|
|
private void uploadDeviceInfo() { |
|
|
|
try { |
|
|
|
// 构建设备信息 |
|
|
|
JSONObject deviceInfo = new JSONObject(); |
|
|
|
deviceInfo.put("deviceId", DeviceUtils.getAndroidID(context)); |
|
|
|
deviceInfo.put("deviceModel", DeviceUtils.getDeviceModel()); |
|
|
|
deviceInfo.put("deviceBrand", DeviceUtils.getDeviceBrand()); |
|
|
|
deviceInfo.put("androidVersion", DeviceUtils.getAndroidVersion()); |
|
|
|
deviceInfo.put("timestamp", System.currentTimeMillis()); |
|
|
|
|
|
|
|
// 发送设备信息 |
|
|
|
String dataTopic = PRODUCT_ID + "/" + deviceName + "/data"; |
|
|
|
publishMessage(dataTopic, deviceInfo.toString()); |
|
|
|
|
|
|
|
LogManager.logInfo(TAG, "设备信息上报完成: " + deviceInfo.toString()); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
LogManager.logError(TAG, "设备信息上报失败", e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 发布消息 |
|
|
|
*/ |
|
|
|
public void publishMessage(String topic, String messageContent) { |
|
|
|
if (mqttClient != null && isConnected) { |
|
|
|
if (mqttConnection != null && isConnected) { |
|
|
|
try { |
|
|
|
MqttMessage message = new MqttMessage(messageContent.getBytes()); |
|
|
|
MqttMessage message = new MqttMessage(); |
|
|
|
message.setQos(QOS); |
|
|
|
message.setRetained(false); |
|
|
|
message.setPayload(messageContent.getBytes()); |
|
|
|
|
|
|
|
MQTTRequest mqttRequest = new MQTTRequest("publishTopic", requestID.getAndIncrement()); |
|
|
|
mqttConnection.publish(topic, message, mqttRequest); |
|
|
|
|
|
|
|
IMqttToken pubToken = mqttClient.publish(topic, message, null, new IMqttActionListener() { |
|
|
|
@Override |
|
|
|
public void onSuccess(IMqttToken asyncActionToken) { |
|
|
|
LogManager.logInfo(TAG, "消息发布成功,主题: " + topic); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(IMqttToken asyncActionToken, Throwable exception) { |
|
|
|
LogManager.logError(TAG, "消息发布失败,主题: " + topic, exception); |
|
|
|
} |
|
|
|
}); |
|
|
|
LogManager.logInfo(TAG, "消息发布请求已发送,主题: " + topic); |
|
|
|
|
|
|
|
} catch (MqttException e) { |
|
|
|
} catch (Exception e) { |
|
|
|
LogManager.logError(TAG, "发布消息异常", e); |
|
|
|
} |
|
|
|
} else { |
|
|
@ -579,7 +678,7 @@ public class MqttManager { |
|
|
|
* 获取连接状态 |
|
|
|
*/ |
|
|
|
public boolean isConnected() { |
|
|
|
return isConnected && mqttClient != null && mqttClient.isConnected(); |
|
|
|
return isConnected && mqttConnection != null && mqttConnection.isConnected(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -598,21 +697,6 @@ public class MqttManager { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 通知连接状态 |
|
|
|
*/ |
|
|
|
private void notifyConnectionStatus(boolean connected, String message) { |
|
|
|
if (connectionStatusListener != null) { |
|
|
|
mainHandler.post(() -> { |
|
|
|
if (connected) { |
|
|
|
connectionStatusListener.onConnected(); |
|
|
|
} else { |
|
|
|
connectionStatusListener.onConnectionFailed(message); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置连接状态监听器 |
|
|
|
*/ |
|
|
|
public void setConnectionStatusListener(ConnectionStatusListener listener) { |
|
|
@ -635,20 +719,11 @@ public class MqttManager { |
|
|
|
isConnected = false; |
|
|
|
isConnecting = false; |
|
|
|
|
|
|
|
if (mqttClient != null && mqttClient.isConnected()) { |
|
|
|
if (mqttConnection != null && mqttConnection.isConnected()) { |
|
|
|
try { |
|
|
|
IMqttToken disconnectToken = mqttClient.disconnect(null, new IMqttActionListener() { |
|
|
|
@Override |
|
|
|
public void onSuccess(IMqttToken asyncActionToken) { |
|
|
|
LogManager.logInfo(TAG, "MQTT连接已断开"); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(IMqttToken asyncActionToken, Throwable exception) { |
|
|
|
LogManager.logError(TAG, "断开MQTT连接失败", exception); |
|
|
|
} |
|
|
|
}); |
|
|
|
} catch (MqttException e) { |
|
|
|
MQTTRequest mqttRequest = new MQTTRequest("disconnect", requestID.getAndIncrement()); |
|
|
|
mqttConnection.disConnect(mqttRequest); |
|
|
|
} catch (Exception e) { |
|
|
|
LogManager.logError(TAG, "断开MQTT连接异常", e); |
|
|
|
} |
|
|
|
} |
|
|
@ -673,7 +748,7 @@ public class MqttManager { |
|
|
|
} |
|
|
|
|
|
|
|
// 清理资源 |
|
|
|
mqttClient = null; |
|
|
|
mqttConnection = null; |
|
|
|
connectionStatusListener = null; |
|
|
|
messageReceivedListener = null; |
|
|
|
|
|
|
|