l***@163.com
l***@163.com
  • 发布:2025-09-16 17:33
  • 更新:2025-09-17 10:39
  • 阅读:38

【报Bug】uniapp项目vue3 mqtt2.18.8编译后无法在真机上连接mqtt,一直卡在mqtt.connect(url, options),vue2能正常连接。

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows11

HBuilderX类型: 正式

HBuilderX版本号: 4.75

手机系统: Android

手机系统版本号: Android 15

手机机型: TB570FU

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

示例代码:

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在真机无法正常连接,在模拟器能正常连接

2025-09-16 17:33 负责人:无 分享
已邀请:
goon_gn

goon_gn

3.0.0版本试试

要回复问题请先登录注册