uni-app mqtt.js在H5可以正常,但是在APP和微信小程序调用end关闭mqtt不正常

uni-app mqtt.js在H5可以正常,但是在APP和微信小程序调用end关闭mqtt不正常

开发环境 版本号 项目创建方式
Windows HBuilderX

操作步骤:

只需正常导入mqtt.js,版本可以选3.0.0或者4.1.0,不可以使用4.3.7,这个版本APP和微信小程序连接会出问题。在正常连接上mqtt服务器后,监听end和close。用按钮触发直接调用

myMqtt.end(true,{},()=>{  
    console.log('myMqtt连接关闭---')  
})

手动关闭mqtt连接

预期结果:

H5应该正常回调和监听有效,APP和微信小程序则不会正常回调和触发监听

实际结果:

H5应该正常回调和监听有效,APP和微信小程序则不会正常回调和触发监听

bug描述:

使用mqtt,版本使用的是3.0.0,其他版本比如4.1.0也试过,一样的情况。H5和APP和微信小程序都可以正常连接,订阅,发送消息和接收消息。但是APP和微信小程序在调用断开mqtt的方法时会有异常,正常调用如下1所示,H5可以正常触发回调,打印myMqtt连接关闭,但是APP和微信小程序则不能正常触发回调。如下2中所示,监听end和close,H5可以正常,而APP和微信小程序则不正常。

//代码1  
myMqtt.end(true,{},()=>{  
    console.log('myMqtt连接关闭---')  
})
//代码2  
myMqtt.on('end', function() {  
    console.log('end')  
})  
myMqtt.on('close', function() {  
    console.log('close')  
})

更多关于uni-app mqtt.js在H5可以正常,但是在APP和微信小程序调用end关闭mqtt不正常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

我也遇见和你一样的问题了,请问你解决了吗

更多关于uni-app mqtt.js在H5可以正常,但是在APP和微信小程序调用end关闭mqtt不正常的实战教程也可以访问 https://www.itying.com/category-93-b0.html


请问您解决了么,

在使用 uni-app 开发跨平台应用时,如果你在 H5 环境下使用 mqtt.js 能够正常关闭 MQTT 连接,但在 APP 和微信小程序环境下调用 end() 方法关闭 MQTT 连接时遇到问题,可能是由于以下几个原因导致的:

1. 平台差异

不同平台(H5、APP、微信小程序)的网络请求和 WebSocket 实现可能存在差异。mqtt.js 在 H5 环境下使用的是浏览器的 WebSocket 实现,而在 APP 和微信小程序环境下使用的是原生或小程序提供的 WebSocket 实现。

2. end() 方法的行为差异

mqtt.jsend() 方法用于关闭 MQTT 连接。在不同的平台上,end() 方法的行为可能有所不同。例如,在微信小程序中,WebSocket 的关闭可能需要显式调用 wx.closeSocket(),而在 H5 中,end() 方法会直接关闭 WebSocket 连接。

3. 异步操作

关闭 MQTT 连接可能涉及到一些异步操作,如果这些操作没有正确处理,可能会导致连接没有正确关闭。

解决方案

1. 检查平台差异

uni-app 中,你可以通过 uni.getSystemInfoSync().platform 来获取当前运行的平台,然后根据平台的不同采取不同的处理方式。

const platform = uni.getSystemInfoSync().platform;

if (platform === 'h5') {
    // H5 环境下的处理
} else if (platform === 'mp-weixin') {
    // 微信小程序环境下的处理
} else {
    // APP 环境下的处理
}

2. 显式关闭 WebSocket

在微信小程序环境下,你可能需要显式调用 wx.closeSocket() 来关闭 WebSocket 连接。

if (platform === 'mp-weixin') {
    wx.closeSocket();
}

3. 确保异步操作完成

在调用 end() 方法后,确保所有异步操作都已完成。你可以使用 Promiseasync/await 来确保操作顺序。

async function closeMqttConnection(client) {
    await client.end();
    if (platform === 'mp-weixin') {
        wx.closeSocket();
    }
}

4. 监听关闭事件

mqtt.js 中,你可以监听 close 事件来确保连接已经关闭。

client.on('close', () => {
    console.log('MQTT connection closed');
});

示例代码

import mqtt from 'mqtt';

const platform = uni.getSystemInfoSync().platform;

const client = mqtt.connect('mqtt://your-mqtt-broker');

async function closeMqttConnection() {
    await client.end();
    if (platform === 'mp-weixin') {
        wx.closeSocket();
    }
}

client.on('close', () => {
    console.log('MQTT connection closed');
});

// 在需要关闭连接的地方调用
closeMqttConnection();
回到顶部