2017-01-30 6 views
2

MQTT와 함께 paho를 사용하여 Android에서 메시지를 수신 및 게시합니다.안드로이드에 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 topic에 처음 게시 될 때입니다. 나는 아무것도 공개하지 않는 것 같습니다. 그리고 내가 testtopic에 또 다른 메시지를 보내려고하면/안드로이드에 수신되지 않습니다.

누구나 내가 현재 갖고 있지 않은 아이디어가 있습니까?

감사합니다.

+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