myThingsをはじめよう - Part3: MQTTブローカーを使う


[Mesublu](http://meshblu.octoblu.com/)は複数のトランポートプロトコルに対応しています。HTTP POSTしたメッセージをMQTTでsubscribeして受信することもできます。[”Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする”で構築したサーバ](http://qiita.com/masato/items/f9be4a15216fe29de7fb)をブローカーとして、メッセージングとデータ保存のテストをしてみます。

## MQTTブローカーを使ったメッセージング

MQTTの基本的なメッセージングをテストします。trigger-1とaction-1のuuidを使います。

* メッセージ送信: trigger-1
* メッセージ受信: action-1

![スクリーンショット 2015-09-09 14.15.21.png](https://qiita-image-store.s3.amazonaws.com/0/51786/dab02194-8d40-c084-59a0-daff0c316063.png)

MQTTをpublish,subscribeするためのclientとして、mosquitto-clientsのインストールされたホストを準備し、[MQTTブローカー](http://qiita.com/masato/items/f9be4a15216fe29de7fb)と通信させます。

### MQTTクライアントのインストール
MQTTでのメッセージを送信（publish）,受信(subscribe)をするためにクライアントとして、mosquitto-clientsをインストールします。今回は便宜上、送受信のクライアントとブローカーを同じホスト上で構築します。

```bash
$ apt-get install mosquitto-clients
```

### action-1でMQTT subscribe

action-1のuuidを使いメッセージを送信します。「IDCF」チャンネルをインストールしたディレクトリに移動して、コマンドラインツールからtokenとuuidを確認します。

```bash
$ cd ~/iot_apps/meshblu-compose
$ docker-compose run --rm iotutil show -- -k action-1

> iotutil@0.0.1 start /app
> node app.js "show" "-k" "action-1"

┌──────────┬──────────┬──────────────────────────────────────┐
│ keyword  │ token    │ uuid                                 │
├──────────┼──────────┼──────────────────────────────────────┤
│ action-1 │ 8a83d71f │ b61d3398-ac99-4694-9dc4-dd632faf6f6a │
└──────────┴──────────┴──────────────────────────────────────┘
```

action-1からMQTTのメッセージをsubscribeします。[Meshblu](http://meshblu.octoblu.com/)ではsubscribeするトピック名は、メッセージを受信するデバイスのuuidになります。この例ではaction-1のuuidになります。またusernameとpasswordも必須項目です。それぞれデバイスのuuidとtokenを指定します。



* ホスト: 「IDCF」チャンネルのIPアドレス
* ポート: 1883
* 
**トピック: action-1のuuid**
* username: action-1のuuid
* password: action-1のtoken


```bash
$ mosquitto_sub \
    -h 210.140.162.58  \
    -p 1883  \
    -t b61d3398-ac99-4694-9dc4-dd632faf6f6a  \
    -u b61d3398-ac99-4694-9dc4-dd632faf6f6a  \
    -P 8a83d71f \
    -d
```

出力結果

```bash
Received CONNACK
Received SUBACK
Subscribed (mid: 1): 0
```

上記のとおり出力され、該当のメッセージがpublishされるのを待つ状態になります。
作業を続けるため、**新しいシェル**を開きます。


### trigger-1からMQTT publish message

trigger-1のuuidを使いメッセージを送信します。tokenとuuidを確認します。

```bash
$ docker-compose run --rm iotutil show -- -k trigger-1

> iotutil@0.0.1 start /app
> node app.js "show" "-k" "trigger-1"

┌───────────┬──────────┬──────────────────────────────────────┐
│ keyword   │ token    │ uuid                                 │
├───────────┼──────────┼──────────────────────────────────────┤
│ trigger-1 │ d286ba8d │ ffa6934d-f1b3-467f-98b3-766b330d436d │
└───────────┴──────────┴──────────────────────────────────────┘
```

Meshbluにメッセージを送信する場合は以下の仕様になります。

* 
**トピック名: message**
* 送信先uuid: メッセージのdevicesキーの値
* メッセージ本文: メッセージのpayloadキーの値(JSON、文字列)

mosquitto_pubコマンドを使ってpublishします。

```bash
$ mosquitto_pub \
  -h 210.140.162.58  \
  -p 1883 \
  -t message \
  -m '{"devices": ["b61d3398-ac99-4694-9dc4-dd632faf6f6a"], "payload": {"led":"on"}}' \
  -u ffa6934d-f1b3-467f-98b3-766b330d436d \
  -P d286ba8d \
  -d
```

出力結果

```bash
Received CONNACK
Sending PUBLISH (d0, q0, r0, m1, 'message', ... (78 bytes))
```

mosquitto_subコマンドを実行しているもう一つのシェルにメッセージが届きます。

```bash
{"data":{"led":"on"}}
```

### trigger-1からHTTP POST /messages

MQTT subscriberにHTTP POSTからメッセージを送信することもできます。trigger-1のuuidとtokenは認証情報としてHTTPヘッダに記述します。

* URL: /messages
* Content-Type: application/json
* meshblu_auth_uuid: trigger-1のuuid
* meshblu_auth_token: trigger-1のtoken

先ほどのmosquitto_subコマンドが起動している状態で新しいシェルを開きます。curlでメッセージをPOSTします。

```bash
$ curl -X POST \
  http://210.140.162.58/messages \
  -H "Content-Type: application/json" \
  -d '{"devices": "4dbe71d3-ad32-45e5-99fc-88c225bf11b8", "payload": {"led":"off"}}' \
  --header "meshblu_auth_uuid: ffa6934d-f1b3-467f-98b3-766b330d436d"  \
  --header "meshblu_auth_token: d286ba8d"
```

出力結果

```bash
{"devices":"4dbe71d3-ad32-45e5-99fc-88c225bf11b8","payload":{"led":"off"}}
```

mosquitto_subコマンドを実行しているシェルにメッセージが届きます。

```bash
{"data":{"led":"on"}}
```