前言:抱着最起码的要求尽力去做好每一件事 ——秋不白

        之前做了一个项目,需要接入MQTT协议。也是第一次,各种百度,博客,GitHub。最后还是成功的集成了。主要功能是,接收音箱端(是一个Android设备,联网接收消息,播放音乐,视频通话,类似小度同学),推送过来的数据。主要说下接入的过程遇到的坑。如果你正在接入,如果遇到这个问题,希望文字描述能帮到你 ,后面我在抽时间把代码补上。源码你就先去copy别人的吧,一大把(可以参考下这个链接https://www.jianshu.com/p/73436a5cf855)。如果遇到如下问题,可以参考下。

MQTT协议是一个轻量级及时通讯协议,基于Tcp/ip协议组

 

     MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。它是一种发布/订阅,极其简单和轻量级的消息传递协议,专为受限设备和低带宽,高延迟或不可靠的网络而设计。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境。相对于XMPP,MQTT更加轻量级,并且占用的宽带低。(复制来的,哈哈)

不过也有几个坑(其实也是自己不熟悉API,原理)总结:

  1. MQTT客户端在初始化的时候,不建议设置自动连接,也就是自动连接不要设置成true(原因不知道,设置成true后,断网会自动连接,并且会报错,so)

 2. 关于断开连接重连的问题,MQTT客户端连接的时候,有两个监听回调,一个是连接的时候,连接成功or失败的回调,二,是已经连接成功后,被中断,失去连接,比如断网,网络异常。直接再调一下connect()方法就好了,于是又有连接成功or失败的回调,然后在失败的地方再调一下connect()方法就可以了,这两个地方不要使用线程沉睡什么的延迟操作,如果你使用了,你就会发现问题的(哈哈,当然是我试过的啦,蠢得不行)

3,(这算一个吧,毕竟测试要测所有的情况。)首次进行MQTT连接时,就没有网络,你们又是怎么处理的呢?首次可以加个网络状态改变的监听器,网络状态是移动数据或者wifi的时候去连接,但是,这个操作与连接中断开监听中重连 有逻辑冲突,所以,那就要看你想如何解决这个问题了,在网络判断中加个flag标识?用标识来区分,已连接过失去连接的网络变化和从未连接过网络变化。

4. 把连接MQTT协议的代码是放在MainActivity、中还是service中呢?很多都是放到service中,启动服务的方式 有直接启动,或者绑定服务的方式,都可以吧,看各自的需求吧,我是在MainActivity中去绑定服务的,通过connection 拿到服务对象,传一个接口过去拿收到的消息,MQTT协议收到消息,在mainActivity中去分发消息,借助EventBus来分发处理咯。

5. 最后一个是我还没有解决的,虽然不影响,但也还是问题。就是断开服务的(也就是退出app的时候),会有个内存泄漏,MQTT源码里面,有个广播接收者没有取消注册,排查我并没有去注册这个广播,尝试去取消注册,会报错,提示未注册的广播调用了取消注册,后来还是不了了之。有机会的时候再研究或者请教下大牛。