我们刚刚开始为Android构建我们自己的推送通知系统(由于客户的要求),并找到了Eclipse Paho(http://www.eclipse.org/paho/).不用说,这个项目真的令人兴奋.
Android的问题是,如果CPU处于睡眠状态,MQTT客户端可能无法以设置的间隔发送ping.解决方法是使用AlarmManager将其唤醒并完成工作.Android文档说:
只要警报接收器的onReceive()方法正在执行,警报管理器就会保持CPU唤醒锁定.这可以保证在您完成广播处理之后手机不会睡眠.一旦onReceive()返回,Alarm Manager就会释放此唤醒锁.这意味着在某些情况下,只要onReceive()方法完成,手机就会休眠.
http://developer.android.com/reference/android/app/AlarmManager.html
我需要确保我可以在该onReceive()方法中发送ping命令,而CPU有PARTIAL_WAKE_LOCK,所以我正在寻找一种手动发送ping到服务器的方法,但似乎客户端没有暴露任何这样的方法.我错过了什么吗?或者,除了发布我自己的"ping消息"之外,这里的解决方法是什么?我想避免这种情况,因为:
ste*_*las 15
我一直在Android上使用MQTT做一些工作,我遇到了完全相同的问题.
正如Dale所说,旧版本的MQTT客户端曾经有一个明确的ping()方法,但不幸的是现在已经隐藏了.
最简单的方法,也就是我使用的方法,是明确地向特定主题发布1字节消息,作为keepalive.我认为这不应该增加应用程序的开销,虽然我不熟悉Mosquitto的ACL,但我认为你可以让每个客户端使用相同的"keepalive"主题并只提供对所有人的写访问权限.只要没有人可以从主题中读取,这不应该影响安全性.
另一种方法是让服务器在QoS 1或2发送客户端的"keepalive"消息(通过单个主题发布/发布以提高效率),因为QoS流量,这将涉及到客户端将消息发送回封底的服务器; 这将作为keepalive.这样做的好处是只保留您的客户为订户; 但是它与'clean session = false'不兼容(因为你会有大量的消息排队等待交付给离线一段时间的客户端 - 不必要地影响重新连接的性能).
不幸的是,这些是我目前唯一能想到的两种解决方法.
另外,简单来说,我在Android上使用MqttDefaultFilePersistence时遇到了很多问题,所以你可能想知道这一点.特别是在重新实例化客户端时与文件锁定和问题有关.为了解决这个问题,我创建了一个构建在SQLite数据库之上的MqttClientPersistence实现,这个实现更加强大; 你可能也想这样做.
dal*_*ane 10
我在大约一年前为Android编写MQTT应用时遇到过这个问题.我已经在http://dalelane.co.uk/blog/?p=1599上详细介绍了它,但简而言之,是的 - 我看到了同样的问题,你描述了如果CPU在MQTT客户端睡着了应该发送它的ping,然后ping永远不会被发送.
不同之处在于我使用了不同的MQTT客户端库(这是在Paho时代之前),而我使用的客户端库确实有一个我可以调用的ping()方法.(我的实现的完整源代码在那个链接上,它确实解决了这个问题).
你能否扩展Paho客户端库的实现以包含PING命令?我认为它应该是一个相当小的修改.