Node.js MQTT クライアントガイド
node.js MQTTクライアントは、MQTTブローカーでメッセージを公開したりトピックを購読するために使用できるオープンソースのクライアントです。次の方法でインストールできます:
npm install mqtt --save
# and To install the command line tools
npm install mqtt -g
クライアント向けのドキュメントはこちらでご覧いただけます
このチュートリアルでは、重要なクライアント機能をカバーし、シンプルなパブリッシュサブスクライブノード、jsの例示スクリプトを作成します。
クライアントを使用するには、次のものを使用する必要があります:
const mqtt=require('mqtt');
スクリプトの先頭に
概要
Node.jsのスクリプトは非同期であり、イベントを使用します。何かが起こるとイベントがトリガーされます。例えば、クライアントが接続したときなどです。
イベントリスナーを作成して、興味のあるイベントを監視し、このリスナーがコールバック関数を呼び出してイベントを処理します。
接続方法
これはメインメソッドで、呼び出されるとMQTTブローカーに接続し、クライアントクラスを返します。
翻訳テキスト:
const client = mqtt.connect(url, options);
翻訳テキスト:
const client = mqtt.connect("mqtt://broker.fubogroup.com:1833", options)
const client = mqtt.connect("mqtt://broker.fubogroup.com:1833", { clientId: "mqttjs01" })
通常、メソッドに渡す必要がある多くのオプションがあり、そのオプションは通常、JavaScriptオブジェクトとして作成されます。例えば。
ユーザー名とパスワード認証およびクリーンセッションを使用するには、次のオプションを使用します。
options = {
clientId:"mqttjs01",
username:"steve",
password:"password",
clean:true
};
MQTTプロトコルはCONNACKメッセージで接続を認識します。
これにより、クライアントでon_connectイベントが発生し、次のようにリスナーを作成することで調査できます:
client.on("connect", function() {
console.log("connected");
});
リスナーは接続イベントを待ち、コールバック関数を呼び出します。この例では、クライアントが接続するとメッセージを単に表示します。
私たちは今、最初の例のスクリプトを試すことができます。
このスクリプトはbroker.fubogroup.comのMQTTブローカーに接続し、接続時にメッセージを表示します。
const mqtt = require('mqtt');
const clientId = 'fubo' + Math.random().toString(16).substring(2, 8);
const client = mqtt.connect('mqtt://127.0.0.1:1883', {
clientId,
});
client.on('connect', (response) => {
console.log(`connected ${client.connected}`);
console.log(response);
});
注目すべき点は、コマンドプロンプトのカーソルが新しい行にあり、点滅していることです。
これは、クライアントがまだブローカーに接続されており、イベントループに参加しているためです。
しかし、私たちは台本の終わりにいるので、起こりうるのはイベントだけです。だから私たちの台本はそこに座って何もしません。
スクリプトを終了するには、クライアント接続を閉じてください。
client.end();
on_connect イベントは、connected というフラグを true に設定します。このフラグには次のようにアクセスできます: client.connected.
私たちのシンプルなスクリプトを変更して、このフラグを前後に印刷するようにしました:
var client = mqtt.connect("mqtt://broker.fubogroup.com",{clientId:"mqttjs01"});
console.log("connected flag "+client.connected);
client.on("connect",function(){
console.log("connected "+client.connected);
})
スクリプトを実行すると、次のように表示されるはずです:
ノード接続スクリプト2
接続失敗
接続が失敗した場合はどうなりますか?
ノードクライアントは接続失敗のためのエラーイベントを提供します。これを監視するためには、次のようにこのイベントのリスナーを作成する必要があります:
client.on("error",function(error){ console.log("Can't connect"+error);
残応に、これは認証失敗のような失敗のみを捕捉します。
誤ったポートまたは誤ったアドレスに接続しようとすると、エラーは生成されず、クライアントは再接続を試み続けることになります。
エラーが認証失敗を検出した場合、クライアントが継続して接続を試みるため、終了する必要があります。
したがって、on_errorイベントリスナーは以下のようなものであるべきです:
client.on('error', (error) => {
console.log(`Can't connect ${error}`);
});
メッセージを公開する
メッセージを公開するには:
client.publish(topic, message, [options], [callback])
オプションとコールバックパラメータは任意です。オプションにはメッセージフラグの保持、QoSなどが含まれます。例えば
client.publish("testtopic", "test message")
そして
var options={
retain:true,
qos:1};
client.publish("testtopic", "test message",options)
出版する前に、接続されていることを確認するのが賢明です:
if (client.connected==true){
client.publish("testtopic", "test message",options)
}
しかし、接続が非同期であるため、クライアントが接続される前にif 文が試される可能性が高いため、これはうまくいかないでしょう。
したがって、接続して公開し、切断するだけの場合は、on_connectコールバックでpublishを呼び出すべきです。
定期的に公開する必要がある場合、例えばステータス情報を送信するときは、以下に示すように setInterval
関数を使用してください。
var message="test message";
var topic="testtopic";
//publish every 5 secs
var timer_id=setInterval(function(){publish(topic,message,options);},5000);
//publish function
function publish(topic,msg,options){
console.log("publishing",msg);
if (client.connected == true){
client.publish(topic,msg,options);
}
トピックの購読
購読するには、client.subscribeメソッドを使用します。一般的な形式は次のとおりです:
client.subscribe(topic/topic array/topic object, [options], [callback])
単一のトピックのみを購読したい場合は、トピック文字列メソッドを使用します。
配列メソッドを使用する場合は、同じQoSで複数のトピックを購読したい場合に使用します。つまり、オプションで渡すQoSは配列内のすべてのトピックに適用されます。
オブジェクトメソッドを使用するのは、異なるQoS 設定で複数のトピックを購読したい場合です。使用例:
var topic_s="topic";
var topic_list=["topic2","topic3","topic4"];
var topic_o={"topic22":0,"topic33":1,"topic44":1};
client.subscribe(topic_s,{qos:1});
client.subscribe(topic_list,{qos:1});
client.subscribe(topic_o);
受信メッセージ
トピックに登録する必要があります。
新しいメッセージが到着すると、メッセージイベントがトリガーされます。
このイベントを処理するにはリスナーを作成する必要があります。
client.on('message',function(topic, message, packet){
console.log("message is "+ message);
console.log("topic is "+ topic);
});
コールバックは3つのパラメータを受け入れることができます。 topic
、 message
、そして packet
。
パケットオブジェクトには、メッセージ、トピック、QOS、保持などのメッセージの詳細が含まれています。
その内容を見るには、次を使用してください:
console.log(JSON.stringify(packet)
以下は、受信したパケットの例のスクリーンショットです:
ノードjs-受信パケット
もしリテインフラグを見たい場合は、次のように使用します:
console.log("packet retain =" +packet.retain);
トピック、メッセージ、パケットを印刷して保持するには、次のコードを使用します:
client.on('message',function(topic, message, packet){
console.log("message is "+ message);
console.log("topic is "+ topic);
console.log("packet =" +JSON.stringify(packet));
console.log("packet retain =" +packet.retain);
});
最終脚本例
最終スクリプトはブローカーに接続し、トピックのコレクションを購読して、x 秒ごとにそのトピックの1つにメッセージを公開します。
受信したメッセージをコンソールに出力し、2 回のループ後に終了します。
var mqtt = require('mqtt');
var count =0;
var client = mqtt.connect("mqtt://192.168.1.157",{clientId:"mqttjs01"});
console.log("connected flag " + client.connected);
//handle incoming messages
client.on('message',function(topic, message, packet){
console.log("message is "+ message);
console.log("topic is "+ topic);
});
client.on("connect",function(){
console.log("connected "+ client.connected);
})
//handle errors
client.on("error",function(error){
console.log("Can't connect" + error);
process.exit(1)});
//publish
function publish(topic,msg,options){
console.log("publishing",msg);
if (client.connected == true){
client.publish(topic,msg,options);
}
count+=1;
if (count==2) //ens script
clearTimeout(timer_id); //stop timer
client.end();
}
//////////////
var options={
retain:true,
qos:1};
var topic="testtopic";
var message="test message";
var topic_list=["topic2","topic3","topic4"];
var topic_o={"topic22":0,"topic33":1,"topic44":1};
console.log("subscribing to topics");
client.subscribe(topic,{qos:1}); //single topic
client.subscribe(topic_list,{qos:1}); //topic list
client.subscribe(topic_o); //object
var timer_id=setInterval(function(){publish(topic,message,options);},5000);
//notice this is printed even before we connect
console.log("end of script");
ソーステキスト:スクリプトが実行されているスクリーンショットはこちらです: 翻訳テキスト:
ノードMQTTスクリプト例
スクリプトが明らかに実行中であるにもかかわらず、スクリプトの終了メッセージが表示されることに気付くべきです。
これは、node.jsの非同期性を示しています。
SSLを使用しています
接続をSSLを使用して安全にすることができます。以下はSSLを使用してブローカーに接続する簡単な接続スクリプトです:
var mqtt = require('mqtt');
const fs = require('fs');
var caFile = fs.readFileSync("ca.crt");
var options={
clientId:"mqttjs01",
//port:8883,
//host:'192.168.1.71',
//protocol:'mqtts',
rejectUnauthorized : false,
ca:caFile
}
var client = mqtt.connect("mqtts://192.168.1.71:8883",options);
console.log("connected flag " + client.connected);
client.on("connect",function(){
console.log("connected "+ client.connected);
})
rejectUnauthorized : false オプションは、証明書にドメインの不一致がある場合にのみ必要であり、通常は使用すべきではありません。
証明書ファイルが最初に読み込まれ、オプションとして渡されることに注意してください。
クライアント証明書も使用している場合は、次のものを使用してください:
var KEY = fs.readFileSync(‘client-certs\\client.key’);
var CERT = fs.readFileSync(‘client-certs\\client.crt’);
オプションで:
key: KEY,
cert: CERT,
ここに動作するSSL 接続の例示スクリプトがあります:
//https://github.com/mqttjs/MQTT.js/issues/264
var mqtt = require('mqtt');
const fs = require('fs');
//var cert="ca.crt";
var caFile = fs.readFileSync("ca.crt");
//if using client certificates
var KEY = fs.readFileSync('client-certs\\client.key');
var CERT = fs.readFileSync('client-certs\\client.crt');
//
var options={
clientId:"mqttjs01",
//port:8883,
//host:'192.168.1.71',
//protocol:'mqtts',
rejectUnauthorized : false,
//if using client certificates
key: KEY,
cert: CERT,
//
ca:caFile
}
var client = mqtt.connect("mqtts://192.168.1.71:8883",options);
console.log("connected flag " + client.connected);
client.on("connect",function(){
console.log("connected "+ client.connected);
})
詳細はGithubのリファレンスを参照してください
Last updated