# MQTTブローカーに接続する

概要で説明されたように、接続メソッドは以下の目的で使用されます：

* クライアントクラスを作成する
* ブローカーに接続する

翻訳テキスト：

```javascript
var client = mqtt.connect(url,options)
```

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

&#x20;Source Text: e.g. Translation Text: 例えば

```javascript
var client = mqtt.connect("mqtt://192.168.1.157",options)
```

通常、メソッドに渡す必要がある多くのオプションがあり、そのオプションは通常、JavaScriptオブジェクトとして作成されます。

例えば、ユーザー名とパスワード認証およびクリーンセッションを使用するには、次のオプションを使用します。

```javascript
options={
clientId:"mqttjs01",
protocolVersion:4, //use 5 for mqttv5
username:"steve",
password:"password",
clean:true};
```

MQTTプロトコルは、 `CONNACK` メッセージで接続を認識します。

これによりクライアントで `on_connect` イベントが発生し、次のようにリスナーを作成することで調査できます：

```javascript
client.on("connect",function(){	
console.log("connected");
```

リスナーは `connect` イベントを待ち、コールバック関数を呼び出します。上記の例では、クライアントが接続するとメッセージを印刷するだけです。

on\_connect イベントは、connected というフラグを true に設定します。このフラグには client.connected を使用してアクセスできます。

## &#x20;URL

接続メソッドのURLには、ブローカーのIPアドレスまたはドメイン名が含まれています。例示された以下では、プロトコルであるMQTTが接頭辞として付けられています。

```javascript
var client = mqtt.connect("mqtt://192.168.1.157",options)
```

MQTT+SSLを使用して接続する場合、プロトコルの接頭辞はmqttsです。また、ws（ウェブソケット）とwss（ウェブソケット+SSL）の接頭辞もあります。

接続ポートはURLの一部としても渡すことができます。例えば

```javascript
var client = mqtt.connect("mqtt://192.168.1.157:1883",options)
```

しかし、通常はオプションの一部として設定されます。オプションの設定は、両方が存在する場合にURLの設定を上書きします。

## &#x20;オプション

接続メソッドに渡すことができる多くのオプションがあり、それらはここにリストされています。

このチュートリアルでは、知っておくべき最も重要で一般的なもののいくつかについて説明します。

### &#x20;クライアントID

各クライアントには固有のIDが必要です。通常、既知のプレフィックスを使用してランダムなIDを生成します。

接頭辞はACL（アクセス制御リスト）で使用できるため、現在 ACLを使用していなくても、接頭辞を使用することが良い習慣です。

私が使用しているコードは次のようになっています：

```javascript
let r = Math.floor(Math.random() * 10000); 
let clientId= "mqttjs-"+r,
```

### &#x20;プロトコルバージョン

この設定は接続パケットに設定されており、正しく設定することを確認してください。現在のデフォルトはMQTTv3.1.1（protocolVersion:4）です。MQTTv5を使用する場合はprotocolVersion:5を使用してください。

### 最後の遺言メッセージの設定

最後の遺言メッセージは接続パケットの一部です。遺言メッセージはMQTTv5で拡張されました。次のスクリーンショットはすべての可能な設定を示していますが、プロパティ属性はMQTT v5でのみ利用可能です。

[![mqtt-will-nodejs](https://github.com/Fubo-Group/docs/raw/main/images/mqtt-will-nodejs.png)](https://github.com/Fubo-Group/docs/blob/main/images/mqtt-will-nodejs.png)

### &#x20;設定例

接続オプションは次のようになります

```javascript
let r = Math.floor(Math.random() * 10000);
var options={
	clientId:"mqttjs-will-"+r,
	port:1883,
    will:{topic:"connected",payload:"offline"}
}
```

### &#x20;MQTT v5 プロパティ

MQTTv5を使用する際には、接続を制御するためにブローカーに追加情報を送信できます。

トピックエイリアスの数を制限したり、クライアントに送信されるメッセージのサイズを制限するなどが可能です。利用可能なオプションはすべてドキュメントに記載されています。

使用方法は以下の通りです：

```javascript
let r = Math.floor(Math.random() * 10000);
var options={
    protocolVersion:5,
	clientId:"mqttjs-"+r,
	properties:{maximumPacketSize:1000}

    }
```

## &#x20;SSLを使用して接続する

SSLを使用して接続するには、CA 証明書が必要です。証明書に不慣れな場合は、「Mosquitto MQTT Broker SSL 設定を自分の証明書を使用して行う方法」を参照してください。

ファイルからCA 証明書を読み取る必要があるため、次のように始めます

```javascript
const fs = require('fs');
var caFile = fs.readFileSync("certs/ca-pi2.crt");
```

接続オプションについては、以下のようなものを使用します：

```javascript
var options ={
  clientId: 'ssl-test',
  port: 8883,
  //rejectUnauthorized: false,
  ca: caFile
};
```

証明書の一般名とTCP/IP 接続でブローカーにアクセスする際に使用される名前が一致しない場合に、 `rejectUnauthorized` オプションはトラブルシューティングに役立ちます。

つまり、証明書にドメイン名を使用していますが、IPアドレスを使用して接続しています。

SSL、ws、およびwssは異なるポートを使用するため、ポートにも注意してください。

接続コールは次のようになります：

```javascript
var client = mqtt.connect("mqtts://pi2.home", options);
```

### &#x20;ウェブソケット接続

ウェブソケットを使用して接続するには：

```javascript
var client = mqtt.connect("ws://pi2.home", options);
```

SSL 上でのWebsocketsには、私たちは使用します。

```javascript
var client = mqtt.connect("wsss://pi2.home", options);
```

証明書の設定は、以前に示されたmqttsと同じです。

### 複数のブローカーへの接続

接続ごとにクライアントを作成する必要があります。以下のコードがこれを示しています：

```javascript
var topic="testtopic";
//options for first connection
let r = Math.floor(Math.random() * 10000);
var options1={
	clientId:"mqttjs-"+r,
	port:1883}

//options for seconds connection
r = Math.floor(Math.random() * 10000);
var options2={
	clientId:"mqttjs-"+r,
	port:1884}

//now we can connect
var client  = mqtt.connect("mqtt://192.168.1.23",options1);
var client2  = mqtt.connect("mqtt://192.168.1.23",options2);
You should note that you will also need callback functions for each client.
```

&#x20;原文: 訳文:

`mqtt.Client(streamBuilder, options)` オプションを使用して新しいクライアントを作成することは可能であるはずですが、動作させることができず、インターネット上で例も見つけることができませんでした。これは私が引き続き試みることです。さらに、connect コールを使用して新しいクライアントを作成することは可能ですが、ブローカーには接続しないでください。ドキュメントには次のように記載されています：

> manualConnect：コンストラクタがconnectを呼び出すのを防ぎます。この場合、mqtt.connectが呼び出された後、client.connectを手動で呼び出す必要があります。

この機能を動かすことができず、クライアントコード内でそのオプションを見つけることもできませんでした。再度、さらに調査が必要です。

## 一般的な質問と回答

**Q1: クライアントは複数のブローカーに接続できますか？**

* A1: 各接続に対して新しいクライアントを作成する必要があります。

**Q2：クライアントは公開と購読ができますか？**

* &#x20;はい

**Q3：接続が失敗した場合、クライアントは自動的に再接続しますか？**

* A3: はい、それがデフォルトの動作です。

**Q4: NQTTv5のプロパティを使用していますが、うまく機能していないようですか？**

* 接続パケットでプロトコルバージョンの設定を忘れている可能性があります。

**Q5：私のクライアントは接続と切断を繰り返していますが、その理由は何ですか？**

* A5: あなたは他のクライアントと同じclientIdを使用している可能性があります。これはテスト時に多くのテストスクリプトがclientIdをハードコードするため、よく発生します。


---

# 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/mqttburknisuru.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.
