【问题标题】:MessageID returns zero in paho mqttMessageID 在 paho mqtt 中返回零
【发布时间】:2017-01-24 16:26:41
【问题描述】:

我正在使用当前版本的 Paho MQTT android 客户端(编译 org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0),我正在尝试从从 messageArrived() 回调收到的每条消息中获取消息 ID。我就是这样做的。

   @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {
            String plainMessage = new String(message.getPayload());

              int messageID= new Integer(message.getId());
              System.out.println(messageID);

        }

更新 QoS 为 2

只要消息到达或调用方法 messageArrived,消息 ID 就会返回

请问有人对如何解决这个问题有任何想法吗?

【问题讨论】:

  • 什么 QoS 级别?
  • @PavelZdenek 我使用的 QoS 级别为 2

标签: android mqtt paho


【解决方案1】:

我不熟悉 Paho,但假设“消息 id”与 MQTT spec 中讨论的“数据包标识符”相同:它不是所有消息的唯一编号序列。它只有两个字节(所以它可能是同一件事,因为 Paho 使用的是能够保存两个无符号字节的最小原始类型)。它的目的是在 QoS>0 的多阶段握手期间匹配传输中的多个消息。所以我的理论是这样的:无论你附加到什么 MQTT 代理,它都很少使用这个有限的序列。只有当有多个消息在传输中时,它才可能显示非零数字。如果我正确阅读 Paho javadoc,您应该能够简单地测试它:继续触发消息但保持从 messageArrived 返回。

试试看,然后告诉我。我有点猜测。如果我推测更多,您想使用此消息 ID 作为所有消息的应用程序级唯一标识符:这不是正确的工具。您必须在应用程序级别提供自己的序列。

【讨论】:

  • 很好,但这是否意味着我要生成自己的消息 ID 并将其添加到消息负载中,可能使用 json。假设我使用它,你不认为它会减慢发布功能。你怎么看?
  • 你害怕什么样的减速?我无法想象通过将单个 Int64 添加到您的有效负载中会产生任何可测量的减慢。编码完全取决于您当前的有效负载格式。
  • 如果我将 int64 添加到有效负载中,这将意味着收件人可能会收到两条不同消息的重复 messageID。所以我打算从本地数据库中获取唯一的消息 ID(发件人的,因为每条消息都将保存在发件人数据库中)。这就是我打算这样做的方式,但我认为它可能会减慢发布它的消息。
  • "两个不同消息的重复 messageID" 一个客户端怎么办?我的意思是单调序列,而不是一些随机数。
  • Oohok.....我已经到达System.getCurrentTimemills(),它已添加到消息有效负载中。它是单调的,所以我想我可以使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2022-01-03
  • 2016-11-06
相关资源
最近更新 更多