1
This commit is contained in:
127
api/middleware/mqtt/mqttManager.js
Normal file
127
api/middleware/mqtt/mqttManager.js
Normal file
@@ -0,0 +1,127 @@
|
||||
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<MqttSyncClient>} 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;
|
||||
Reference in New Issue
Block a user