Android 上使用 paho Mqtt 小结

paho是mqtt指定的官方开源平台

其连接可以在官方网站找到。


虽然是开源的,仍然存在不少问题;

这次基于MqttClient在mqtt上做一个小结;



1.不建议使用AndroidSerivce项目

paho已经基于MqttAsyncClient写成了MqttService。但是控制起来比较麻烦,并且多进程下会报错,

不建议使用。


2.MqttClient持久性链接错误

paho的MqttClient中存在少许bug。注意,若使用了文件持久化,且ClientID不是随机的话,

在mqtt断开后没有清除的话,会一直报错,具体可以分析源码,以为文件生成的文件一直存在会抛出异常。

然而文件持久化使用随机ID会生成许多垃圾文件夹,文件夹名称和ID、URL有关。 (文件持久化需要配置路径)

使用唯一ID的解决办法:改用内存持久化MemoryPersistence


3.手动重连

paho的mqtt不会自己重新连接,需要在设置CallBack中的connectionLost中手动重连。

注意,MqttClient重连的时候需要带MqttConnectOptions参数的方法,否则会new一个。


4.mqtt锁屏断开,需要在Android中设置唤醒锁

mqtt是基于TCP/IP的,android锁屏会阻塞TCP,造成mqtt断开。而AndroidService已经做好相关工作。

MqttClient放在Serice中使用,例如:


startService:

    if(netWakeLock==null||wifiLock==null){

            PowerManager pm = (PowerManager)getSystemService(
                    Context.POWER_SERVICE);
            WifiManager wifi = (WifiManager)getSystemService(
                    Context.WIFI_SERVICE);
            netWakeLock = pm.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK
                ,
                BrtMqttService.class.getName());
            
            wifiLock=wifi.createWifiLock(WifiManager.WIFI_MODE_FULL,  BrtMqttService.class.getName());
            
        }
        netWakeLock.acquire();
        wifiLock.acquire();


Dowork...


stopService:

    if(netWakeLock!=null||wifiLock==null){
            netWakeLock.release();
            netWakeLock=null;
            wifiLock.release();
            wifiLock=null;
            
        }
           








你可能感兴趣的:(Android 上使用 paho Mqtt 小结)