uniapp mqtt 频繁断开和重连问题(android真机)

Posted 地表最强菜鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uniapp mqtt 频繁断开和重连问题(android真机)相关的知识,希望对你有一定的参考价值。

公司是做物联网相关产品的,这段时间项目组遇到了uniapp打包的android离线apk,出现mqtt频繁断开&重连的问题,如果你看到这篇文章,说明你运气好,恭喜你,你的问题可以被解决了。

我们使用的mqtt.js版本是@4.1.0 的mini版本,这边原版本和mini版本我都提供出来

@4.1.0 mini版下载地址:

https://unpkg.com/mqtt@4.1.0/dist/mqtt.min.js

@4.1.0 原版下载地址:

https://unpkg.com/mqtt@4.1.0/dist/mqtt.js

出现频繁断连和重连的原因可能是以下两点中的其中一点造成的:

1、mqtt.js底层没有对你调用它方法传入的callback函数做异常捕获(你传入callback函数里面不做异常捕获,会导致mqtt底层代码逻辑异常,导致频繁断连&重连问题发生),所以你所有的callback函数都需要增加try..catch..方法捕获异常(比如发布,订阅,监听等方法调用的时候的第二个callback函数),下面是我修改后的mqtt.js源码:

2、android真机和小程序不同,小程序关闭页面同时断开mqtt连接,打开页面会同时创建mqtt连接,android则不同,android最小化后他还是在后台运行的,所以他不需要你主动关闭和创建mqtt连接,我这边造成android真机频繁断开和重连的另一个原因是,我在App.vue文件中的onShow和onHide方法中写了创建和断开mqtt连接的调用,导致他会频繁断开,下面是我修改后的App.vue的源码:

<script>
    export default {
        onShow: function() {
			uni.hideTabBar();
			console.log('App Show');
            //#ifdef MP-WEIXIN
            try {
                this.$shadow.destroy(true, ()=>{
                    console.log('mqtt closed.');
                    this.$shadow.connectToMQTT();
                });
            } catch (e) {
                console.log('App onShow error: ' + e);
            }
            //#endif
		},
		onHide: function() {
			console.log('App Hide');
            //#ifdef MP-WEIXIN
            try {
                this.$shadow.destroy(true, () => {
                    console.log('mqtt closed.')
                });
            } catch (e) {
                console.log('App onHide error: ' + e);
            }
            //#endif
		}
	}
</script>

网上有人说是mqtt 4.x版本造成的频繁断开重连问题,说是3.x版本没问题,我们证实了一下,和mqtt的版本没关系,是网上那帮人自己写的代码逻辑有问题。

到此 uniapp mqtt频繁断开和重连问题(android真机)问题解决。

以上是关于uniapp mqtt 频繁断开和重连问题(android真机)的主要内容,如果未能解决你的问题,请参考以下文章

C# Mqtt 断线重连

uniapp即时聊天 websocket封装(建立连接断线重连心跳机制主动关闭)

uniapp即时聊天 websocket封装(建立连接断线重连心跳机制主动关闭)

维护websocket长链接的稳定

(接上一条)解决ssh隧道断开自动重连的问题

手机wifi反复断开连接