Browse Source

fix 6.1

devab
赵明涛 4 weeks ago
parent
commit
468bf25af2
  1. 41
      app/src/main/java/com/ouxuan/oxface/device/MqttManager.java

41
app/src/main/java/com/ouxuan/oxface/device/MqttManager.java

@ -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设备配置");

Loading…
Cancel
Save