客户端老化一段时间有规律掉线,一分钟一次,掉线重连后一分钟又掉线

emqx@127.0.0.1-trace_DAF3DB604800ad39_2023-10-20.zip (36.6 KB)

请官方看下日志

什么情况导致的?怎么定位和解决呢?目前keeplive设置的20s

问题一:端口变化是因为重新连接吧,问题二:keeplive设置的20s,为什么没有心跳包呢?客户端收到了连接丢失信号,再做的重连处理

是的,就是通过端口不同来区分不同的tcp连接。

确实,客户端是收到了keepalive_timeout后又尝试重连。
但重连后,对于这个端来说(只看相同一个端口的日志):


为什么没有在这37秒内都没有发任何的心跳包,需要你调查一下客户端代码。

AlarmManager: Not setting time since no alarm driver is available.内部心跳是用安卓的闹钟服务吧,我发现每次收到连接丢失的回调,都会有这个异常,这个是不是原因。有遇到类似问题么

这方面还是得看具体的代码。建议你拿具体的报错和代码问问GPT。我也不知道。

根据您提供的信息,出现了"AlarmManager: Not setting time since no alarm driver is available"的错误消息,并且心跳没有发送。这个错误通常表示在系统中找不到可用的闹钟驱动程序。
在Android中,AlarmManager用于安排和触发定时任务,包括发送心跳等操作。但是,某些情况下,系统可能无法找到可用的闹钟驱动程序,导致无法设置定时任务。
以下是一些可能导致该错误的原因和解决方法:

  1. 设备或模拟器不支持AlarmManager:某些特殊情况下,设备或模拟器可能不支持AlarmManager功能。您可以尝试在其他设备或模拟器上测试您的代码,以确定问题是否出在特定设备上。
  2. 手机系统设置问题:某些手机制造商可能会对系统进行修改,可能导致AlarmManager的异常行为。您可以尝试在其他设备上测试您的代码,以确定是否是特定设备的问题。
  3. 权限问题:确保您的应用程序具有适当的权限来使用AlarmManager。在AndroidManifest.xml文件中添加以下权限:
    xml
    Copy
<uses-permission android:name="android.permission.SET_ALARM" />
  1. 使用唤醒锁:如果您的应用程序需要在后台执行长时间运行的任务,可能需要使用唤醒锁来保持设备唤醒状态。这样可以确保AlarmManager正常工作。您可以查阅Android文档了解如何使用唤醒锁。
    如果上述方法都无法解决问题,您可能需要进一步调查和排查。您可以尝试搜索相关错误消息,查看其他开发者在类似情况下的解决方案,或者尝试与设备制造商或相关技术社区寻求支持。

收到,谢谢


z再问一下,心跳包不是mqtt内部自动发的?在setKeepAliveInterval这个设置时间内
image

不是,
这个只是通过设置mqtt的 connect 包的keepalive 选项让客户端告诉emqx:现在这个客户端的keepalive是20秒,
然后emqx就根据这个来检查。但是对应的ping 包还是要客户端自己发。

客户端自己发ping包的间隔时间范围是多少?我想随机一下。比如我设置keepalive为20秒

5.1.16的版本和4.4.19的版本有什么差别

你自己设置了keepalive为20秒,那你就写代码20秒发一个ping包就行了。
具体的版本差异,可以搜索 emqx changelog

使用的MqttAndroidClient,无法自己发ping包,通过查看系统日志得知一个异常,帮忙看看,keeplive为10秒,前面一直都是正常的,如下图:


老化几个小时之后,最后一次自动ping包如下图所示:

对比两个图,是否有什么导致该异常,后面自动ping包就停止了,就出现频繁掉线重连了,一直不能恢复

急急急~~~为什么重新连接mqtt之后,MqttAndroidClient不自动按keepalive发ping包,导致超时断开报错[MQTT] Force to close the socket due to keepalive_timeout,,,MqttAndroidClient这种实现又无法手动发送ping包,这该怎么办?

建议去对应sdk的社区问一下。这个不是emqx的问题,我也没有遇到过,没有什么想法。

请问MqttAndroidClient这个客户端自动心跳包机制是啥?现在有个新的结论,就是安卓11系统,设备老化一段时间(一般10几个小时出现)连接丢失一次之后,就不发心跳包了,后面我有定时重连,都不发心跳包。麻烦回复一下。
连接丢失日志:10-27 08:39:42.119 1450 1450 D mqtt : close-connectionLost-已断开连接 (32109) - java.io.EOFException
10-27 08:39:42.119 1450 1450 D mqtt : updateStateChange==false /上次保存=true /连接丢失
丢失之后自动心跳包,再未(重连之后也一样)发送

实在是抱歉,这客户端的问题想帮忙也帮不上啊。问了同事,也没有安卓开发经验。你得找专业的人看具体的代码才知道。

你们有sdk源码开放的吧,不是开源的么,给个地址,我去看看源码