MQTTメッセージの購読
トピックに関するメッセージを受信するには、そのトピックまたは複数のトピックを購読する必要があります。
トピックを購読するには、Paho MQTTクライアントクラスのsubscribeメソッドを使用します。
上の図に示されているように、サブスクライブメッセージはSubAckメッセージによって確認されます。
購読するには提供する必要があります
QOS -0,1,2
トピックまたはトピック
あなたは一つの関数呼び出しで複数のトピックを購読できることに注意してください。
MQTT v5を使用する際には、サブスクライブプロパティも送信できます。
再び、publishメッセージと同様に、SubAckメッセージを受け取るためにはpacketreceiveイベントをリッスンする必要があります。
購読 API
まずクライアントオブジェクトを作成し、次に以下のようにsubscribeメソッドを呼び出します:
client.subscribe(topic/topic array/topic object, [options], [callback])
単一のトピックとトピックの配列、そしてトピックオブジェクトを渡すことができます。
選択肢は次のとおりです
QOS -0,1,2
トピックまたはトピックス
ローカルなし - MQTT v5
公開時のまま保持 - MQTT v5
取り扱い維持 - MQTT v5
プロパティ - MQTT v5
コールバック関数は以下の形式をしています:
関数 (err, granted)
どこで:
サブスクリプションエラー、またはクライアントが切断する際に発生するエラー
付与されるのは{topic, qos}の配列です
トピックは購読されたトピックです
qosはそれに与えられたQoSレベルです
イベント
サブアックをキャプチャするには、以下に示すようにpacketreceiveイベントをリッスンする必要があります
client.on("packetreceive",function(packet){
console.log("receive packet "+ JSON.stringify(packet));
})
これが私たちが見るものです:
connected true
subscribing to topics
receive packet {"cmd":"suback","retain":false,"qos":0,"dup":false,"length":3,"topic":null,"payload":null,"granted":[1],"messageId":26988}
タイミング
ノード.jsは非同期関数を使用しているため、タイミングに注意する必要があります。
例えばそのプロセス
接続する
登録する
接続が完了する前に購読が行われるため、機能しない可能性があります。他の言語では、次のように接続が完了するのを単に待ちます:
接続する
接続を待つ
公開
しかし、Node.jsではこれを行うことはできません。
接続が確立されるかテストしてから購読する場合:
if (client.connected==true){
client.subscribe("testtopic",options)
}
その場合、ほぼ確実に機能していないでしょう。接続が確立されていない可能性が高いです。
したがって、ほとんど常にon_connectコールバックでサブスクライブします。
この方法なら、購読する前に接続されていることがわかり、接続が切れた場合は購読が更新されます。
client.on("connect",function(){
console.log("connected "+ client.connected);
let topic="test_topic";
let options={qos:1};
client.subscribe(topic,options);
})
購読例
シングルトピックに登録する
var topic="testtopic";
var message="test message";
console.log("subscribing to topics");
client.subscribe(topic,{qos:1}); //single topic
複数のトピックを購読する
この場合、彼らはすべて同じQOSを使用します。
var topics=["testtopic","testtopic2"];
var message="test message";
console.log("subscribing to topics");
client.subscribe(topics,{qos:1}); //single topic
トピックオブジェクトを使用して複数のトピックに登録する
この場合、使用されるQOSレベルはトピックオブジェクトにある0です。オプションで設定されたQOSは無視されます。
var topics={"testtopic":{qos:0},"testtopic2":{qos:0}};
var message="test message";
console.log("subscribing to topics");
client.subscribe(topics,{qos:1}); //single topic
rh オプションを使用して購読する
このオプションは、例のように2に設定すると、ブローカーに対してサブスクライブ時に保持メッセージを送信しないように指示します。これが機能するためには、接続時にプロトコルバージョンを5に設定する必要があります。
var topic="testtopic";
console.log("subscribing to topics");
client.subscribe(topic,{qos:0,rh:2}); //single topic
プロパティを使用して購読する
この例では、受信メッセージのフィルタリングに使用できるサブスクリプション識別子を設定します。
ブローカーがクライアントに送信するメッセージには、サブスクリプションのトピックに一致するサブスクリプション識別子が含まれています。
この例では、購読するトピックはtesttopicで、サブスクリプション識別子は1に設定されています。
したがって、サブスクリプション識別子が1に設定されているクライアントには、testopicに公開されたメッセージが送信されます
var topic="testtopic";
console.log("subscribing to topics");
let subOptions={qos:0,properties:{subscriptionIdentifier:1}}
client.subscribe(topic,subOptions); //single topic
これがクライアントが受け取るものです。ペイロードの最後にサブスクリプション識別子があることに注意してください。
// message is test message
// topic is testtopic
packet ={"cmd":"publish","retain":true,"qos":0,"dup":false,"length":26,"topic":"testtopic","payload":{"type":"Buffer","data":[116,101,115,116,32,109,101,115,115,97,103,101]},"properties":{"subscriptionIdentifier":1}}
Last updated