2017-01-30 25 views
2

私はpahoでMQTTを使用してアンドロイドでメッセージを受信し公開しています。アンドロイドでpahoを持つMQTT、最初のメッセージのみを受信

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トピックに初めて投稿しました。私は何かを出版しているようではない。私がテストトピックスに別のメッセージを送ろうとすると、それは私のアンドロイドで受け取ることはありません。

誰でも私が現在欠いているものは何ですか?

ありがとうございます!

+0

これはあなたの最後の質問とどう違うのですか? http://stackoverflow.com/questions/41882501/mqtt-android-app-publish-in-callback-function-for-messagearrived – hardillb

+0

そうではありません。私は質問の優先順位がどのようにここで働くのか分かりません。投稿してから1日後にコードを追加するように編集したときに埋葬されるかもしれないと思っていました。最初にコードを書いていないときに質問を渡した人の注目を集める機会がありました。 – lhbortho

+0

同じ質問を複数回投稿しないでください。それらは重複として閉じられます。 – hardillb

答えて

0

PAHOのデバッグ後、同じ問題が発生しましたが、client.publishは、messageArrived(...)コールバックを呼び出すスレッド以外のスレッドから呼び出されなければならないことがわかりました。デッドロックが発生するため、client.publish(...)はmessageArrived(...)コールバックコードから呼び出すことはできません。

+0

非常に興味深いです、私は2人のクライアントを持っていなければならないという事実に住みました。私がこのコードに戻ると、私はそれをそのように最適化します。答えをありがとう! – lhbortho

+0

mqttClient.publish()にコメントすると、すべてのメッセージが到着しています。 Androidでは、AsyncTaskを使用できます。 – marioc64

関連する問題