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.js 的 end() 方法用于关闭 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() 方法后,确保所有异步操作都已完成。你可以使用 Promise 或 async/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();
回到顶部