【问题标题】:Synchronous or Asynchronous messaging over MQTT is called first首先调用 MQTT 上的同步或异步消息传递
【发布时间】:2015-01-10 16:29:16
【问题描述】:

我一直在阅读this 教程来学习Paho android Service API 的基础知识,并且在我读到的文本中的一些地方client.connect(context, callback 有两种方法onSuccess()onFailure()

如前所述,此示例中使用了同步客户端(MqttClient 与 MqttAsyncClient 相对)。这意味着请求,如连接,将阻塞并返回或抛出异常。没有轮询或读取方法从服务器获取消息,来自服务器的消息可以随时到达。该库提供了一个回调机制来处理此行为,向客户端注册的 MqttCallback 对象中的方法将被适当地调用。 MqttCallback 是一个必须由另一个类实现的接口...要启用回调功能,需要向客户端注册一个回调对象,从逻辑上讲,这将在连接到服务器之前完成

在阅读了我提到的最后两行之后,我感到困惑。因为据我了解,让客户端注册到 hasconnectionLost,deliveryComplete,messageArrived 的回调的本质是“异步”处理服务器状态并阅读从服务器。

现在,我的问题是,关于我引用的最后两行,我应该如何注册客户端以在连接到服务器本身之前从服务器读取状态?或者换句话说,“为什么,“client.callback”应该在“client.connect()”之前调用?”

任何人都可以澄清和解释这一点。

【问题讨论】:

  • 我不能假装自己是 MQTT 专家,但我所做的就是遵循本教程 dalelane.co.uk/blog/?p=1599 并实现我自己的客户端。它确实有你必须修复的错误并且有点过时,但我认为它很好地解释了这些概念并且有一个半(90%)的工作代码库你可以查看以了解幕后发生的事情。
  • 感谢您的回答。但我只想知道为什么,“client.callback”应该在“client.connect()”之前调用?
  • 啊。我认为这意味着您在实际 connet() 之前注册回调,因此如果有任何未决通知,您不会在 connect() 和正在注册和调用的回调之间错过它们。假设您有一个待处理的通知。在第 (1) 行你有 connect() 和第 (2) 行你注册了回调。由于异步性质,在连接和注册回调之间(第 1 行和第 2 行之间),您可能会错过待处理的通知。至少我是这么理解的。
  • 关键是,在您连接和订阅以及注册回调之间,可能会收到一条消息,这就是为什么他们建议您在连接之前注册回调处理程序,以防在队列。 MQQT(至少超过 ActiveMQ)与任何其他排队系统一样。如果您查看 MQQT 服务器,您会发现您将某些内容发布到“主题”。您可以将此主题视为一个 MQ(消息队列),您的服务器将内容放入其中,您的客户端使用它们...(续)
  • 如果没有消费者(即发即弃),您的服务器可以轻松地将消息放在该主题上,或者可以选择保留消息直到它们被传递(跟踪传递给已知客户端, 等等。)。在这两种情况下,您都可以连接并立即收到有关您刚刚连接和订阅的主题的内容,然后才有机会注册回调,因此在连接之前注册回调更安全。

标签: android mqtt messagebroker paho


【解决方案1】:

...为了启用回调功能,向客户端注册一个回调对象,这在逻辑上最符合逻辑的是在连接到服务器之前完成

这几乎意味着 MqttClient.setCallback() 应该在连接之前被调用,但不需要为了让它工作而发生;我没有对此进行测试,但这就是我从该声明中得到的。

我假设会发生的是客户端将连接(或不连接)并且您的应用程序将无法知道结果,因为该决定是通过回调到达的。希望这会有所帮助!

【讨论】:

    【解决方案2】:

    当您设置回调时,您所做的就是注册在收到新消息时调用哪个函数。在您连接到 MQTT 代理之前,实际上什么都不会发生。您应该在连接之前设置回调,这样您就不会错过任何消息。

    例如,如果 cleansession == 0,MQTT 代理将在您连接时立即恢复您之前的会话。如果有消息在等你,而你没有设置回调函数,你可能会错过这些消息。

    即使 cleansession == 1,连接后的下一个命令也可能是 MQTTClient_subscribe。出于类似的时间原因,您应该在调用 MQTTClient_subscribe 之前设置回调。所以当你知道cleansession == 1时,它要么是callback-connect-subscribe要么是connect-callback-subscribe。没有太大区别,所以你不妨养成在连接之前设置回调函数的习惯。

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      相关资源
      最近更新 更多