【问题标题】:how to publish mqtt message with retained true in paho on android如何在 android 上的 paho 中发布保留 true 的 mqtt 消息
【发布时间】:2016-06-01 11:43:31
【问题描述】:

我正在为我的 Android 应用程序使用 Paho java 客户端库。下面提供的代码。

MqttAndroidClient client_Panic = new MqttAndroidClient(this.getApplicationContext(), serverURL, CLIENT_ID);
    try {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
        options.setCleanSession(false);
        options.setKeepAliveInterval(90);
        options.setConnectionTimeout(100);
        IMqttToken token = client_Panic.connect(options);

            //Few callbacks

       } catch (MqttException e) {
        e.printStackTrace();
    }

并在需要时发布消息

    String msg = "messages";
    MqttMessage message = new MqttMessage();
    message.setPayload(msg.getBytes());
    try {
        client_Panic.publish(topic, message);
    } catch (MqttException e) {
        e.printStackTrace();
    }

它工作正常,但不知何故不完整。我需要的是,每当其他客户端订阅相同的主题时,应该获得最后保留的消息,该消息可能发布者之前发布过。

我搜索了他们的文档,我得到了

protected void setWill(String topic,
                   MqttMessage msg,
                   int qos,
                   boolean retained)

所以 setWill 根据文档可以选择启用保留选项。所以我尝试了

        options.setConnectionTimeout(100);
        options.setWill(topic,null,2,true); // This place I added
        IMqttToken token = client_Panic.connect(options);

但在包含options.setWill 的行上出现错误java.lang.IllegalArgumentException at org.eclipse.paho.client.mqttv3.MqttConnectOptions.validateWill

setWill 是在 android 上启用retained true 的正确方法吗,如果是,那么需要提供哪些参数,否则它们是在 android 上启用它的任何其他方法吗? TIA。

【问题讨论】:

    标签: java android mqtt paho


    【解决方案1】:

    遗嘱是一个非常具体的消息,仅当客户端与代理不干净地断开连接(例如网络中断)时才会发布。

    您不能将null 消息设置为错误所在的遗嘱消息。

    保留状态特定于给定消息,因此您不必全局设置它,它是在每条消息上设置的。当您调用setRetained(boolean) 时将消息标记为保留,例如

    String msg = "messages";
    MqttMessage message = new MqttMessage();
    message.setRetained(true);
    message.setPayload(msg.getBytes());
    try {
        client_Panic.publish(topic, message);
    } catch (MqttException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • @hardillb 等一下,你应该可以将遗嘱设置为空消息,假设这意味着零长度消息。
    • @ralight,这将是一个零长度字节数组的消息对象,这是一个空消息对象。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多