const MqttSyncClient = require('./mqttClient'); const Framework = require('../../../framework/node-core-framework'); const logs = require('../logProxy'); // action.js 已合并到 mqttDispatcher.js,不再需要单独引入 /** * MQTT管理器 - 单例模式 * 负责管理MQTT连接,确保全局只有一个MQTT客户端实例 */ class MqttManager { constructor() { this.client = null; this.isInitialized = false; this.config = { brokerUrl: 'mqtt://192.144.167.231:1883', // MQTT Broker地址 options: { clientId: `mqtt_server_${Math.random().toString(16).substr(2, 8)}`, clean: true, connectTimeout: 5000, reconnectPeriod: 5000, // 自动重连间隔 keepalive: 10 } }; } /** * 获取MQTT客户端实例(单例模式) * @param {object} config - 可选的配置覆盖 * @returns {Promise} MQTT客户端实例 */ async getInstance(config = {}) { if (this.client && this.isInitialized) { console.log('[MQTT管理器] 返回已存在的MQTT客户端实例'); return this.client; } // 合并配置 if (config.brokerUrl) { this.config.brokerUrl = config.brokerUrl; } if (config.options) { this.config.options = { ...this.config.options, ...config.options }; } try { console.log('[MQTT管理器] 创建新的MQTT客户端实例'); console.log(`[MQTT管理器] Broker地址: ${this.config.brokerUrl}`); // 创建MQTT客户端 this.client = new MqttSyncClient(this.config.brokerUrl, this.config.options); // 等待连接成功 await this.client.waitForConnect(10000); // 注意:心跳和响应的订阅已移到 mqttDispatcher 中处理 // 这里不再直接订阅,由调度系统通过 mqttDispatcher 统一管理 console.log('[MQTT管理器] MQTT客户端连接成功,等待分发器初始化订阅'); this.isInitialized = true; console.log('[MQTT管理器] MQTT客户端初始化成功'); return this.client; } catch (error) { console.error('[MQTT管理器] MQTT客户端初始化失败:', error); this.client = null; this.isInitialized = false; throw error; } } /** * 重置MQTT客户端(用于重新连接) */ async reset() { if (this.client) { try { console.log('[MQTT管理器] 关闭现有MQTT连接'); this.client.end(true); } catch (error) { console.error('[MQTT管理器] 关闭MQTT连接时出错:', error); } } this.client = null; this.isInitialized = false; console.log('[MQTT管理器] MQTT客户端已重置'); } /** * 检查MQTT客户端是否已初始化 * @returns {boolean} */ isReady() { return this.isInitialized && this.client && this.client.isConnected; } /** * 更新配置 * @param {object} config - 新的配置 */ updateConfig(config) { if (this.isInitialized) { console.warn('[MQTT管理器] MQTT客户端已初始化,配置更新需要重置连接'); } if (config.brokerUrl) { this.config.brokerUrl = config.brokerUrl; } if (config.options) { this.config.options = { ...this.config.options, ...config.options }; } console.log('[MQTT管理器] 配置已更新:', this.config); } /** * 获取当前配置 * @returns {object} */ getConfig() { return { ...this.config }; } } // 导出单例 const mqttManager = new MqttManager(); module.exports = mqttManager;