2025-04-16 02:11:26 +01:00

140 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import mqtt from '@/common/js/mqtt4.1.0.min.js' //不能使用最新版本的mqtt,微信小程序真机有问题只能使用4.1.0或者2.18.8
// let mqtt = require('mqtt/dist/mqtt.min.js');
import { getTokenSync } from "@/utils/auth";
import setting from '@/setting.js';
let mqttTool = {
client: null,
}
/** 连接Mqtt */
mqttTool.connect = function () {
let options = {
username: "wumei-smart",
password: getTokenSync(),
clean: true,
keepAlive: 30,
clientId: 'phone-' + Math.random().toString(16).substr(2),
connectTimeout: 10000
}
// 配置Mqtt地址
let url = setting.mqttUrl + '/mqtt';
mqttTool.client = mqtt.connect(url, options);
mqttTool.client.on("connect", (e) => {
console.log('mqtt连接成功');
});
// 重新连接
mqttTool.client.on('reconnect', (error) => {
console.log('正在重连:', error)
});
// 发生错误
mqttTool.client.on('error', (error) => {
console.log('Mqtt客户端连接失败', error)
mqttTool.client.end();
})
// 断开连接
mqttTool.client.on('close', function (res) {
console.log('已断开Mqtt连接');
});
}
/** 断开连接 */
mqttTool.end = function () {
return new Promise((resolve, reject) => {
if (mqttTool.client == null) {
resolve('未连接')
console.log("未连接")
return;
}
mqttTool.client.end()
mqttTool.client = null
console.log('Mqtt服务器已断开连接');
resolve('连接终止')
})
}
/** 重新连接 */
mqttTool.reconnect = function () {
return new Promise((resolve, reject) => {
if (mqttTool.client == null) {
// 调用resolve方法Promise变为操作成功状态fulfilled
resolve('未连接')
console.log("未连接")
return;
}
console.log('正在重连...', res);
mqttTool.client.reconnect()
})
}
/** 消息订阅 */
mqttTool.subscribe = function (topics) {
return new Promise((resolve, reject) => {
if (mqttTool.client == null) {
resolve('未连接')
console.log("未连接")
uni.showToast({
icon: 'none',
title: 'mqtt未连接',
});
return;
}
mqttTool.client.subscribe(topics, {
qos: 1
}, function (err, res) {
console.log("订阅主题:", topics);
if (!err) {
console.log("订阅成功")
resolve('订阅成功')
} else {
console.log("订阅失败,主题可能已经订阅")
resolve('订阅失败')
return;
}
})
})
}
/** 取消订阅 */
mqttTool.unsubscribe = function (topics) {
return new Promise((resolve, reject) => {
if (mqttTool.client == null) {
resolve('未连接')
console.log("未连接")
return;
}
mqttTool.client.unsubscribe(topics, function (err) {
if (!err) {
resolve('取消订阅成功')
console.log("取消订阅成功")
} else {
resolve('取消订阅失败')
console.log("取消订阅失败")
return;
}
})
})
}
mqttTool.publish = function (topic, message, name) {
return new Promise((resolve, reject) => {
if (mqttTool.client == null) {
resolve('Mqtt客户端未连接')
console.log("Mqtt客户端未连接")
return;
}
mqttTool.client.publish(topic, message, { qos: 1 }, function (err) {
console.log('发送主题:', topic);
console.log('发送内容:', message);
if (!err) {
if (topic.indexOf('offline') > 0) {
console.log("[ " + name + " ] 影子指令发送成功");
resolve("[ " + name + " ] 影子指令发送成功");
} else {
console.log("[ " + name + " ] 指令发送成功");
resolve("[ " + name + " ] 指令发送成功");
}
} else {
console.log("[ " + name + " ] 指令发送失败");
reject("[ " + name + " ] 指令发送失败");
return;
}
})
})
}
export default mqttTool