uni-app项目vue3 mqtt2.18.8编译后无法在真机上连接mqtt,一直卡在mqtt.connect(url options),vue2能正常连接
uni-app项目vue3 mqtt2.18.8编译后无法在真机上连接mqtt,一直卡在mqtt.connect(url options),vue2能正常连接
示例代码:
import projectConfig from '@/env.config.js';
// import mqtt from 'mqtt'
import mqtt from '@/node_modules/mqtt/dist/mqtt.min.js'
var url = projectConfig.mqttServer;
let mqttTool = {
client: null
}
mqttTool.connect = function (token) {
console.log("flynn > client start")
console.log(url)
let protocol;
if (url.startsWith('wss:')) protocol = 'wss';
if (url.startsWith('ws:')) protocol = 'ws';
if (url.startsWith('wxs:')) protocol = 'wxs';
let prefix = "";
// #ifdef H5
prefix = 'h5'
// #endif
// #ifdef APP-PLUS
prefix = 'app'
// #endif
let options = {
clientId: prefix + '-' + Math.random().toString(16).substr(2),
username: 'admin',
password: token,
protocolVersion: 4,
rejectUnauthorized: false,
cleanSession: true,
clean: true,
keepalive: 20,
connectTimeout: 3000,
reconnectPeriod: 1000,
// Explicitly set protocol
protocol: protocol
};
mqttTool.client = mqtt.connect(url, options);
console.log("flynn > mqttTool.client", url)
// 连接成功
mqttTool.client.on('connect', function (res) {
console.log('mqtt连接成功');
});
// 重新连接
mqttTool.client.on('reconnect', function (res) {
console.log('mqtt重连', url);
});
// 发生错误
mqttTool.client.on('error', function (err) {
console.log('mqtt连接错误:', err);
uni.showToast({
icon: 'none',
title: 'mqtt连接错误',
});
});
// 断开连接
mqttTool.client.on('close', function (res) {
console.log('mqtt断开连接', JSON.stringify(res));
});
}
mqttTool.end = function () {
return new Promise((resolve, reject) => {
if (mqttTool.client == null) {
resolve('未连接')
console.log("未连接")
return;
}
mqttTool.client.end()
mqttTool.client = null
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: 0
}, function (err, res) {
console.log("订阅主题:", topics);
if (!err && res.length > 0) {
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('未连接')
console.log("未连接")
uni.showToast({
icon: 'none',
title: '已断开Mqtt连接',
});
return;
}
mqttTool.client.publish(topic, message, function (err) {
if (!err) {
resolve(topic + '-' + message + '-发布成功')
console.log('发布主题:' + topic + ",内容:" + message);
uni.showToast({
icon: 'none',
title: "[ " + name + " ] 指令发送成功",
duration: 1000,
});
} else {
resolve(topic + '-' + message + '-发布失败')
console.log("发布失败")
uni.showToast({
icon: 'none',
title: "[ " + name + " ] 指令发送失败",
duration: 1000,
});
return;
}
})
})
}
export default mqttTool
操作步骤:
- 任意逻辑调用mqttTool.connect
预期结果:
- 能正常连接mqtt
实际结果:
- 无法正常连接
bug描述:
- 外部调用方法mqttTool.connect,执行到下面的语句直接卡住
mqttTool.client = mqtt.connect(url, options); - mqtt在真机无法正常连接,在模拟器能正常连接
更多关于uni-app项目vue3 mqtt2.18.8编译后无法在真机上连接mqtt,一直卡在mqtt.connect(url options),vue2能正常连接的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
3.0.0版本试试
更多关于uni-app项目vue3 mqtt2.18.8编译后无法在真机上连接mqtt,一直卡在mqtt.connect(url options),vue2能正常连接的实战教程也可以访问 https://www.itying.com/category-93-b0.html
麻烦问问贴煮,现在解决了吗,我也遇到了这个问题,但是我们不能改成vue2,尝试了加abortcontroller-polyfill/dist/abortcontroller-polyfill-only,没有效果
这是一个典型的uni-app Vue3环境下MQTT连接问题。主要原因是Vue3的编译环境与MQTT库的兼容性问题。
在Vue3项目中,由于编译工具链升级,可能导致mqtt.min.js在真机环境无法正常初始化。建议采用以下解决方案:
- 使用原生MQTT库:
import mqtt from 'mqtt/dist/mqtt'
- 检查条件编译: 在APP-PLUS平台,确保使用正确的协议:
// #ifdef APP-PLUS
url = url.replace('wss://', 'http://').replace('ws://', 'http://')
// #endif
- 添加超时处理:
const connectPromise = new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
reject(new Error('MQTT连接超时'))
}, 5000)
mqttTool.client = mqtt.connect(url, options)
mqttTool.client.on('connect', () => {
clearTimeout(timeout)
resolve()
})
mqttTool.client.on('error', (err) => {
clearTimeout(timeout)
reject(err)
})
})
try {
await connectPromise
console.log('MQTT连接成功')
} catch (error) {
console.log('MQTT连接失败:', error)
}

