0

の基本を学ぶためにこのチュートリアルを読んPaho android Service APIでいます。テキストのどこかで、client.connect(context, callback2 つのメソッドonSuccess()onFailure()

前述のように、この例では同期クライアントが使用されています (MqttAsyncClient ではなく MqttClient)。これは、接続などの要求がブロックされ、例外が返されるかスローされることを意味します。サーバーからメッセージを取得するためのポーリングまたは読み取りメソッドはありません。サーバーからのメッセージはいつでも到着する可能性があります。ライブラリーは、この動作を処理するためのコールバック・メカニズムを提供します。クライアントに登録された MqttCallback オブジェクト内のメソッドが適切に呼び出されます。MqttCallback は、別のクラスによって実装する必要があるインターフェースです...コールバック機能を有効にするには、コールバック オブジェクトをクライアントに登録します。これは、サーバーに接続する前に行うのが最も論理的です。

そして、私が言及した最後の2行を読んだ後、私は混乱しました。私が理解している限り、クライアントをカルバックに登録することの本質はconnectionLost,deliveryComplete,messageArrived、サーバーの状態を「非同期的に」処理し、サーバーから読み取ることです。

さて、私の質問は、私が引用した最後の2行に関して、サーバー自体に接続する前にサーバーから状態を読み取るためにクライアントを登録するにはどうすればよいですか? つまり、「なぜ、「client.connect()」の前に「client.callback」を呼び出す必要があるのですか?」

誰でもこの点を明確にして説明してください。

4

2 に答える 2

1

コールバックを設定すると、新しいメッセージを受信したときに呼び出される関数を登録するだけです。MQTT ブローカーに接続するまで、実際には何も起こりません。メッセージを見逃さないように、接続する前にコールバックを設定する必要があります。

たとえば、cleansession == 0 の場合、MQTT ブローカーは接続時に直前のセッションをすぐに再開します。待機中のメッセージがあり、コールバック関数を設定していない場合、それらのメッセージを見逃す可能性があります。

cleansession == 1 の場合でも、接続直後のコマンドは MQTTClient_subscribe である可能性があります。同様のタイミング上の理由から、MQTTClient_subscribe を呼び出す前にコールバックを設定する必要があります。したがって、cleansession == 1 であることがわかっている場合は、callback-connect-subscribe または connect-callback-subscribe のいずれかになります。大きな違いはないので、接続する前にコールバック関数を設定する習慣を身につけたほうがよいでしょう。

于 2015-02-25T22:56:37.870 に答える
0

...コールバック機能を有効にするには、コールバック オブジェクトをクライアントに登録します。これは、サーバーに接続する前に行うのが最も論理的です。

これは、接続する前に MqttClient.setCallback() を呼び出す必要があることをほぼ意味しますが、動作させるために呼び出す必要はありません。私はこれをテストしていませんが、それがその声明から得たものです。

私が推測しているのは、クライアントが接続する (または接続しない) ことであり、その決定はコールバックを介して到達するため、アプリケーションは結果を知る方法がありません。お役に立てれば!

于 2016-04-01T17:10:01.667 に答える