0

我正在使用 HiveMQ 客户端,我想知道是否有办法获得客户端订阅的服务质量 (QoS)(就特定主题或一般而言)?我会寻找一种可以在客户端上调用的方法,如下所示:

    Mqtt5BlockingClient subscriber = Mqtt5Client.builder()
            .identifier(UUID.randomUUID().toString()) // the unique identifier of the MQTT client
            .serverHost("localhost") 
            .serverPort(1883) 
            .buildBlocking();

subscriber.getQoS("topic") // returns the QoS of the subscriber is subscribing to the given topic 

我只想要这些信息,以便可以打印到控制台。

4

1 回答 1

2

我认为您必须阅读有关 MQTT 概念的更多信息。服务质量 (QoS) 级别是消息的发送者和接收者之间关于传递消息的保证的协议。因此,QoS 用于publish()subscribe()方法而不是connect().

这是场景:

1. 连接:
您必须使用用户名/密码将您的客户端连接到任何代理。每个 mqtt 库都有一个connect()方法。在此步骤中,您尚未指定 qos。
成功连接后(每个 mqtt 库都有 connect 方法的回调),您可以发布或订阅任何所需(或允许)的主题。
示例:
Eclipse Paho 库:

IMqttToken token = clientPhone.connect();

HiveMQ 库:

client.connect();
//or
client.connectWith().keepAlive(10).send(); 
//or
Mqtt5Connect connectMessage = Mqtt5Connect.builder().keepAlive(10).build();
client.connect(connectMessage);

2.发布:
当你想publish()发消息时,你必须指定一个qos,这样broker就会按照这个qos响应客户端:

Qos=0:
Client  ---- Publish method ----> broker
Qos=1:
Client  ---- Publish method  ----> broker
Client <---- PubAck callback ----  broker
Qos=2:
Client  ---- Publish method   ----> broker
Client <---- PubRec callback  ----  broker
Client  ---- PubRel method    ----> broker
Client <---- PubComp callback ----  broker

例子:

Eclipse Paho 库:

IMqttDeliveryToken tokenPub = clientPhone.publish(topicPub, message);

HiveMQ 库:

client.publishWith()
        .topic("test/topic")
        .qos(MqttQos.AT_LEAST_ONCE)
        .payload("payload".getBytes())
        .send();
//or:
Mqtt5Publish publishMessage = Mqtt5Publish.builder()
        .topic("test/topic")
        .qos(MqttQos.AT_LEAST_ONCE)
        .payload("payload".getBytes())
        .build();
client.publish(publishMessage);

3.订阅:
订阅消息可以包含任意数量的客户端订阅。每个订阅都是一对主题和 QoS 级别。订阅消息中的主题也可以包含通配符,这使得订阅某些主题模式成为可能。如果一个客户端有重叠订阅,则该主题的最高 QoS 级别将获胜,并将由代理用于传递消息。
例子:

Eclipse Paho 库:

IMqttToken subToken = MqttAndroidClientInstance.subscribe(topics, qos);

HiveMQ 库:

client.subscribeWith().topicFilter("test/topic").qos(MqttQos.EXACTLY_ONCE).send();
//or:
Mqtt5Subscribe subscribeMessage = Mqtt5Subscribe.builder()
        .topicFilter("test/topic")
        .qos(MqttQos.EXACTLY_ONCE)
        .build();
client.subscribe(subscribeMessage);

编辑(1):
一个mqtt客户端必须使用以下参数,如果想在重新连接后接收已经订阅的主题:
A-连接cleanSession false
B-订阅QOS>0

于 2019-08-28T05:39:41.417 回答