# MQTTメッセージの公開

このチュートリアルでは、node.js MQTTクライアントを使用してメッセージを公開する方法について説明します。

MQTTでメッセージを公開するときは、指定する必要があります

* &#x20;トピック
* &#x20;メッセージ
* &#x20;保持
* QOS (0,1,2)
* &#x20;プロパティ (MQTT v5)

QOSに応じて、公開されたメッセージはブローカーからの確認を受け取ります（QOS=1,2）。

すべてのMQTTクライアントには、通常、保持、QoS、プロパティのデフォルトがあります。それらは通常、 `0` 、 `false` 、 `null` です。

QOS 1または2で公開する場合、メッセージにはmessageIdが割り当てられ、PubAckのmessageIdと組み合わせてブローカーにメッセージが受信されたかどうかを判断することができます。

送信メッセージのmessageIdが受信したPubAckメッセージのmessageIdと一致する場合、メッセージは正常に受信されたことになります。以下にmessageIdが `7844` の例を示します：

&#x20;nodejs-mqtt-パブリッシュ

## &#x20;MQTT パブリッシュ API

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

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

オプションとコールバックパラメータは任意です。

オプションにはメッセージを保持するフラグ、QoSなどが含まれます。例えば

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

&#x20;翻訳テキスト：そしてオプションと共に：

```javascript
var options={
retain:true,
qos:1};
client.publish("testtopic", "test message",options)
```

コールバックは次の用途に使用できます：

* &#x20;成功のためのテスト
* 公開されたメッセージIDをキャプチャします。

## &#x20;イベント

パブアックをキャプチャするには、packetreceiveイベントをリッスンする必要があります。

## &#x20;タイミング

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

例えばそのプロセス

1. &#x20;接続する
2. &#x20;公開

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

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

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

接続が確立されるかどうかを公開する前にテストできます:

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

> しかし、接続が非同期であるため、クライアントが接続される前にif 文が試される可能性が高いため、これもうまくいく可能性は低いです。

したがって、単に接続して、公開して、切断する場合は、on\_connectコールバックでpublishを呼び出すべきです。

この方法なら、公開する前に接続されていることがわかります。

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

定期的に公開する必要がある場合（例えば、ステータス情報を送信するときなど）は、以下に示すようにsetInterval 関数を使用してください。

```javascript
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;メッセージペイロード

文字列、JSONデータ、バッファを送信できます。

```
msg=string
msg=JSON string
msg=buffer
```

整数または浮動小数点数を送信するには、まず以下のいずれかを使用して文字列に変換する必要があります：

&#x20;ソーステキスト: `JSON.stringify(value)` または `value.toString()` ; 翻訳テキスト:

例えば、数値（浮動小数点）2.31を使用することができます：

```javascript
 let n=2.32;
 msg=JSON.stringify(n);
```

&#x20;そして

```javascript
 let n=2.32;
 msg=n.toString();
```

ブール値 true/false を送信するには、JSON データに変換して使用します。

```javascript
let msg=JSON.stringify(true);
```

バッファの使用にはBufferモジュールを使用してください

```javascript
  msg = Buffer.from('abce');
  console.log("type="+ typeof msg);
```

そして通常通りに公開します。

## 公開コールバックの使用

公開メソッドを呼び出す際には、公開が完了したときに呼び出されるコールバックを送信することができます。

完了とは、確認プロセスが完了していることを意味します（QOSが1または2）

私が使用しているコードは以下の通りです

```
client.publish(topic,msg,options,puback);
```

以下の例で定義するコールバック関数がpubackです

```javascript
function puback(error,response)
{
	console.log("in puback");
	console.log("callback packet =" +JSON.stringify(response));
    if (error) {
      console.error(error)
}
```

テストメッセージを公開すると、次の出力が生成されます：

```javascript
//in puback
callback packet ={"cmd":"publish","topic":"testtopic","payload":"test message","qos":1,"retain":false,"messageId":64009,"dup":false}
```

送信されているパケットは、公開者が送信しているパケットです。

確認を表示するために、パケット受信イベントを監視します。

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

この結果、次の出力が得られます： 翻訳テキスト：

```javascript
receive packet  {"cmd":"puback","retain":false,"qos":0,"dup":false,"length":2,"topic":null,"payload":null,"messageId":64009}
```

## トピックエイリアスを使用した出版

MQTTv5はトピックエイリアスに対応しています。トピックエイリアスの背後にある考え方は、より短いトピックを使用して公開パケットのサイズを削減することです。

トピックエイリアスを使用するには、まずパブリッシュを使用してエイリアスを設定し、その後トピックエイリアスと空のトピックフィールドを使用してパブリッシュできます。

ソーステキスト：ここにコードがあります： 翻訳テキスト：

```javascript
//first published message asigns the topic alias of 1 to the topic //testtopic

var topic="testtopic";
	options.properties={topicAlias:1};
and subsequent messages set the topic to “” and use the topic alias.

//first published message asigns the topic alias of 1 to the topic //testtopic

var topic="";
	options.properties={topicAlias:1};
```

> 注意：メッセージを受信するには、トピックエイリアスではなくトピック(testtopic)を購読する必要があります。

クライアント接続にのみ有効なトピックエイリアスについても注意する必要があります。他のクライアントは自分のトピックエイリアスを設定できます。

さらに、サーバーは通常トピックエイリアスを制限します（デフォルト=10） トピックエイリアス0は許可されていません。

## &#x20;公開例

### QoS=1 および保持フラグを設定してメッセージを公開します

```javascript
if (client.connected == true){
var options={
		retain:true,
		qos:1};
		
msg="test message string";
console.log("publishing",msg);
client.publish(topic,msg,options);
}
```

### QOS=1でJSONメッセージを公開します

```javascript
if (client.connected == true){
	
var options={
		qos:1};

let data={volts:240,current:1.2};
msg =JSON.stringify(data);
console.log("publishing",msg);
client.publish(topic,msg,options);
}
```

メッセージをmessageExpiryInterval 設定で公開する

```javascript
if (client.connected == true){
	
var options={
		qos:1,
	properties:
{
	messageExpiryInterval:120
}
};

let data={volts:240,current:1.2};
msg =JSON.stringify(data);
console.log("publishing",msg);
client.publish(topic,msg,options);
}
```

注意：これを機能させるためには、クライアント接続をバージョン5に設定する必要があります

```javascript
let r = Math.floor(Math.random() * 10000);
var options={
	clientId:"mqttjs-"+r,
	protocolVersion:5,
	port:1883
}
let broker="mqtt://192.168.1.23";
var client  = mqtt.connect(broker,options);
```


---

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