Fubo Docs
  • 概要
    • MQTT: IoTメッセージングの標準
    • MQTT 仕様
    • 初心者ガイド
  • チュートリアル
    • Node.js MQTT クライアントガイド
    • MQTTブローカーに接続する
    • MQTTメッセージの公開
    • MQTTメッセージの購読
    • 受信メッセージ
  • 高度なトピック
    • セッションとQoS
    • MQTT セキュリティメカニズム
    • MQTT 保持メッセージ
Powered by GitBook
On this page
  • 概要
  • 接続方法
  • 接続失敗
  • メッセージを公開する
  • トピックの購読
  • 受信メッセージ
  • 最終脚本例
  • SSLを使用しています
  1. チュートリアル

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のリファレンスを参照してください

Previous初心者ガイドNextMQTTブローカーに接続する

Last updated 12 months ago