【发布时间】:2016-12-21 16:52:51
【问题描述】:
我正在努力使用 Mqtt paho 驱动程序...
每当收到我的发布时,我都会使用 IMqttDeliveryToken 从服务器获取确认。
为了将它与实际的发布消息进行比较,我在 MqttMessage 上设置了一个 ID,以便从 IMqttDeliveryToken 中检索它...但它不起作用... IMqttDeliveryToken.getMessageId() 返回一个不正确的 ID当我尝试在 IMqttDeliveryToken.getMessage() 之后获取 ID 时,当 QoS 不为 0 时,它返回一个 NPE。
阅读 Javadoc 后,我了解到这是通常的行为:
在邮件送达之前,正在送达的邮件将被退回。消息传递后,将返回 null。
这让我想到另一个问题...在 Broker 发送确认后真的调用了 deliveryComplete() 方法吗?
这是我的代码:
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable thrwbl) { }
@Override
public void messageArrived(String string, MqttMessage mm) throws Exception { }
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
try {
System.out.println("Message ID from getMessageId() method : " + token.getMessageId());
MqttMessage message = token.getMessage();
System.out.println("Message ID from getMessage() method : " + message.getId());
} catch (MqttException ex) {
System.out.println(ex);
} catch (Exception ex) {
System.out.println(ex);
}
}
});
MqttMessage message = new MqttMessage();
message.setId(76);
message.setPayload("pouet".getBytes());
message.setQos(0);
client.publish("TEST", message);
将 QoS 设为 0:
Message ID from getMessageId() method : 1
Message ID from getMessage() method : 76
将 QoS 设为 1:
Message ID from getMessageId() method : 1
java.lang.NullPointerException
【问题讨论】: