如何用paho mqtt java实现请求-响应模式?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用paho mqtt java实现请求-响应模式?相关的知识,希望对你有一定的参考价值。

我想使用 Paho MQTT Java 并实现一些 "请求-响应 "模式。我的意思是,在某些情况下,客户端必须与服务器对话,并期望对特定的请求做出特定的回答。感觉这个lib已经具备了匹配请求和响应所需的一切,但我不能完全把它放在一起。

我发现我可以通过以下方式检索令牌 deliveryComplete,我可以做一个 setActionCallback 在此基础上。但首先,我并不完全确定 "动作 "是什么意思,那么,如果它的意思是我认为的意思,如何从那里得到我的请求的实际响应?那么,如果它的意思是我认为的意思,如何从那里得到我的请求的实际响应?

sampleClient.setCallback(new MqttCallback() {
    @Override
    public void connectionLost(Throwable cause) {
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        System.out.println(topic);
        System.out.println("setCallback: "+ message.toString());
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println(token.getMessageId());
        token.setActionCallback(new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                var response = asyncActionToken.getResponse();

                try {
                    System.out.println(new String(response.getPayload()));
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }
});
答案

在MQTT协议中,没有端到端交付通知。传递完成的回调只是用来通知消息已经在发布客户端和代理之间传递,它没有说消息是否已经传递给任何下游的订阅者(可能有0到许多其他客户端订阅一个给定的主题)。

一旦消息到达经纪商,它甚至可能被排到一个具有持久会话的离线客户端。

即使假设只有1个客户端收到消息,任何回复都将是一个完全独立的消息,而不与第一个请求相联系。

MQTT并不是像说HTTP那样原生的请求回复系统,它是一种向0发送消息给许多订阅了给定主题的客户端的方式。

MQTT v5开始将requestresponse的概念引入到MQTT中,但即便如此,也只是在头中多了一个可选的槽,包含一个话题来回复。作为开发者,你要协调哪个响应和哪个请求在一起(通常是通过在消息中包含一个唯一的id)。

另一答案

MQTT对于任何类型的1请求-1响应都是矫枉过正的......那是API的作用。 MQTT最适合于一个节点向一个或多个被接入Topic的节点发送数据。 发送节点(Publisher)不需要知道任何接收节点(Subscribers)......他们只需要同意使用Topic。

也就是说,你可以实现一个 "查询 "的发布,并寻找一个 "回复 "的MQTT消息回来,你会订阅。 我在过去做过这样的事情,多个节点可以从知道Reply是什么中获益。 所以它可能看起来像这样。 发布 - q/system/status 和订阅 r/system/statusr/system/#.

以上是关于如何用paho mqtt java实现请求-响应模式?的主要内容,如果未能解决你的问题,请参考以下文章

Thingsboard:MQTT-订阅内部代理失败(Java/Paho)

Paho - MQTT C Cient的实现

Paho -物联网 MQTT C Cient的实现和详解

org.eclipse.paho.mqtt.java-1.0.2 怎么用

MQTT研究之EMQ:eclipse的paho之java客户端使用注意事项

paho mqtt回调python中的不同类模块