【问题标题】:How to get the QoS of a client in HiveMQ Client?如何在 HiveMQ Client 中获取客户端的 QoS?
【发布时间】:2019-11-28 16:13:39
【问题描述】:

我正在使用 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 

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

【问题讨论】:

  • 通常 MQTT 客户端甚至不保留他们订阅的主题列表,更不用说 QOS 了。
  • 好的,您可以将其添加为该问题的答案。
  • 不,不是真的,因为这是一个普遍的观察结果,对于 HiveMQ 实现来说可能不是真的(我从未使用过,所以不知道)。
  • 删除并重新发布相同的评论以触发通知是错误的形式
  • 抱歉,直到您刚刚发表评论,我才知道您为什么没有将其标记为答案。

标签: java mqtt iot hivemq


【解决方案1】:

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

这是场景:

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

IMqttToken token = clientPhone.connect();

HiveMQ Library:

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 library:

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

HiveMQ Library:

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

Eclipse Paho library:

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

HiveMQ Library:

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- connect with cleanSession false.
B- 订阅 QOS>0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 2019-10-24
    • 2011-10-22
    • 2017-05-23
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多