import mqtt from 'mqtt';
|
import { getToken } from '@/utils/auth';
|
|
let mqttTool = {
|
client: null,
|
};
|
|
/** 连接Mqtt */
|
mqttTool.connect = function () {
|
let options = {
|
username: 'FastBee',
|
password: getToken(),
|
cleanSession: true,
|
keepAlive: 30,
|
clientId: 'web-' + Math.random().toString(16).substr(2),
|
connectTimeout: 60000,
|
};
|
// 配置Mqtt地址
|
let url = process.env.VUE_APP_MQTT_SERVER_URL;
|
if (url == '') {
|
console.log('自动获取mqtt连接地址');
|
if (window.location.protocol === 'http:') {
|
url = 'ws://' + window.location.hostname + ':8083/mqtt';
|
} else {
|
url = 'wss://' + window.location.hostname + '/mqtt';
|
}
|
}
|
console.log('mqtt地址:', url);
|
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;
|