# 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');
```

スクリプトの先頭に

## &#x20;概要

Node.jsのスクリプトは非同期であり、イベントを使用します。何かが起こるとイベントがトリガーされます。例えば、クライアントが接続したときなどです。

イベントリスナーを作成して、興味のあるイベントを監視し、このリスナーがコールバック関数を呼び出してイベントを処理します。

## &#x20;接続方法

これはメインメソッドで、呼び出されるとMQTTブローカーに接続し、クライアントクラスを返します。

翻訳テキスト：

```
const client = mqtt.connect(url, options);
```

&#x20;翻訳テキスト：

```
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);
});
```

注目すべき点は、コマンドプロンプトのカーソルが新しい行にあり、点滅していることです。

[![simple-connect-node-script](https://github.com/Fubo-Group/docs/raw/main/images/mqtt-connect.png)](https://github.com/Fubo-Group/docs/blob/main/images/mqtt-connect.png)

これは、クライアントがまだブローカーに接続されており、イベントループに参加しているためです。

しかし、私たちは台本の終わりにいるので、起こりうるのはイベントだけです。だから私たちの台本はそこに座って何もしません。

スクリプトを終了するには、クライアント接続を閉じてください。

```
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

## &#x20;接続失敗

接続が失敗した場合はどうなりますか？

ノードクライアントは接続失敗のためのエラーイベントを提供します。これを監視するためには、次のようにこのイベントのリスナーを作成する必要があります：

```
client.on("error",function(error){ console.log("Can't connect"+error);
```

残応に、これは認証失敗のような失敗のみを捕捉します。

誤ったポートまたは誤ったアドレスに接続しようとすると、エラーは生成されず、クライアントは再接続を試み続けることになります。

エラーが認証失敗を検出した場合、クライアントが継続して接続を試みるため、終了する必要があります。

したがって、on\_errorイベントリスナーは以下のようなものであるべきです：

```
client.on('error', (error) => {
    console.log(`Can't connect ${error}`);
});
```

## &#x20;メッセージを公開する

メッセージを公開するには：

```
client.publish(topic, message, [options], [callback])
```

オプションとコールバックパラメータは任意です。オプションにはメッセージフラグの保持、QoSなどが含まれます。例えば

```
client.publish("testtopic", "test message")
```

&#x20;そして

```
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);
}
```

## &#x20;トピックの購読

購読するには、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);
```

## &#x20;受信メッセージ

トピックに登録する必要があります。

新しいメッセージが到着すると、メッセージイベントがトリガーされます。

このイベントを処理するにはリスナーを作成する必要があります。

```javascript
client.on('message',function(topic, message, packet){
	console.log("message is "+ message);
	console.log("topic is "+ topic);
});
```

コールバックは3つのパラメータを受け入れることができます。 `topic` 、 `message` 、そして `packet` 。

パケットオブジェクトには、メッセージ、トピック、QOS、保持などのメッセージの詳細が含まれています。

その内容を見るには、次を使用してください：

```javascript
console.log(JSON.stringify(packet)
```

以下は、受信したパケットの例のスクリーンショットです：

&#x20;ノードjs-受信パケット

もしリテインフラグを見たい場合は、次のように使用します：

```javascript
console.log("packet retain =" +packet.retain);
```

トピック、メッセージ、パケットを印刷して保持するには、次のコードを使用します：

```javascript
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);
});
```

## &#x20;最終脚本例

最終スクリプトはブローカーに接続し、トピックのコレクションを購読して、x 秒ごとにそのトピックの1つにメッセージを公開します。

受信したメッセージをコンソールに出力し、2 回のループ後に終了します。

```javascript
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の非同期性を示しています。

## &#x20;SSLを使用しています

接続をSSLを使用して安全にすることができます。以下はSSLを使用してブローカーに接続する簡単な接続スクリプトです：

```javascript
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 オプションは、証明書にドメインの不一致がある場合にのみ必要であり、通常は使用すべきではありません。

証明書ファイルが最初に読み込まれ、オプションとして渡されることに注意してください。

クライアント証明書も使用している場合は、次のものを使用してください：

```javascript
var KEY = fs.readFileSync(‘client-certs\\client.key’);
var CERT = fs.readFileSync(‘client-certs\\client.crt’);
```

&#x20;オプションで：

```javascript
key: KEY,
cert: CERT,
```

ここに動作するSSL 接続の例示スクリプトがあります：

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fubogroup.com/chtoriaru/nodejs-mqtt-kuraiantogaido.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
