简体   繁体   English

如何在HiveMQ客户端中打印所有主题? (MQTT)

[英]How to print all topics in HiveMQ Client? (MQTT)

Is there a way to print all of the topics that the HiveMQ broker has stored? 有没有办法打印HiveMQ代理存储的所有主题? I'd like to print out all topics that clients are connected to for testing purposes in a main class in HiveMQ Client. 我想在HiveMQ Client的主类中打印出客户端连接用于测试目的的所有主题。 I've left links for the HiveMQ Client and Community (Broker). 我为HiveMQ客户和社区(经纪人)留下了链接。

HiveMQ: HiveMQ:

https://github.com/hivemq/hivemq-community-edition https://github.com/hivemq/hivemq-mqtt-client https://github.com/hivemq/hivemq-community-edition https://github.com/hivemq/hivemq-mqtt-client

Code in my main class for the HiveMQ Client: HiveMQ Client在我的主类中的代码:

package com.main;

import java.util.UUID;

import com.hivemq.client.mqtt.MqttGlobalPublishFilter;
import com.hivemq.client.mqtt.datatypes.MqttQos;
import com.hivemq.client.mqtt.mqtt5.Mqtt5BlockingClient;
import com.hivemq.client.mqtt.mqtt5.Mqtt5BlockingClient.Mqtt5Publishes;
import com.hivemq.client.mqtt.mqtt5.Mqtt5Client;
import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish;
import java.util.logging.Logger;
import java.util.NoSuchElementException;

import java.util.logging.Level;
import java.util.concurrent.TimeUnit;


public class Main {

    private static final Logger LOGGER = Logger.getLogger(Main.class.getName());  // Creates a logger instance 


    public static void main(String[] args) {

                Mqtt5BlockingClient client1 = Mqtt5Client.builder()
            .identifier(UUID.randomUUID().toString()) // the unique identifier of the MQTT client. The ID is randomly generated between 
            .serverHost("localhost")  // the host name or IP address of the MQTT server. Kept it 0.0.0.0 for testing. localhost is default if not specified.
            .serverPort(1883)  // specifies the port of the server
            .buildBlocking();  // creates the client builder

            client1.connect();  // connects the client
            System.out.println("Client1 Connected");
            System.out.println(client1.toString());


            String testmessage = "How is it going!";
            byte[] messagebytesend = testmessage.getBytes();   // stores a message as a byte array to be used in the payload 

    try {  

        Mqtt5Publishes publishes = client1.publishes(MqttGlobalPublishFilter.ALL);  // creates a "publishes" instance thats used to queue incoming messages

            client1.subscribeWith()  // creates a subscription 
            .topicFilter("test1/#")  // filters to receive messages only on this topic (# = Multilevel wild card, + = single level wild card)
            .qos(MqttQos.AT_LEAST_ONCE)  // Sets the QoS to 2 (At least once) 
            .send(); 
            System.out.println("The client1 has subscribed");


            client1.publishWith()  // publishes the message to the subscribed topic 
            .topic("test/pancakes/topic")   // publishes to the specified topic
            .qos(MqttQos.AT_LEAST_ONCE)  
            .payload(messagebytesend)  // the contents of the message 
            .send();
            System.out.println("The client1 has published");


            Mqtt5Publish receivedMessage = publishes.receive(5,TimeUnit.SECONDS).get(); // receives the message using the "publishes" instance waiting up to 5 seconds                                                                          // .get() returns the object if available or throws a NoSuchElementException 


         byte[] tempdata = receivedMessage.getPayloadAsBytes();    // converts the "Optional" type message to a byte array 
         System.out.println();
         String getdata = new String(tempdata); // converts the byte array to a String 
         System.out.println(getdata);


    }

    catch (InterruptedException e) {    // Catches interruptions in the thread 
        LOGGER.log(Level.SEVERE, "The thread was interrupted while waiting for a message to be received", e);
        }

    catch (NoSuchElementException e){
        System.out.println("There are no received messages");   // Handles when a publish instance has no messages 
    }

    client1.disconnect();  
    System.out.println("Client1 Disconnected");

    }

}

Is there a way to print all of the topics that the HiveMQ broker has stored? 有没有办法打印HiveMQ代理存储的所有主题?

No. There is no such thing in MQTT as "give me a list of all topics in a broker". 否。MQTT中没有“将代理中所有主题的列表给我”这样的东西。

Your code can subscribe to all "active" topics but that does mean you will capture all of the topics unless you leave your code running 7/24 for months or years. 您的代码可以预订所有“活动”主题,但这意味着您将捕获所有主题,除非您将代码运行7/24的时间维持数月或数年。

Simply change your subscription to the following: 只需将您的订阅更改为以下内容:

client1.subscribeWith().topicFilter("#")

Now your code will get messages for all "active" topics that publishers are publishing to. 现在,您的代码将获得发布者要发布到的所有“活动”主题的消息。 Be forewarned, your code may get thousands of messages per second and probably many of the messages are for the same topic. 请注意,您的代码每秒可能会收到数千条消息,并且可能许多消息都针对同一主题。 Hence, you will need to filter those out. 因此,您将需要过滤掉它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM