Как определить тему MQTT, которая получила сообщение? - PullRequest
0 голосов
/ 07 января 2019

Клиент подписан на тему x / #. Существует возможность получения сообщения в темах x / start и x / stop, и в зависимости от темы оно выполняет действие. Интересно, как я могу определить, идет ли речь о начале или конце темы?

В текущем коде я посылаю ключ «action» в JSON: «start» или «stop». Я хочу удалить этот ключ и использовать формат, который сказал выше, идентифицируя тему.

Любая дополнительная информация, которую они считают необходимой, пожалуйста, попросите меня отредактировать сообщение!

JDK 8

Код:

 private MqttCallback callback = new MqttCallback() {
        public void connectionLost(Throwable throwable) {
            try {
                connect();
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }

        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            String messageReceived = new String(mqttMessage.getPayload());
            actionPerformed(messageReceived);
        }

        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        }

    };

private void actionPerformed(String message) throws IOException {
    ClientDTO clientDTO = new ObjectMapper().readValue(message, ClientDTO.class);
    if (clientDTO.getAction().equalsIgnoreCase("start")) {
        startView(clientDTO);
    } else if (clientDTO.getAction().equalsIgnoreCase("stop")) {
        stopView();
    }

}

public void connect() throws MqttException {
    MqttConnectOptions options = new MqttConnectOptions();
    options.setUserName("a_nice_username");
    options.setPassword("a_cool_password".toCharArray());
    options.setAutomaticReconnect(true);
    MqttClient client = new MqttClient("someaddress", MqttClient.generateClientId());
    client.setCallback(callback);
    try {
        client.connect(options);
        client.subscribe(topic);
        TaskbarIcon.alteraIconeOnline();
    } catch (Exception e) {
        TaskbarIcon.alteraIconeOffline();
    }
}

public void tipoConexao(int tipoConex) throws IOException {
    switch (tipoConex) {
        case 0:
            topic += "/operador/" + getIdReceived() + "/#";
            System.out.println(topic);
            break;

        //etc

    }

1 Ответ

0 голосов
/ 07 января 2019

s в этом методе является темой: public void messageArrived(String s, MqttMessage mqttMessage)

Как очень хорошо задокументировано здесь :

messageArrived

void messageArrived (тема java.lang.String, сообщение MqttMessage) выдает java.lang.Exception

Этот метод вызывается при поступлении сообщения с сервера.

Этот метод вызывается синхронно клиентом MQTT. Подтверждение не отправляется обратно на сервер, пока этот метод возвращается чисто.

Если реализация этого метода вызывает исключение, клиент будет выключен. Когда клиент снова подключается, любой Сообщения QoS 1 или 2 будут доставляться сервером.

Любые дополнительные сообщения, которые приходят во время выполнения реализации этого метода, будут накапливаться в памяти, а затем будут архивироваться в сети.

Если приложению необходимо сохранить данные, оно должно обеспечить сохранение данных до возврата из этого метода, как после возвращаясь из этого метода, сообщение считается доставлено, и не будет воспроизводимым.

Можно отправить новое сообщение в рамках реализации этого обратного вызова (например, ответ на это сообщение), но реализация не должна отключать клиента, так как это будет невозможно отправить подтверждение для обрабатываемого сообщения, и возникнет тупик.

Параметры:

topic - название темы сообщения было опубликовано в

message - фактическое сообщение.

Выдает:

java.lang.Exception - если произошла ошибка терминала, и клиент должен быть выключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...