2017-01-24 40 views
0

現在のバージョンのPaho MQTT androidクライアント(コンパイルorg.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0)を使用していますが、messageArrived()コールバックから受信したすべてのメッセージからメッセージIDを取得しようとしています。これが私のやり方です。 QoSメッセージIDはpaho mqttで0を返します

2のメッセージと

@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); 

     } 

更新 IDはゼロメッセージが到着いつでも又はmessageArrivedが呼び出されるメソッドを返します。

誰かがこれを解決する方法について考えていますか?

+0

どのようなQoSレベルですか? –

+0

@PavelZdenek私はQoSレベル2 – George

答えて

1

私はPahoに慣れていませんが、「メッセージID」はMQTT specで話されている「パケット識別子」と同じものとみなします。これはすべてのメッセージに固有の番号付けシーケンスではありません。それはちょうど2バイトです(Pahoは符号なしの2バイトを保持できる最小のプリミティブ型を使用しているため、おそらく同じことです)。これは、QoS> 0のマルチステージハンドシェイク中に飛行中に複数のメッセージに一致することを意味します。だから私の理論はこれです。MQTTブローカーが何であれ、この限られたシーケンスをまばらに使用しています。飛行中に複数のメッセージがある場合にのみ、0以外の数字が表示されることがあります。あなたがPaho javadocを正しく読んだら、簡単にテストすることができるはずです。メッセージを発射し続けますが、返信はmessageArrivedから戻ってください。

お試しください。私は少し推測している。もし私がもう少し推測すれば、このメッセージIDをすべてのメッセージのアプリケーションレベルの一意の識別子として使用したいと考えています。これは適切なツールではありません。アプリケーションレベルで独自のシーケンスを提供する必要があります。

+0

を使用していますが、それは私自身のメッセージIDを生成し、それをおそらく 'json'を使ってメッセージペイロードに追加することを意味します。私がそれを使用していると仮定して、それが出版機能を遅らせるとは思わないでください。どう思いますか? – George

+0

あなたはどのような減速を恐れていますか?ペイロードに1つのInt64を追加することで、測定可能な減速を想像することはできません。エンコーディングは、現在のペイロード形式に依存します。 –

+0

ペイロードにint64を追加すると、受信者が2つの異なるメッセージに対して重複したmessageIDを受け取る可能性があります。だから私はローカルデータベース(すべてのメッセージが送信者データベースに保存されるので、送信者の)から一意のメッセージIDを取得しようとしています。これは、私がそれを公開するメッセージを遅らせるかもしれないと思う方法です。 – George

関連する問題