mqtt全局工具
parent
e5c243b74e
commit
15a5db4479
18
App.vue
18
App.vue
|
|
@ -19,11 +19,10 @@
|
||||||
keepalive: 60,
|
keepalive: 60,
|
||||||
clean: true
|
clean: true
|
||||||
},
|
},
|
||||||
globalSubscribeTopic: [ // 全局基础订阅列表(所有页面都需要的主题)
|
mqttSubscribeList: [ // 全局基础订阅列表(所有页面都需要的主题)
|
||||||
{topic: 'dtu/#', qos: 0},
|
{topic: 'dtu/#', qos: 0},
|
||||||
// {topic: 'system/status', qos: 1}
|
// {topic: 'system/status', qos: 1}
|
||||||
],
|
],
|
||||||
mqttStatus: 'disconnected' // 全局连接状态:connected/disconnected/reconnecting
|
|
||||||
},
|
},
|
||||||
onLaunch() {
|
onLaunch() {
|
||||||
this.initApp()
|
this.initApp()
|
||||||
|
|
@ -33,18 +32,16 @@
|
||||||
onShow() {
|
onShow() {
|
||||||
console.log('应用切前台,检查MQTT连接');
|
console.log('应用切前台,检查MQTT连接');
|
||||||
const { isConnected } = getMQTTStatus();
|
const { isConnected } = getMQTTStatus();
|
||||||
if (!isConnected && this.globalData.mqttStatus !== 'disconnected') {
|
if (!isConnected) {
|
||||||
// 非主动断开的情况下,切前台重连
|
this.initGlobalMQTT();
|
||||||
manualReconnect(this.globalData.mqttConfig);
|
|
||||||
this.globalData.mqttStatus = 'reconnecting';
|
|
||||||
}
|
}
|
||||||
|
console.info("mqtt:",isConnected,getMQTTStatus);
|
||||||
},
|
},
|
||||||
|
|
||||||
onHide() {
|
onHide() {
|
||||||
console.log('应用切后台,断开MQTT连接');
|
console.log('应用切后台,断开MQTT连接');
|
||||||
// 切后台主动断开(避免小程序后台占用资源)
|
// 切后台主动断开(避免小程序后台占用资源)
|
||||||
disconnectMQTT();
|
disconnectMQTT();
|
||||||
this.globalData.mqttStatus = 'disconnected';
|
|
||||||
this.globalData.mqttClient = null;
|
this.globalData.mqttClient = null;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
@ -71,15 +68,16 @@
|
||||||
// 调用工具类初始化连接(传入全局配置+全局订阅列表)
|
// 调用工具类初始化连接(传入全局配置+全局订阅列表)
|
||||||
const client = await initMQTT(
|
const client = await initMQTT(
|
||||||
this.globalData.mqttConfig,
|
this.globalData.mqttConfig,
|
||||||
this.globalData.globalSubscribeTopic
|
this.globalData.mqttSubscribeList
|
||||||
);
|
);
|
||||||
// 挂载客户端到全局
|
// 挂载客户端到全局
|
||||||
this.globalData.mqttClient = client;
|
this.globalData.mqttClient = client;
|
||||||
this.globalData.mqttStatus = 'connected';
|
// 通知所有页面:客户端已就绪,可绑定自定义事件
|
||||||
|
uni.$emit('mqtt_client_ready', client);
|
||||||
console.log('全局MQTT初始化成功');
|
console.log('全局MQTT初始化成功');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('全局MQTT初始化失败:', err);
|
console.error('全局MQTT初始化失败:', err);
|
||||||
this.globalData.mqttStatus = 'disconnected';
|
uni.$emit('mqtt_init_fail', err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ let isManualDisconnect = false; // 是否主动断开(用于区分主动/被
|
||||||
* 初始化MQTT连接
|
* 初始化MQTT连接
|
||||||
* @param {Object} config - MQTT连接配置
|
* @param {Object} config - MQTT连接配置
|
||||||
* @param {Array} subs - 初始订阅列表,格式:[{ topic: 'topic1', qos: 0 }, { topic: 'topic2', qos: 1 }]
|
* @param {Array} subs - 初始订阅列表,格式:[{ topic: 'topic1', qos: 0 }, { topic: 'topic2', qos: 1 }]
|
||||||
|
* // 初始化连接(移除事件监听,只返回客户端实例)
|
||||||
* @returns {Promise} 连接成功/失败的Promise
|
* @returns {Promise} 连接成功/失败的Promise
|
||||||
*/
|
*/
|
||||||
export function initMQTT(config, subs = []) {
|
export function initMQTT(config, subs = []) {
|
||||||
|
|
@ -60,50 +61,42 @@ export function initMQTT(config, subs = []) {
|
||||||
// 7. 创建客户端并连接
|
// 7. 创建客户端并连接
|
||||||
client = mqtt.connect(connectUrl, mqttOptions);
|
client = mqtt.connect(connectUrl, mqttOptions);
|
||||||
|
|
||||||
// 8. 监听连接成功
|
// 仅保留连接成功的基础逻辑(订阅列表),移除其他事件监听
|
||||||
client.on('connect', () => {
|
client.on('connect', () => {
|
||||||
console.log('MQTT连接成功:', connectUrl);
|
console.log('MQTT连接成功:', connectUrl);
|
||||||
currentReconnectTimes = 0; // 重置重连次数
|
currentReconnectTimes = 0;
|
||||||
// 9. 订阅初始主题
|
// 9. 订阅初始主题
|
||||||
subscribeTopics(subscribeList);
|
subscribeTopics(subscribeList);
|
||||||
resolve(client);
|
resolve(client); // 成功后返回客户端实例,让页面自定义监听
|
||||||
});
|
});
|
||||||
|
|
||||||
// 10. 监听连接错误
|
// 移除工具层的error/close/message监听 → 交给页面处理
|
||||||
client.on('error', (err) => {
|
// 保留重连的核心逻辑(通过单独的close监听,仅用于重连,不处理业务)
|
||||||
console.error('MQTT连接错误:', err);
|
client.on('close', () => {
|
||||||
client.end();
|
console.log('MQTT连接已断开(工具层)');
|
||||||
reject(err);
|
const oldClient = client; // 暂存旧客户端,避免重连时被覆盖
|
||||||
});
|
client = null;
|
||||||
|
if (!isManualDisconnect && currentReconnectTimes < maxReconnectTimes) {
|
||||||
// 11. 监听连接断开(被动断开则触发重连)
|
reconnectMQTT(config).then(newClient => {
|
||||||
client.on('close', () => {
|
// 重连成功后,全局通知页面:客户端已更换,需重新绑定事件
|
||||||
console.log('MQTT连接已断开');
|
uni.$emit('mqtt_reconnected', newClient);
|
||||||
client = null;
|
}).catch(err => {
|
||||||
// 非主动断开 + 未达最大重连次数 → 触发重连
|
uni.$emit('mqtt_reconnect_fail', err);
|
||||||
if (!isManualDisconnect && currentReconnectTimes < maxReconnectTimes) {
|
});
|
||||||
reconnectMQTT(config);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 12. 监听消息(全局消息转发,页面层通过uni.$on监听)
|
|
||||||
client.on('message', (topic, message) => {
|
|
||||||
const msg = {
|
|
||||||
topic,
|
|
||||||
payload: message.toString(), // 转字符串(原始是Buffer)
|
|
||||||
timestamp: Date.now()
|
|
||||||
};
|
|
||||||
// 全局广播消息,页面层按需监听
|
|
||||||
uni.$emit('mqtt_message', msg);
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
console.error('MQTT初始化失败:', err);
|
|
||||||
reject(err);
|
|
||||||
}
|
}
|
||||||
});
|
// 通知页面:旧客户端已断开
|
||||||
|
uni.$emit('mqtt_closed', oldClient);
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.error('MQTT初始化失败:', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 其他方法(subscribeTopics/unsubscribeTopics/publishMQTT/disconnectMQTT/reconnectMQTT/getMQTTStatus/manualReconnect)
|
||||||
|
// 【完全不变】,直接复用之前的代码
|
||||||
/**
|
/**
|
||||||
* 订阅主题(支持单个/多个)
|
* 订阅主题(支持单个/多个)
|
||||||
* @param {Array} topics - 订阅列表,格式:[{ topic: 'topic1', qos: 0 }, { topic: 'topic2', qos: 1 }]
|
* @param {Array} topics - 订阅列表,格式:[{ topic: 'topic1', qos: 0 }, { topic: 'topic2', qos: 1 }]
|
||||||
|
|
@ -257,4 +250,8 @@ export function getMQTTStatus() {
|
||||||
export function manualReconnect(config) {
|
export function manualReconnect(config) {
|
||||||
currentReconnectTimes = 0; // 重置重连次数
|
currentReconnectTimes = 0; // 重置重连次数
|
||||||
reconnectMQTT(config);
|
reconnectMQTT(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMQTTClientInstance() {
|
||||||
|
return client;
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue