如何使用Eclipse泛美卫生组织MQTT客户端发送Ping?(How to send ping u

2019-06-23 11:17发布

我们刚刚开始建立我们自己的推送通知系统(由于客户的需求)Android和Eclipse的发现泛美卫生组织( http://www.eclipse.org/paho/ )。 不用说,这个项目是非常激动人心的。

与Android的问题是,如果CPU处于睡眠状态时,MQTT客户端可能无法获得在其设定的时间间隔发送Ping的机会。 解决方法是使用AlarmManager将其唤醒,并把工作做好。 Android的文件说:

警报管理器,只要该报警接收机的onReceive()方法被执行保持CPU唤醒锁。 这保证了手机不会睡觉,直到你已经处理完广播。 一旦的onReceive()返回时,报警管理器释放该唤醒锁。 这意味着,在某些情况下,手机会尽快您的onReceive()方法完成睡觉。

http://developer.android.com/reference/android/app/AlarmManager.html

我要肯定的是,我可以在CPU具有PARTIAL_WAKE_LOCK说的onReceive()方法中发送ping命令,所以我正在寻找一种方式来手动发送ping到服务器,但它似乎客户端不公开任何这样的方法。 我缺少的东西吗? 或者说,有什么解决办法,除了在这里发表我自己的“ping消息”? 我想避免因为如此:

  1. 开销较大
  2. 我们将确保Android的客户端仅是用户,可能与Mosquitto的ACL。 他们不会被允许发布消息。

Answer 1:

我一直在做与MQTT Android上的一些工作,我已经有过一模一样的问题。

作为戴尔说,旧版本的MQTT客户机的使用有明确的ping()方法,但不幸的是,这是现在隐藏起来。

最简单的方法,我用了一个,就是要明确发布1个字节的消息到一个特定的主题,作为保活。 我不认为这应该增加太多的应用程序的开销和,虽然我不熟悉Mosquitto的ACL,我想你可以有每个客户端使用相同的“保活”的话题,只是提供给所有的写访问。 这应该不会,只要影响安全性,因为没有人可以从主题读取。

另一种方法是将有服务器(通过单个主题发布/订阅到所有效率)发送客户机(一个或多个)一个“保活”消息在QoS的1或2个如,由于QoS流,这将涉及客户端将消息发送回盖下的服务器; 这将作为存活。 这有让你的客户,因为只有用户的优势; 但是它与“干净会话=假”不兼容(因为你将有大量的邮件排队等待交付给客户谁了一段时间处于脱机状态 - 影响不必要再连接上的性能)。

不幸的是,这些是我目前能想到的只有两种解决方法。


此外,作为一个简短的一边,我已经经历了多次的使用在Android上MqttDefaultFilePersistence问题,所以你可能要意识到这一点。 特别是与文件锁定和问题重新实例化客户端时。 为了解决这个问题,我创建了建立在SQLite数据库之上MqttClientPersistence的实现,这是更强大; 你可能想这样做。



Answer 2:

为Android编写应用MQTT当一年多前,我碰到这个问题。 我已经写了关于它的一些长度http://dalelane.co.uk/blog/?p=1599但简而言之,是的-我看到你描述其中如果CPU是睡着了同样的问题时,MQTT客户端应该把它平安,那么平从未被发送。

不同的是,我使用的是不同的MQTT客户端库你(这是泛美卫生组织的前几天),而我使用的客户端库确实有,我可以调用一个ping()方法。 (对我实施的完整源是在那个环节,它解决了这个问题)。

你不能扩展泛美卫生组织客户端库的实施,包括PING命令? 我认为它应该是一个相当小的修改。



Answer 3:

还有就是要修改泛美卫生组织代码,并在任何时候做出一个平的方式。 如果我们使用的出版话题活命,送我们到至少7或8个字节到服务器。 是的,8个字节是仍然没有大的数据。 但MQTT的心跳只有2个字节。 我们已经失去了MQTT的最佳优势。

深人地观察泛美卫生组织的代码,我修改它,并写了一个名为NNNN公共方法()在MQTTClient。 这种方法可以发送MqttPingReq到其中的服务器。 该implemetation可以在这里找到... https://github.com/chinesejie/paho-for-android



Answer 4:

我的解决方案:

(1)修改: ClientComms comms;protectedpublic (封装org.eclipse.paho.client.mqttv3

public class MqttAsyncClient implements IMqttAsyncClient { // DestinationProvider {
    //...
    public ClientComms comms;  // Add by Ben for pingreq*
    //...
}

(2)定义新的类:(衍生自MqttClient

public class MqttClient2 extends MqttClient {

    public MqttClient2(String serverURI, String clientId,   MqttClientPersistence persistence) throws MqttException {
        super(serverURI, clientId, persistence);
    }

    public void pingreq()  throws MqttException {

        MqttDeliveryToken token = new MqttDeliveryToken(getClientId());
        MqttPingReq pingMsg = new MqttPingReq();
        aClient.comms.sendNoWait(pingMsg, token);

    }
}

(3)在任何地方,您可以:

MqttClient2 mClient = new MqttClient2(url, mDeviceId, mDataStore);
mClient.pingreq();

希望这可以是有益的给你。



文章来源: How to send ping using Eclipse Paho MQTT client?
标签: android mqtt