LoginSignup
30
30

More than 5 years have passed since last update.

MQTT-SN と MQTTの違いのまとめ

Last updated at Posted at 2014-05-28

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が必要。

30
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
30