如何在主方法Eclipse Paho中访问回调方法(messageArrived)到达的消息的有效负载?

时间:2017-09-13 15:37:08

标签: java mqtt iot paho

问题陈述: - 我正在尝试自动化MQTT流,因为我需要按顺序发布和订阅多个主题。技巧部分是从第一个发布中收到的消息有一些值,它将在下一个sub / pub命令中传递。

例如。

  1. Sub to topicA / abc
  2. Pub to topicA / abc
  3. 在topicA / abc上收到的消息是xyz
  4. sub to topic topicA / xyz
  5. pub to topic topicA / xyz
  6. 我能够收到关于第一个主题的消息,但我没有得到如何在main方法中访问接收消息的有效负载,并将其传递并附加到下一个sub的下一个主题。

    有没有办法从messageArrived回调方法中获取消息有效负载到创建客户端实例的main方法?

    注意: - 我使用单个客户端进行发布和订阅。

    请帮助我,因为我已经没有选择和方法了。

    编辑: -

    代码段

    主要课程

    n = (1:2017)'; % column vector
    m = 1:6; % row vector
    
    syms x;
    l = log(n*x); % column vector of logs
    c = cos(m*x); % row vector of cos
    
    product = l*c; % matrix product
    i = int(product, x, 10, 20); % integral from 10 to 20
    iDouble = double(i); % convert the result to double
    

    Mqtt Claback impl: -

    public class MqttOverSSL {
    String deviceId;
    MqttClient client = null;
    
    public MqttOverSSL() {
    
    }
    
    public MqttOverSSL(String deviceId) throws MqttException, InterruptedException {
        this.deviceId = deviceId;
        MqttConnection mqttConObj = new MqttConnection();
        this.client = mqttConObj.mqttConnection();
    }
    
    public void getLinkCodeMethod() throws MqttException, InterruptedException {
    
        client.subscribe("abc/multi/" + deviceId + "/linkcode", 0);
        publish(client, "abc/multi/" + deviceId + "/getlinkcode", 0, "".getBytes());
    
    
    }
    
    }
    

    发布商类: -

    public class SimpleMqttCallBack implements MqttCallback {
    
      String arrivedMessage;
    
      @Override
      public void connectionLost(Throwable throwable) {
        System.out.println("Connection to MQTT broker lost!");
      }
    
      @Override
      public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
    
        arrivedMessage = mqttMessage.toString();
    
        System.out.println("Message received:\t" + arrivedMessage);
    
        linkCode(arrivedMessage);
      }
    
      @Override
      public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        System.out.println("Delivery complete callback: Publish Completed "+ Arrays.toString(iMqttDeliveryToken.getTopics()));
      }
    
    
      public void linkCode(String arrivedMessage) throws MqttException {
        System.out.println("String is "+ arrivedMessage);
        Gson g = new Gson();
        GetCode code = g.fromJson(arrivedMessage, GetCode.class);
        System.out.println(code.getLinkCode());
      }
    
    }
    

1 个答案:

答案 0 :(得分:0)

好的,你现在要做的事情要清楚一点。

简短回答不,您无法将值传递回"主要方法"。 MQTT是异步的,这意味着您不知道何时消息将到达您订阅的主题。

您需要更新代码以检查传入消息主题是什么,然后在messageArrived()处理程序中处理您想要对该响应执行的操作。如果您有一系列任务要做,那么您可能需要实现所谓的状态机,以便跟踪您在序列中的位置。