Подписка на тему.MQTT - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующая часть кода:

    package com.company;

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import javax.security.auth.callback.Callback;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main implements MqttCallback {
    private static String sTopic;
    private static int iQos;
    private static MqttClient mqttClient;
    private static String sUsername;
    private static Frame frame = new Frame();

    public static void main(String[] args) throws MqttException {

        frame.getConnect().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int iPort;
                String sIp = frame.getBrokerAddressValue();
                sUsername = frame.getUsernameValue();
                try {
                    String broker = "tcp://"; //bridge and host
                    iPort = frame.getPortValue();
                    broker+=sIp+":"+iPort;
                    mqttClient = new MqttClient(broker, sUsername, new MemoryPersistence());  //URI, ClientId, Persistence
                    MqttConnectOptions connectOptions = new MqttConnectOptions();
                    connectOptions.setCleanSession(true);
                    System.out.println("Connecting to broker: "+broker);
                    mqttClient.connect();

                    System.out.println("Connected");
                }catch (NumberFormatException exc){
                    System.out.println("Wrong port format");
                } catch (MqttException e1) {
                    e1.printStackTrace();
                }

            }
        });

        frame.getSubscribe().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sTopic = frame.getTopicValue();
                try {
                    mqttClient.subscribe(sTopic);
                } catch (MqttException e1) {
                    e1.printStackTrace();
                }
                System.out.println("Subscribed");
            }
        });

        frame.getPublish().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String sMessage = frame.getMessageValue();
                MqttMessage message = new MqttMessage(sMessage.getBytes());
                iQos = frame.getQosValue();
                message.setQos(iQos);
                try {
                    mqttClient.publish(sTopic,message);
                } catch (MqttException e1) {
                    e1.printStackTrace();
                }
                System.out.println("Message published");
            }
        });
    }

    @Override
    public void connectionLost(Throwable throwable) {

    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception{
        frame.getTextArea().setText(String.valueOf(message));
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

    }
}

Вот часть моей реализации клиента mqtt.Метод getConnect обрабатывает нажатие кнопки «Подключиться», метод getSubscribe обрабатывает нажатие кнопки «Подписаться», метод getPublish обрабатывает нажатие кнопки «Опубликовать». Проблема заключается в следующем: когда я подписываюсь на тему, сообщенияне приходите на клиентов, которые подписаны на эту тему.В чем дело?

1 Ответ

0 голосов
/ 20 ноября 2018

Если я правильно понимаю ваш вопрос, вы подписаны на тему 'sTopic', но не получаете сообщений, когда кто-то публикует сообщение в теме 'sTopic'.

Вы уверены, что клиент Mqtt подключенуспешно брокеру?Сделайте, чтобы клиент mqtt был подключен перед совершением звонка по подписке.

            if( mqttClient.isConnected()) {
                mqttClient.subscribe(sTopic);
             }

и то же самое относится и к публикации.

               if( mqttClient.isConnected()) {
                   mqttClient.publish(sTopic,message);
                }

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

Необходимо установить для метода обратного вызова mqttClient

                clientCallback = new MqttCallback() {

                    @Override
                    public void connectionLost(Throwable cause) {

                    }

                    @Override
                    public void messageArrived(String topic, MqttMessage message) throws Exception {

                    }

                    @Override
                    public void deliveryComplete(IMqttDeliveryToken token) {

                    }
                };

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