MQTT-SNにはMQTTにはないメッセージと、同じメッセージでもMQTTとは異なるフォーマットがある。 これはペイロードの長さの制限から、長いトピックが使用できず、2オクテットの整数に置換する必要があるためである。 以下にMQTTと異なるメッセージを列挙した。
##ADVERTISE
G/Wはそのプレゼンスをクライアントに通知するために、定期的にブロードキャストする。
クライアントは可動中のG/WのアドレスとIdをG/Wリストとして保持する。 AdvertiseとGwInfoの受信でこのリストを更新する。 またクライアントは、Duration * Nadv 時間内にAdvertiseを受信していることで、G/Wが稼働中である事を知る。
##SERCHGW
クライアントはネットワークに接続した時に、SERCHGWでG/Wを検索する。 接続からSERCHGW送信までの時間は0〜Tserchまでのランダムな時間とする。これは複数のクライアントが同時にSERCHGWを送出する無駄を省くためである。
##GWINFO
G/WはSERCHGWを受信するとGWINFOを返信する。 クライアントはGWINFOを受信したら、G/Wリストを更新する。 GWINFOではSERCHGWと同じRadiusを使用する。 GWINFO送信までの時間は0〜Tgwinfoまでのランダムな時間とする。
##CONNECTION
クライアントはG/Wと接続する。G/Wはクライアントのプロキシーとなってブローカーと接続する。 マルチG/Wの場合、接続中のG/Wがダウンしたら、バックアップのG/Wに再接続する必要がある。
##REGISTER
クライアントはTopicNameをG/Wに登録し、TopicIdをREGACKで受け取る。 REGACKでエラーが報告されるとTwait待って再度REGISTERする。 G/WもクライアントにREGISTERを送信することがある。 (クライアントがワイルドカードでSubしたした場合、ClearnSessionフラグ無しでGwに再接続した場合)
G/WはクライアントがSubしたワイルドカードのTopicについてサーバーからPubされた場合、そのTopicに対応するTopicIdがG/Wに登録されていなければ、登録しクライアントにREGISTERを送信する。 この場合にはREGISTERにTopicIdが入力されている。
REGISTERを受診したクライアントまたはG/WはREGACKで返信する。
Pre-definedTopicはクライアントとG/W間で予め決めているもので、登録なしで使用できる。 G/Wとクライアント間の通信などに使用できる。 G/Wによるクライアントの制御に活用できる。
クライアントが未知のTopicIdを受診した時、PUBACKの応答はReturnCode=”Rejected:Invalid TopicId” となる。 この応答を受けてG/WはTopicを削除するか、変更する。
##PINGREQ
クライアントはCONNECTで指定したKeepAliveTimeでPINGREQをG/Wに送信する。 G/WはPINGRESPで応答する。 同様に、クライアントはG/WからのPINGREQを受信すると、PINGRESPを送信する。 クライアントはPINGREQを数回送ってもPINGRESPを受信できない場合には、他のG/Wに再接続する。 他のG/Wに再接続が集中しないようにKeepAliveTimeはそれぞれのクライアンで異なる値をとる。
##DISCONECT
DISCONNECTのDurationはsleepする時に指定する。 Durationの指定があるときはASleep。
G/Wは、このDurationでクライアントがCONNECTすればActive、PINGREQすればAwake、何もなければLostと判断する。 G/WはClientIdがセットされたPINGREQを受信した場合、sleepタイマーをリセットしAwakeになったと判断する。 クライアントにPubすべきデータを受信していなければ、直ちにPINGRESPを返信する。 PubデータがあればPubする。 その後PINGRESPを返信する。
クライアントはPINGRESPを受信後Asleepになる。 G/Wはクライアント用のスリープタイマーを再起動する。 クライアントはPINGRESPを送信した後、PINGRESP以外のメッセージを受診したら、Tretryタイマーを起動し、PINGRESPを受診したら、タイマーを止める。 TretryタイマーがタイムアップしたらPINGREQを再送してTretryタイマーを起動する。 リトライ回数はクライアントが決める。 (バッテリーの消耗を防ぐため) PINGRESPが受信できなければクライアントはAsleepになる。 クライアントはsleep Duration後Pubすべきデータがなければ、CONNECTせずにPINGREQでG/Wが稼動していることを確認するだけとすべき。
DISCONNECTのCleanSession Flgがセットされていれば、G/Wはそのクライアントのデータを削除する。
##SUBSCRIBE
TopicNameにワイルドカードが含まれていたら、SUBACKのTopicIdは0x0000となる。 G/WはTopicIdが0x0000の場合、最初のPubでTopicNameとTopicIdをREGISTERでクライアントに通知する。
Pre-defined TopicであってもSubが必要。