【问题标题】:Subscribing on topic. MQTT订阅主题。 MQTT
【发布时间】:2018-11-20 17:46:44
【问题描述】:

我有以下部分代码:

    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 正在处理单击按钮“发布”。问题如下:当我订阅主题时,消息不要到达订阅此主题的客户端。怎么了?

【问题讨论】:

  • 订阅不等于发布......
  • @ΦXocę웃Пepeúpaツ,是的,我知道。我有两种方法:一种用于发布,一种用于订阅

标签: java mqtt


【解决方案1】:

如果我正确理解您的问题,您订阅了主题“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);

【讨论】:

  • 是的,你理解我的意思。我在调试器中使用过,是的,客户端在所有情况下都已连接。我可能认为发布方法存在问题。我看到了一些客户端的例子,它们都有相同的一行:client.setCallback(this);但我不知道如何将它添加到我的项目中,因为争论 'this' 总是带有下划线,并且在 MqttClient 中的 setCallback (org.eclipse.paho.client.mqttv3.MqttCallback) 不能应用于(匿名 java.awt .event.ActionListener)
  • 是的,现在可以了,谢谢。那么,据我了解,类末尾的connectionLost,messageArrived和deliveryComplete方法都不需要吗?
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多