SUBSCRIBE メッセージでは、 クライアントは関係するものを 1 つ以上のトピック名でブローカーに登録できます。 これらのトピックにパブリッシュされるメッセージは、 ブローカーからクライアントに PUBLISH メッセージとして送達されます。 SUBSCRIBE メッセージでは、 サブスクライバーがパブリッシュされたメッセージを受信するときの QoS レベルも指定します。
以下の表は、固定ヘッダーの形式を示しています。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
バイト 1 | メッセージ・タイプ (8) | DUP フラグ | QoS レベル | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
バイト 2 | 残りの長さ |
SUBSCRIBE メッセージは QoS レベルが 1 であるため、 変数ヘッダーには、メッセージ ID が含まれています。
通常は、プロトコル・ライブラリーはメッセージ ID を生成し、 パブリッシュしたアプリケーションに戻りハンドルとして戻します。 このような方法により、 1 つのクライアントで実行している複数のアプリケーションまたは複数のパブリッシュ・スレッドによって、 重複したメッセージ ID が生成される危険を回避できます。
メッセージ ID 0 (0x0000) は、無効なメッセージ ID として予約済みなので、 使用してはなりません。 メッセージ ID は 16 ビットの符号なし整数です。 通常は大きくなっていきますが、あるメッセージから別のメッセージへと 1 つずつ大きくすることは求められていません。 メッセージ ID の 2 バイトの順序は、まず MSB、その後で LSB になります (ビッグ・エンディアン)。
以下の表は、10 というメッセージ ID を持つ変数ヘッダーの形式の例を示しています。
説明 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
メッセージ ID | |||||||||
バイト 1 | Message ID MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
バイト 2 | Message ID LSB (10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
SUBSCRIBE メッセージのペイロードには、 クライアントがサブスクライブする先のトピック名のリストと、 クライアントがメッセージを受信するときの QoS レベルが含まれています。 ストリングは UTF エンコードされており、 QoS レベルは 1 バイトの 2 ビットを占有しています。 これらの Topic/QoS の組みは、以下の表のペイロードの例に示されているように、 連続して圧縮されます。
トピック名 | "a/b" |
要求された QoS | 1 |
トピック名 | "c/d" |
要求された QoS | 2 |
SUBSCRIBE メッセージのトピック名は、圧縮されません。
ペイロードの例の形式は、以下の表で示しています。
説明 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
トピック名 | |||||||||
バイト 1 | Length MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
バイト 2 | Length LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
バイト 3 | 'a' (0x61) | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
バイト 4 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
バイト 5 | 'b' (0x62) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
要求された QoS | |||||||||
バイト 6 | 要求された QoS (1) | x | x | x | x | x | x | 0 | 1 |
トピック名 | |||||||||
バイト 7 | Length MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
バイト 8 | Length LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
バイト 9 | 'c' (0x63) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
バイト 10 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
バイト 11 | 'd' (0x64) | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
要求された QoS | |||||||||
バイト 12 | 要求された QoS (2) | x | x | x | x | x | x | 1 | 0 |
要求した QoS レベルが認可される場合、 クライアントは、パブリッシャーからの元のメッセージの QoS レベルに応じて、 このレベル以下の PUBLISH メッセージを受信します。 例えば、クライアントが特定のトピックに対して QoS レベル 1 サブスクリプションを持っている場合、 そのトピックへの QoS レベル 0 PUBLISH メッセージは、 QoS レベル 0 でクライアントに送達されます。 同じトピックへの QoS レベル 2 PUBLISH メッセージは、 クライアントへの送達のために QoS レベル 1 に格下げされます。
結果的に、QoS レベル 2 でトピックにサブスクライブすることは、 このトピックに対するメッセージは、メッセージがパブリッシュされたときの QoS で受信するということと同じです。
「要求された QoS」フィールドは、以下の表に示されているように、 UTF エンコードされた各トピック名に続くバイトの中にエンコードされます。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
予約済み | 予約済み | 予約済み | 予約済み | 予約済み | 予約済み | QoS レベル | ||
x | x | x | x | x | x |
このバイトの上方 6 ビットは、現行バージョンのプロトコルでは使用されていません。 これらは将来の利用のために予約済みです。