79 lines
2.0 KiB
JavaScript
79 lines
2.0 KiB
JavaScript
import mqtt from 'mqtt';
|
||
|
||
// 全局变量
|
||
let client= {
|
||
instance : null,
|
||
connected: false
|
||
} ;
|
||
|
||
/**
|
||
* 初始化MQTT连接(无Promise,纯回调)
|
||
* @param {Object} config 连接配置 {host, port, username, password, clientId, isSSL, keepalive, clean}
|
||
* @param {Array} subs 订阅主题列表 [{topic: 'xxx', qos: 0}]
|
||
*/
|
||
export function initMQTT(config, subs = []) {
|
||
// 1. 已有连接:直接回调成功
|
||
if (client.instance && client.instance.connected) {
|
||
return client;
|
||
}
|
||
|
||
const options = {
|
||
clientId: 'uniapp_mqtt_' + Math.random().toString(16).substr(2, 8),
|
||
username: config.username,
|
||
password: config.password,
|
||
clean: true,
|
||
connectTimeout: 4000,
|
||
reconnectPeriod: 1000
|
||
}
|
||
|
||
// 5. 构建连接参数
|
||
const protocol = config.protocol || (config.isSSL ? 'wss' : 'ws');
|
||
const url = `${protocol}://${config.host}:${config.port}/mqtt`
|
||
|
||
client.instance = mqtt.connect(url, options)
|
||
|
||
client.instance.on('connect', () => {
|
||
client.connected = true
|
||
client.instance.subscribe(subs, {qos: 0})
|
||
console.info('已连接到MQTT服务器')
|
||
console.info(client.instance)
|
||
})
|
||
|
||
client.instance.on('close', () => {
|
||
console.info('连接已关闭')
|
||
client.connected = false
|
||
console.info(client.instance)
|
||
})
|
||
}
|
||
|
||
|
||
/**
|
||
* 断开MQTT连接(无Promise,纯回调)
|
||
* @param {Function} onComplete 完成回调 () => {}
|
||
*/
|
||
export function disconnectMQTT() {
|
||
if (client.instance && client.connected) {
|
||
client.instance.end()
|
||
client.connected = false
|
||
console.info('已断开MQTT连接')
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取MQTT客户端实例
|
||
* @returns {Client} MQTT客户端
|
||
*/
|
||
export function getMQTTClientInstance() {
|
||
return client.instance;
|
||
}
|
||
|
||
/**
|
||
* 获取MQTT连接状态
|
||
* @returns {Object} {isConnected: Boolean, isConnecting: Boolean}
|
||
*/
|
||
export function getMQTTStatus() {
|
||
return {
|
||
isConnected: !!client && client.connected,
|
||
};
|
||
}
|