# MQTTメッセージの購読

トピックに関するメッセージを受信するには、そのトピックまたは複数のトピックを購読する必要があります。

トピックを購読するには、Paho MQTTクライアントクラスのsubscribeメソッドを使用します。

上の図に示されているように、サブスクライブメッセージはSubAckメッセージによって確認されます。

購読するには提供する必要があります

1. QOS -0,1,2
2. &#x20;トピックまたはトピック

あなたは一つの関数呼び出しで複数のトピックを購読できることに注意してください。

MQTT v5を使用する際には、サブスクライブプロパティも送信できます。

再び、publishメッセージと同様に、SubAckメッセージを受け取るためにはpacketreceiveイベントをリッスンする必要があります。

## &#x20;購読 API

まずクライアントオブジェクトを作成し、次に以下のようにsubscribeメソッドを呼び出します：

```
client.subscribe(topic/topic array/topic object, [options], [callback])
```

単一のトピックとトピックの配列、そしてトピックオブジェクトを渡すことができます。

&#x20;選択肢は次のとおりです

1. QOS -0,1,2
2. &#x20;トピックまたはトピックス
3. ローカルなし - MQTT v5
4. 公開時のまま保持 - MQTT v5
5. 取り扱い維持 - MQTT v5
6. &#x20;プロパティ - MQTT v5

コールバック関数は以下の形式をしています：

&#x20;**関数 (err, granted)**

&#x20;どこで：

* サブスクリプションエラー、またはクライアントが切断する際に発生するエラー
* 付与されるのは{topic, qos}の配列です
* トピックは購読されたトピックです
* qosはそれに与えられたQoSレベルです

## &#x20;イベント

サブアックをキャプチャするには、以下に示すようにpacketreceiveイベントをリッスンする必要があります

```javascript
client.on("packetreceive",function(packet){	
	console.log("receive packet  "+ JSON.stringify(packet));
	
	})
```

これが私たちが見るものです：

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

## &#x20;タイミング

ノード.jsは非同期関数を使用しているため、タイミングに注意する必要があります。

例えばそのプロセス

1. &#x20;接続する
2. &#x20;登録する

接続が完了する前に購読が行われるため、機能しない可能性があります。他の言語では、次のように接続が完了するのを単に待ちます:

1. &#x20;接続する
2. &#x20;接続を待つ
3. &#x20;公開

しかし、Node.jsではこれを行うことはできません。

接続が確立されるかテストしてから購読する場合：

```javascript
if (client.connected==true){
client.subscribe("testtopic",options)
}
```

> その場合、ほぼ確実に機能していないでしょう。接続が確立されていない可能性が高いです。

したがって、ほとんど常にon\_connectコールバックでサブスクライブします。

この方法なら、購読する前に接続されていることがわかり、接続が切れた場合は購読が更新されます。

```javascript
client.on("connect",function(){	
    console.log("connected  "+ client.connected);
    let topic="test_topic";
    let options={qos:1};
    client.subscribe(topic,options);
	
	})
```

## &#x20;購読例

### シングルトピックに登録する

```javascript
var topic="testtopic";
var message="test message";
console.log("subscribing to topics");
client.subscribe(topic,{qos:1}); //single topic
```

### 複数のトピックを購読する

この場合、彼らはすべて同じQOSを使用します。

```javascript
var topics=["testtopic","testtopic2"];
var message="test message";
console.log("subscribing to topics");
client.subscribe(topics,{qos:1}); //single topic
```

### トピックオブジェクトを使用して複数のトピックに登録する

この場合、使用されるQOSレベルはトピックオブジェクトにある0です。オプションで設定されたQOSは無視されます。

```javascript
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に公開されたメッセージが送信されます

```javascript
var topic="testtopic";
console.log("subscribing to topics");
let subOptions={qos:0,properties:{subscriptionIdentifier:1}}
client.subscribe(topic,subOptions); //single topic
```

これがクライアントが受け取るものです。ペイロードの最後にサブスクリプション識別子があることに注意してください。

```javascript
// 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}}
```

\ <br>


---

# 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/mqttmessjino-1.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.
