Beebotte の REST API と MQTT の組み合わせを公式情報を見つつ試す（curl と Node.js）【2022年4月版】

過去に、以下の記事でも扱った [Beebotte](https://beebotte.com/) で、REST API と MQTT を組み合わせて使う話です。

- [MQTTブローカーとしても使える Beebotte で MQTT.js を使った Pub/Sub（Node.js で実装）【2022年4月版】 - Qiita](https://qiita.com/youtoy/items/e2539558b67e708b905d)
- [Beebotte のダッシュボードで M5StickC から送った数値をグラフ化する（UIFlow ＋ MQTT でデータ送信） - Qiita](https://qiita.com/youtoy/items/b65ddfc89a03117a0ee3)

## 通信方法に関するドキュメントを見てみる
### Beebotte の MQTT
MQTT を使う話は、冒頭でも掲載していた[過去記事](https://qiita.com/youtoy/items/e2539558b67e708b905d)をご参照ください。

### Beebotte の REST API
Beebotte の　REST API について、まずは公式ページの情報を見ていきます。
[公式ドキュメント](https://beebotte.com/overview)を見ていくと「[Data Operations の Publishing Data という項目](https://beebotte.com/docs/publish)」に情報が書いてありそうでした。

#### curlコマンドを使うやり方
以下は「Server side Publish (REST API)」と「Server side Bulk publish (REST API)」というそれぞれの項目で、cURL を選んだ場合の表示です。
![Server side： curl](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/cb315150-80c2-de27-465e-4008820a75e3.png)

プライベートなチャンネルにデータをパブリッシュする場合、以下のコマンドになるようです。

```bash
## Publish to private channel
curl -i -H "Content-Type: application/json" \
  -H "X-Auth-Token: YOUR_CHANNEL_TOKEN" \
  -X POST -d '{"data":"Hello World"}' \
  http://api.beebotte.com/v1/data/publish/private-dev/res1
```

この後で詳しく触れますが、最後の行の「publish」の後の部分で「`private-`」がついているのがポイントのようです。

#### Node.js を使ったやり方
以下は「Server side Publish (REST API)」と「Server side Bulk publish (REST API)」というそれぞれの項目で、Node.js を選んだ場合の表示です。公式のライブラリを使ったやり方が掲載されているようです。
![Server side： Node.js](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/00017a65-9439-28c2-be14-82bb4c5250a9.png)

## 実際に通信をさせてみる
それでは、REST API と MQTT を組み合わせた通信を試してみます。なお、以下では Beebotte公式のライブラリは利用せずに進めていきます。

### channel の準備
そのために、[冒頭で掲載していた過去記事](https://qiita.com/youtoy/items/e2539558b67e708b905d)で書いていた、MQTT を利用するための準備を行ってください。準備を終えると、MQTT での通信を行うための情報として、以下がそろうと思います。

- MQTT の接続先： mqtt://mqtt.beebotte.com
- MQTT用のポート番号（SSL の利用なし）： 1883
- 認証方法： Channel token
   - 「user name: 【Channel token】、 password： 【（空）】」、または、「user name・password: 【Channel token】」を設定
- MQTT のトピック
   - 【channel/resource】

この情報と、上で見ていった REST API の情報を組み合わせて、通信を行ってみます。

### curl を用いたお試し
curl を使って REST API でのパブリッシュを行い、サブスクライブを Node.js のプログラムで行います。

サブスクライブ側は、過去の記事でも用いた以下のプログラムを用います。以下では、[MQTT.js](https://github.com/mqttjs) を使っているので、 `npm install mqtt` を実行して MQTT.js　を使えるようにしてください。

```javascript
const mqtt = require("mqtt");

const client = mqtt.connect("mqtt://mqtt.beebotte.com", {
  clientId: "javascript_sub",
  username: "【Channel token】",
  password: "",
});

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

  client.subscribe("【channel/resource】");
});

client.on("message", function (topic, message) {
  console.log(topic + ": " + message.toString());
});
```

【Channel token】 と 【channel/resource】 の部分は、ご自身で Beebotte から取得した情報に置きかえてください。

上記を nodeコマンドで実行した状態で、REST API を使ってみます。以下に 2種類のコマンドを掲載します。

```bash
curl -i -H "Content-Type: application/json" \
  -H "X-Auth-Token: 【Channel token】" \
  -X POST -d '{"data":"REST API より"}' \
  http://api.beebotte.com/v1/data/publish/【channel/resource】

curl -i -H "Content-Type: application/json" \
  -H "X-Auth-Token: 【Channel token】" \
  -X POST -d '{"data":"REST API より"}' \
  http://api.beebotte.com/v1/data/publish/【（名称の先頭に private- を付与した channel/resource】
```

上記の 2つの違いは最後の行の URLで、その中の「publish」の後ろの部分です。1つ目は 【channel/resource】 をそのまま記載していますが、2つ目のほうは channel の部分に `private-` を付与しています。仮に Beebotte上で `mychannel` というチャンネル名にしていた場合、2つ目のコマンドでは `private-mychannel` という書き方にします。

この対応を行うことで、パブリックでなくプライベートなメッセージになるようです。
![プライベートにする方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6ec0968a-8b97-167b-b3ba-45a67000a7e2.png)

上記の 2つのコマンドを順番に実行した後、サブスクライブ側の Node.js のプログラムの出力を見てみました。サブスクライブで受信できた JSON に関し、 `ispublic` の部分が true・false という異なる内容になっており、パブリック・プライベートの設定が反映されているのが分かります。
![サブスクライブ側](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1d13bf13-60a0-ab57-8efb-73a0ff064292.png)

### Node.js を用いたお試し
次は、パブリッシュ側も Node.js を使って試してみます。Beebotte公式のライブラリを使わず、REST API を使います。

上で出ていた curlコマンドの内容から、Node.js のプログラムで設定するべきパラメータを決めました。具体的には以下のプログラムになるのですが、[axios](https://github.com/axios/axios) を使っているので、 `npm install axios` を実行して axios　を使えるようにしておいてください。

```javascript
const axios = require("axios");

const sendPostRequest = async () => {
  try {
    const res = await axios({
      method: "post",
      url: "http://api.beebotte.com/v1/data/publish/【（名称の先頭に private- を付与した channel/resource】",
      headers: {
        "X-Auth-Token": "【Channel token】",
        "Content-Type": "application/json",
      },
      data: { data: "Node.js より" },
    });
    console.log(res.data);
  } catch (err) {
    console.error(err);
  }
};
sendPostRequest();
```

あとは、パブリッシュ・サブスクライブの両方のプログラムを、それぞれ nodeコマンドで実行します。この Node.js のプログラムを使ったお試しでも、REST API ⇒ MQTT の通信が行えることを確認できました。