最近在用mqtt做及时通信,mqtt服务本身是放在本地的service服务里面运行,在应用关闭的时候,mqtt服务也要断开连接,不然会继续占用服务器的cpu,增加服务器负担。所以,在service的onDestroy中,需要调用MqttAndroidClient.disconnect()方法,但是会出现如下报错Log:
Service org.eclipse.paho.android.service.MqttService has leaked IntentReceiver org.eclipse.paho.android.service.AlarmPingSender$AlarmReceiver@29e9a4b8 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Service org.eclipse.paho.android.service.MqttService has leaked IntentReceiver org.eclipse.paho.android.service.AlarmPingSender$AlarmReceiver@29e9a4b8 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:903)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:704)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1650)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1630)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1624)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:489)
at org.eclipse.paho.android.service.AlarmPingSender.start(AlarmPingSender.java:74)
at org.eclipse.paho.client.mqttv3.internal.ClientState.connected(ClientState.java:1149)
at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:985)
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:145)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
这是因为在断开disconnect的时候,需要解注册mqttAndroidClient的广播;因为mqttAndroidClient本身就是一个广播。
解注册广播需要调用unregisterResources方法。
但是广播本身就是系统的底层通信,属于异步操作,然后接着调用disconnect就会导致广播还没有解注册就进行diconnect,
会出现上述报错。
测试方法很简单,在两者之间增加一个Thread.sleep(50);
做一个50ms的线程阻塞等待,就可以避免该情况的出现。
最近在用mqtt做及时通信,mqtt服务本身是放在本地的service服务里面运行,在应用关闭的时候,mqtt服务也要断开连接,不然会继续占用服务器的cpu,增加服务器负担。所以,在service的onDestroy中,需要调用MqttAndroidClient.disconnect()方法,但是会出现如下报错Log:Service org.eclipse.paho.android.serv...
最近在Android下使用
mqtt
的客服端传输数据,
mqtt
服务本身是放在本地的service服务里面运行,在应用关闭的时候,
mqtt
服务也要
断开连接
,不然会继续占用手机的资源。关于
mqtt
服务器如何实现的,包括连服务器,断线重连,订阅消息,处理消息,发布消息等,网上的信息很多,我把使用过程中遇到的一些问题说一下。
首先是在
断开连接
时总是
报错
,用户虽然感觉不到但作为一名好的程序员必须改正这个bug,那么在service的onDestroy中,如何
断开连接
呢?一些网友直接调用cl...
背景:当我们的设备更新完成,大量的设备重新连接到EMQ,导致EMQ 的cpu直接到100%,此时我的服务器在断开重连几次之后,就进入了线程等待状态,并且没有被唤醒,此时需要publish消息到EMQ,且本地一部处理receiver的的消息队列堆满,还能处理消息。
此时我陷入了一个误区,认为既然本地还有处理消息的日志,那么就代表客户端与emq仍然连接,可是我publish消息到EMQ时,却又异常消息“客户端未连接”,那么客户端与EMQ明显时断开了,那么到底有没又断开......
1.
MQTT
协议连接IOT平台
使用阿里物联网平台的第一步是在云端创建产品和对应设备,获取设备证书(ProductKey、DeviceName和DeviceSecret)。具体在阿里云平台的创建步骤详解上述提供的官方文档链接中的创建产品与设备。
创建产品中的功能定义具备自定义和根据主题,标准生成。
根据主题(如城市智能井盖监测),标准生成如下信息:
自定义配置(具备属性,服务,事件三种类型):实现属性上报(如上报设备状态)、事件上报(上报设备异常或错误)和服务调用(通过云端调用设备提供的服务):
注意:标识符非常重要,是JSON里传递的属性!而且要区分大小写
1.1连接平
在进行
mqtt
协议测试的时候,之前客户端都能正常通信,但今天测试的时候发现数据发送不成功,每次客户端能够连接到服务器,但是一旦publish消息的时候就出现EOFException,然后再服务端日志发现
报错
信息如下:
遂在\apache-artemis文件中找到自己生成的broker文件夹中,在/etc目录下有个broker.xml,修改max-
dis
k-usage参数,默认是90,系统配置的...
1. 网络不稳定:
MQTT
是基于 TCP/IP 协议的,如果网络不稳定,连接就容易断开。
2. 心跳超时:
MQTT
客户端和服务器之间会定期发送心跳包以保持连接,如果客户端或服务器在一定时间内没有收到心跳包,就会认为连接已经断开。
3. QoS 级别不合适:如果 QoS 级别设置过高,会导致消息重传次数增多,从而增加连接断开的可能性。
4. 客户端代码问题:如果客户端代码有 bug,也可能导致连接经常断开。
你可以检查以上几个方面,看看是否能够解决连接经常断开的问题。