agri-app/utils/mqtt.js

79 lines
2.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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,
};
}