2017-01-30 6 views
2

Я использую MQTT с paho для приема и публикации сообщений на Android.MQTT с paho на android, только получая первое сообщение

У меня есть следующий код для инициализации MQTT.

private void initializeMQTT(){ 
    try{ 
     mqttClient = new MqttClient(
       "tcp://broker.hivemq.com:1883", 
       MqttClient.generateClientId(), 
       new MemoryPersistence() 
     ); 

     mqttClient.connect(); 
     mqttConnected = mqttClient.isConnected(); 
     mqttClient.subscribe("testtopic/listen",1); 

     mqttClient.setCallback(new MqttCallback() { 
      @Override 
      public void connectionLost(Throwable cause) { //Called when the client lost the connection to the broker 
      } 

      @Override 
      public void messageArrived(String topic, MqttMessage message) throws Exception { 
       mqttPayload = topic + ": " + Arrays.toString(message.getPayload()); 
       mqttAnswer.setPayload(mqttPayload.getBytes()); 
       mqttClient.publish("testtopic/publish",mqttAnswer); 
      } 

      @Override 
      public void deliveryComplete(IMqttDeliveryToken token) {//Called when a outgoing publish is complete 
       messageInfoTest = "message was sent"; 
      } 
     }); 
    } 
    catch(MqttException e){ 

    } 

} 

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

Что происходит прямо сейчас, я получаю первый раз, когда публикую тему testtopic/receive. Кажется, я ничего не публикую. И если я попытаюсь отправить другое сообщение testtopic/receive, он никогда не получит на моем андроиде.

У кого-нибудь есть представление о том, чего я в настоящее время не хватает?

Спасибо!

+0

Как это отличается от вашего последнего qustion? http://stackoverflow.com/questions/41882501/mqtt-android-app-publish-in-callback-function-for-messagearrived – hardillb

+0

Это не так. Я не знаю, как здесь работает приоритет. Я подумал, что это может быть похоронено, когда я отредактировал его, чтобы добавить код через день после его публикации, и решил, что я снова отправлю сообщение, если бы он привлек внимание кого-то, кто мог бы пройти мимо вопроса, когда сначала не было кода , – lhbortho

+0

Не отправляйте один и тот же вопрос несколько раз, они просто будут закрыты как дубликаты. – hardillb

ответ

0

У меня была такая же проблема, после того как отладка PAHO обнаружила, что client.publish должен вызываться из другого потока, кроме потока, вызывающего messageArrived (...) обратного вызова. client.publish (...) нельзя вызывать из messageArrived (...) кода обратного вызова, поскольку он вызывает тупик.

+0

Очень интересно, я просто жил с тем, что у меня было 2 клиента. Если я вернусь к этому коду, я буду оптимизировать его таким образом. Спасибо за ответ! – lhbortho

+0

Попробуйте прокомментировать mqttClient.publish(), и вы увидите, что каждое сообщение прибывает. На Android вы можете использовать AsyncTask. – marioc64