From 468bf25af20bdc54d2510c68b2f6fe5bfc429a2a Mon Sep 17 00:00:00 2001 From: MT <3075067877@qq.com> Date: Tue, 16 Sep 2025 18:21:07 +0800 Subject: [PATCH] fix 6.1 --- .../java/com/ouxuan/oxface/device/MqttManager.java | 41 ++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/ouxuan/oxface/device/MqttManager.java b/app/src/main/java/com/ouxuan/oxface/device/MqttManager.java index e5bf584..72a7f19 100644 --- a/app/src/main/java/com/ouxuan/oxface/device/MqttManager.java +++ b/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_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 CONNECTION_TIMEOUT = 30; // 增加连接超时时间 private static final int QOS = 1; @@ -550,12 +550,29 @@ public class MqttManager { isConnecting = false; 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) { mainHandler.post(() -> connectionStatusListener.onConnectionLost(reason)); } - - // 触发重连 - scheduleReconnect(); } @Override @@ -614,6 +631,18 @@ public class MqttManager { String errorMsg = errMsg != null ? errMsg : "未知错误"; 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("代理程序不可用")) { LogManager.logError(TAG, "MQTT代理程序不可用,请检查网络连接和腾讯云IoT设备配置");