Java 如何在android上发布paho中保留true的mqtt消息

Java 如何在android上发布paho中保留true的mqtt消息,java,android,mqtt,paho,Java,Android,Mqtt,Paho,我正在为我的android应用程序使用PAHOJava客户端库。代码如下所示 MqttAndroidClient client_Panic = new MqttAndroidClient(this.getApplicationContext(), serverURL, CLIENT_ID); try { MqttConnectOptions options = new MqttConnectOptions(); options.setMqttVersion

我正在为我的android应用程序使用PAHOJava客户端库。代码如下所示

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);
但是在org.eclipse.paho.client.mqttv3.MqttConnectOptions.validateWill中包含
options.setWill
的行上获得了错误
java.lang.IllegalArgumentException


setWill是在android上启用
保留为真
的正确方法吗?如果是,那么需要提供哪些参数,或者它们是在android上启用它的任何其他方法?TIA.

遗嘱是一条非常具体的消息,只有在客户机与代理不干净地断开连接(例如网络断开)时才会发布

您不能将
null
消息设置为Will消息,这就是错误的原因

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

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();
}

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

您不能将
null
消息设置为Will消息,这就是错误的原因

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

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,这将是一个具有零长度字节数组的消息对象,这是一个空消息对象。@hardillb等一下,您应该能够将遗嘱设置为空消息,假设这意味着一条零长度消息。@ralight,这将是一个具有零长度字节数组的消息对象,这是一个空消息对象。