2017-02-21 43 views
2

У меня есть микроконтроллер с термостатом, который отправляет свои данные через Raspberry Pi на мой компьютер с использованием протокола MQTT. Кура установлена ​​и работает на малине.Как подписаться на тему MQTT и распечатать полученные сообщения на Eclipse (Java)

У меня нет проблем с получением данных о Putty, но теперь мне нужно получить его на Eclipse, чтобы я мог разработать программу.

мне удалось опубликовать на эту тему с помощью затмения, используя Pāho с помощью следующего кода (который является адаптацией этой другой теме Subscribe and Read MQTT Message Using PAHO):

package publish; 

import org.eclipse.paho.client.mqttv3.MqttClient; 
import org.eclipse.paho.client.mqttv3.MqttException; 
import org.eclipse.paho.client.mqttv3.MqttMessage; 

public class PublishSemInterface { 
MqttClient client; 

public PublishSemInterface() {} 

public static void main(String[] args) { 
    new PublishSemInterface().doDemo(); 
} 

public void doDemo() { 
    try { 
     client = new MqttClient("tcp://192.168.0.39:1883", "user"); 
     client.connect(); 
     MqttMessage message = new MqttMessage(); 
     message.setPayload("Published message".getBytes()); 
     client.publish("sensor/temp/out", message); 
     client.disconnect(); 
    } catch (MqttException e) { 
     e.printStackTrace(); 
    } 
} 
} 

Но подписываться это время боль. Я попытался с помощью ответа на эту тему я уже упоминал выше, внедрение MqttCallback интерфейса:

public class PublishSemInterface implements MqttCallback 

Добавление setCallback после подключения к клиенту и методов требуется интерфейс (мне нужно только messageArrived):

client.setCallback(this); 

@Override 
public void connectionLost(Throwable cause) {} 

@Override 
public void messageArrived(String topic, MqttMessage message) 
    throws Exception { 
System.out.println(message); 
} 

@Override 
public void deliveryComplete(IMqttDeliveryToken token) {} 

Но это не сработало. Я также попытался с помощью ответа от следующей темы: How to read data from MQTT in Eclipse Paho?

public static void main(String[] args) { 

    MqttClient client; 
    MqttConnectOptions conn; 

    try { 
     client = new MqttClient("tcp://192.168.0.39:1883", "user"); 
     client.connect(); 
     client.setCallback(new MqttCallback() { 
      public void connectionLost(Throwable cause) {} 

      public void messageArrived(String topic, 
        MqttMessage message) 
          throws Exception { 
       System.out.println(message.toString()); 
      } 

      public void deliveryComplete(IMqttDeliveryToken token) {} 
     }); 

     client.subscribe("sensor/temp/in"); 

    } catch (MqttException e) { 
     e.printStackTrace(); 
    } 
} 

Кроме того, что он не работает. В обоих случаях, когда я запускаю код, консоль активна, но когда микроконтроллер отправляет данные (которые появляются на Putty), вместо того, чтобы печатать, программа прекращается. Похоже, что методы messageArrived не вызываются.

Может ли кто-нибудь помочь мне с подпиской и печатью на консоли Eclipse?

ответ

0

Мне удалось сделать отправку данных на консоли Eclipse. Похоже, что ClientId ошибался, но я также добавил некоторые изменения, основанные на ответах на темы, которые были связаны с моим вопросом. Вот код:

private Map<String, Object> properties; 

public void updated(Map<String, Object> properties) { 
    this.properties = properties; 
    String broker = ""; 
    String clientId = ""; 
    String topic = ""; 

    if(properties != null && !properties.isEmpty()) { 

    broker = (String) properties.get("broker.name"); 
    clientId = (String) properties.get("clientId.name"); 
    topic = (String) properties.get("topic.name"); 

    doDemo(broker, clientId, topic); 
    } 
} 

public void doDemo(String broker, String clientId, String topic) { 
    MemoryPersistence persistence = new MemoryPersistence(); 

    try { 
    MqttClient sampleClient = new MqttClient(broker, clientId, persistence); 
    MqttConnectOptions connOpts = new MqttConnectOptions(); 
    connOpts.setCleanSession(true); 

    sampleClient.setCallback(new MqttCallback() { 
     public void connectionLost(Throwable cause) {} 

     public void messageArrived(String topic, MqttMessage message) throws Exception { 
     System.out.println("Message: " + message.toString()); 
     } 

     public void deliveryComplete(IMqttDeliveryToken token) {} 
    }); 

    sampleClient.connect(connOpts); 
    sampleClient.subscribe(topic); 

    } catch(MqttException e) { 
    e.printStackTrace(); 
    } 
} 
1

Как вы можете видеть: client.publish("sensor/temp/out", message);, ваша тема sensor/temp/out. Поэтому ваш подписчик должен быть подписан на ту же тему, вместо этой строки: client.subscribe("sensor/temp/in");, попробуйте подписаться на тему: sensor/temp/out.

Также я бы рекомендовал вам создать соединение, используя дополнительные параметры mqtt. Что-то вроде этого:

MqttClient client = new MqttClient(serverUrl, UUID.randomUUID().toString().replace("-", "")); //clientID needs to be unique and has meaning only for mqtt broker 
MqttConnectOptions options = new MqttConnectOptions(); 
options.setUserName("username"); //part of the password_file inside mqtt broker 
options.setPassword("password".toCharArray()); //also part of password_file. Username and password might not be needed. 
options.setConnectionTimeout(60); 
options.setKeepAliveInterval(60); //how often to send PINGREQ messages 
options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); //newest version 
client.connect(options); 
+0

Разница в тематике объясняется тем, что коды взяты из моих подписных и публичных программ. «датчик/темп/выход» предназначен для приема данных, а «датчик/темп/вход» - для отправки данных. Что касается дополнительных параметров MQTT, я еще не использовал их, потому что сейчас я сосредоточен на подписке и показе сообщений соответствующим образом. Как только я преуспею, я обязательно добавлю эти параметры к соединениям. – Ernani