Android 首先调用MQTT上的同步或异步消息传递

Android 首先调用MQTT上的同步或异步消息传递,android,mqtt,messagebroker,paho,Android,Mqtt,Messagebroker,Paho,我一直在阅读教程,学习Paho android服务API的基础知识,以及我在文中读到的关于client.connect(context,callback,它有两种方法onSuccess()和onFailure() 如前所述,本例中使用的是同步客户端(MqttClient,而不是MqttAsyncClient)。这意味着请求(如connect)将阻止并返回或引发异常。没有轮询或读取方法从服务器获取消息,来自服务器的消息可以随时到达。库提供回调机制来处理此行为,将调用在客户端注册的MqttCallb

我一直在阅读教程,学习Paho android服务API的基础知识,以及我在文中读到的关于
client.connect(context,callback
,它有两种方法
onSuccess()
onFailure()

如前所述,本例中使用的是同步客户端(MqttClient,而不是MqttAsyncClient)。这意味着请求(如connect)将阻止并返回或引发异常。没有轮询或读取方法从服务器获取消息,来自服务器的消息可以随时到达。库提供回调机制来处理此行为,将调用在客户端注册的MqttCallback对象中的方法MqttCallback是一个必须由另一个类实现的接口…要启用回调功能,回调对象将注册到客户端,这在连接到服务器之前最符合逻辑

在阅读了我提到的最后两行之后,我感到困惑。因为据我所知,让客户机注册到calback的本质是
connectionLost、deliveryComplete、messageArrived
,即“异步”处理服务器状态并从服务器读取

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


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

当您设置回调时,您所做的只是注册接收到新消息时调用的函数。在连接到MQTT代理之前,实际上不会发生任何事情。您应该在连接之前设置回调,以免错过任何消息

例如,如果cleansession==0,MQTT代理将在您连接时立即恢复上一个会话。如果有消息等待您,而您尚未设置回调函数,则可能会错过这些消息

即使cleansession==1,连接后的下一个命令也可能是MQTTClient\u subscribe。出于类似的时间原因,您应该在调用MQTTClient\u subscribe之前设置回调。因此,当您知道cleansession==1时,它是callback connect subscribe或connect callback subscribe。差别不大,因此还不如养成在连接之前设置回调函数的习惯

…若要启用回调功能,将向客户端注册回调对象,这在逻辑上是在连接到服务器之前完成的

这几乎意味着在连接之前应该调用MqttClient.setCallback(),但不需要调用它才能工作;我没有测试过这一点,但这就是我从该语句中得到的结果


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

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