2017-01-24 4 views
0

현재 Paho MQTT android 클라이언트의 현재 버전 (org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0 컴파일)을 사용 중이며 messageArrived() 콜백에서받은 모든 메시지에서 메시지 ID를 가져 오려고합니다. 이것이 내가하는 방식이다. 메시지가 도착한 QoS제로 메시지 ID를 반환메시지 ID가 paho mqtt에서 0을 반환합니다.

2의 언제 나 방법 messageArrived으로

@Override 
     public void messageArrived(String topic, MqttMessage message) throws Exception { 
      String plainMessage = new String(message.getPayload()); 

       int messageID= new Integer(message.getId()); 
       System.out.println(messageID); 

     } 

업데이트 가 호출됩니다.

아무에게도이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

+0

어떤 QoS 수준입니까? –

+0

@PavelZdenek 2의 QoS 레벨을 사용하고 있습니다. – George

답변

1

나는 Paho에 익숙하지 않지만 "message id"는 MQTT spec에서 말하는 "packet identifier"와 같은 것으로 가정합니다 : 모든 메시지에 대해 고유 한 번호 매김 순서가 아닙니다. 그것은 단지 2 바이트입니다 (Paho가 부호없는 2 바이트를 유지할 수있는 가장 작은 기본 유형을 사용하기 때문에 아마 같은 것입니다). 이것은 QoS> 0의 멀티 스테이지 핸드 쉐이크 중에 비행중인 여러 메시지를 일치시키는 것을 의미합니다. 그래서 제 이론은 이것입니다 : 어떤 MQTT 중개자를 붙이든지,이 제한된 시퀀스를 드문 드문하게 사용하고 있습니다. 비행 중에 여러 개의 메시지가있을 때만 0이 아닌 숫자가 표시 될 수 있습니다. Paho javadoc을 올바르게 읽으면 간단하게 테스트 할 수 있어야합니다. 메시지는 계속 실행하지만 보류는 messageArrived에서 반환합니다.

시도해보고 알려주세요. 나는 조금 추측하고있다. 좀 더 생각해 보면이 메시지 ID를 모든 메시지의 응용 프로그램 수준 고유 식별자로 사용하려고합니다. 올바른 도구가 아닙니다. 응용 프로그램 수준에서 자신 만의 시퀀스를 제공해야합니다.

+0

아주 좋습니다. 그렇지만 자체적으로 메시지 ID를 생성하고 아마도'json'을 사용하여 메시지 페이로드에 추가하는 것을 의미합니다. 내가 이것을 사용한다고 가정하면 게시 기능이 느려질 것이라고 생각하지 마십시오. 어떻게 생각해? – George

+0

당신은 어떤 종류의 감속을 두려워합니까? 하나의 Int64를 페이로드에 추가하여 측정 가능한 속도가 느려지는 것을 상상할 수 없습니다. 인코딩은 현재 페이로드 형식에 따라 다릅니다. –

+0

페이로드에 int64를 추가하면받는 사람이 두 개의 서로 다른 메시지에 대해 중복 된 messageID를받을 수 있습니다. 따라서 모든 메시지는 보낸 사람 데이터베이스에 저장되므로 보낸 사람의 로컬 데이터베이스에서 고유 한 메시지 ID를 가져 오는 것이 좋습니다. 이것이 내가 그것을 발표 할 때 메시지를 느리게 만들 수 있다고 생각하는 방법입니다. – George