|
@ -54,9 +54,9 @@ public class MqttManager { |
|
|
private static final String PRODUCT_ID = "WZX68L5I75"; |
|
|
private static final String PRODUCT_ID = "WZX68L5I75"; |
|
|
private static final String PRODUCT_KEY = "qr3rximCZnT6ZU0NsAAiTC7O"; // 动态注册用的ProductKey |
|
|
private static final String PRODUCT_KEY = "qr3rximCZnT6ZU0NsAAiTC7O"; // 动态注册用的ProductKey |
|
|
|
|
|
|
|
|
// MQTT连接配置 |
|
|
|
|
|
// private static final String BROKER_URL = "ssl://" + PRODUCT_ID + ".iotcloud.tencentdevices.com:8883"; // 腾讯云IoT Hub SSL地址 |
|
|
|
|
|
private static final String BROKER_URL = null ; |
|
|
|
|
|
|
|
|
// MQTT连接配置 - 根据腾讯云IoT官方文档配置 |
|
|
|
|
|
// MQTTS(8883): ${productid}.iotcloud.tencentdevices.com |
|
|
|
|
|
private static final String BROKER_URL = "ssl://" + PRODUCT_ID + ".iotcloud.tencentdevices.com:8883"; // 腾讯云IoT Hub SSL地址 |
|
|
private static final int KEEP_ALIVE_INTERVAL = 240; // 增加心跳间隔 |
|
|
private static final int KEEP_ALIVE_INTERVAL = 240; // 增加心跳间隔 |
|
|
private static final int CONNECTION_TIMEOUT = 30; // 增加连接超时时间 |
|
|
private static final int CONNECTION_TIMEOUT = 30; // 增加连接超时时间 |
|
|
private static final int QOS = 1; |
|
|
private static final int QOS = 1; |
|
@ -550,12 +550,29 @@ public class MqttManager { |
|
|
isConnecting = false; |
|
|
isConnecting = false; |
|
|
|
|
|
|
|
|
String reason = cause != null ? cause.getMessage() : "未知原因"; |
|
|
String reason = cause != null ? cause.getMessage() : "未知原因"; |
|
|
|
|
|
|
|
|
|
|
|
// 检查是否是由于腾讯云SDK内部的NullPointerException导致的断连 |
|
|
|
|
|
if (reason.contains("java.lang.NullPointerException") && |
|
|
|
|
|
reason.contains("String.contains")) { |
|
|
|
|
|
LogManager.logError(TAG, "检测到由于腾讯云IoT Hub SDK内部问题导致的断连"); |
|
|
|
|
|
LogManager.logError(TAG, "这可能是SDK版本兼容性问题,将适当延迟重连"); |
|
|
|
|
|
|
|
|
|
|
|
// 对于这种情况,我们增加一些延迟重连的逻辑 |
|
|
|
|
|
scheduledExecutor.schedule(() -> { |
|
|
|
|
|
if (!isConnected && !isConnecting) { |
|
|
|
|
|
LogManager.logInfo(TAG, "尝试从腾讯云SDK内部错误中恢复连接"); |
|
|
|
|
|
scheduleReconnect(); |
|
|
|
|
|
} |
|
|
|
|
|
}, 2000, TimeUnit.MILLISECONDS); // 2秒延迟 |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
// 正常的连接丢失,立即重连 |
|
|
|
|
|
scheduleReconnect(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (connectionStatusListener != null) { |
|
|
if (connectionStatusListener != null) { |
|
|
mainHandler.post(() -> connectionStatusListener.onConnectionLost(reason)); |
|
|
mainHandler.post(() -> connectionStatusListener.onConnectionLost(reason)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 触发重连 |
|
|
|
|
|
scheduleReconnect(); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
@ -614,6 +631,18 @@ public class MqttManager { |
|
|
String errorMsg = errMsg != null ? errMsg : "未知错误"; |
|
|
String errorMsg = errMsg != null ? errMsg : "未知错误"; |
|
|
LogManager.logError(TAG, "主题订阅失败: " + errorMsg); |
|
|
LogManager.logError(TAG, "主题订阅失败: " + errorMsg); |
|
|
|
|
|
|
|
|
|
|
|
// 检查是否是腾讯云SDK内部的NullPointerException |
|
|
|
|
|
if (errorMsg != null && errorMsg.contains("java.lang.NullPointerException")) { |
|
|
|
|
|
LogManager.logError(TAG, "检测到腾讯云IoT Hub SDK内部的NullPointerException,这可能是SDK的问题"); |
|
|
|
|
|
LogManager.logError(TAG, "尝试忽略这个错误并继续保持连接"); |
|
|
|
|
|
|
|
|
|
|
|
// 对于腾讯云SDK内部的gateway result主题订阅失败,我们可以忽略 |
|
|
|
|
|
if (tokenInfo.contains("$gateway/operation/result")) { |
|
|
|
|
|
LogManager.logWarning(TAG, "忽略gateway result主题订阅失败,这不影响主要功能"); |
|
|
|
|
|
return; // 不触发重连 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 检查是否是由于代理程序不可用导致的错误 |
|
|
// 检查是否是由于代理程序不可用导致的错误 |
|
|
if (errorMsg != null && errorMsg.contains("代理程序不可用")) { |
|
|
if (errorMsg != null && errorMsg.contains("代理程序不可用")) { |
|
|
LogManager.logError(TAG, "MQTT代理程序不可用,请检查网络连接和腾讯云IoT设备配置"); |
|
|
LogManager.logError(TAG, "MQTT代理程序不可用,请检查网络连接和腾讯云IoT设备配置"); |
|
|