MQTTブローカーのセットアップ

#はじめに
このページは，

[ドローン操作システムを作ろう](https://qiita.com/hsgucci/items/86eedb5555b4234ee0e7)

の１ページです．
全体を見たい場合は上記ページへお戻りください．

#概要

ここでは，Ardupilot系ドローンの遠隔操作の手段として，MQTTを利用します．
MQTTについての詳細は他サイトに任せますが，
簡単に言うと近年流行している**IoT**でよく使われているプロトコルです．

MQTTを選んだ理由は，

・PythonのMQTTライブラリがある．
・Pythonの辞書型，JSONライブリと相性が良い．
・JavaScriptのMQTTライブラリがある
・JavaScriptの連想型，JSONライブラリと相性が良い．

**<font color="blue">入口</font>**と**<font color="red">出口</font>**，
すなわち，**<font color="blue">ドローン側のPython</font>**と，**<font color="red">操縦者のWebブラウザ(JavaScript)</font>**
との連絡性(簡単に通信プログラムがかけること)が良かったので採用しました．

#準備するもの

**今回はdronekit-sitlのために準備したUbuntu Linuxの入ったＰＣを利用します．**
つまり，ローカルエリアだけの通信になります．

最終的には，インターネットに直結したLinuxサーバ(VPS，クラウド，自宅サーバでポート開放)を用意します．

#MQTTの概略
MQTTでは，MQTTブローカーと呼ばれるサーバーを介してメッセージをやり取りします．
通信の方向は一方通行で，送信者であるpublisherと，受信者であるsubscriberが存在します(下図)．
![mqtt1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/901830ce-8ee9-28ca-6951-468ac65c0b39.png)

したがって，もしも1台のドローンが，
自分の情報を送信しつつ地上からのコマンドを受信したい場合には，
pulisherとsubscriberの両方になる必要があります(下図)．
![mqtt2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/79248c26-eff2-0871-2773-081c2c66124e.png)

複数のpublisherやsubscriberがいる場合には，
**トピック**という，メッセージに付属したタイトルの様な文字列を使って，
自分の欲しいトピックを探します(下図)．
![mqtt3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/4d81f67f-6c80-6049-e20e-7a0b474d08f3.png)
上の図では，ドローンAが`Info1`というトピック名のメッセージを投げました．
しかし，ドローンBが欲しいのは`Control2`というトピックなので，`Info1`は受け取りません．
`Info1`を欲しがっているのはコンピュータAなので，そちらにメッセージが流れます．
ドローンBの欲しい`Control2`は，コンピュータBが送信してくれました．

ブローカーは名前の通り仲買人で，
売りたい人(publisher)からデータを受け取り，買いたい人(subscriber)にを渡すのが仕事なのです．

#MQTTブローカーの選定

MQTTのブローカーには様々な種類があります．

- mosquitto
- RabbitMQ
- ActiveMQ
- VerneMQ
- Ponte

などなど

特別な処理エンジンを入れたり，Node.jsが必要だったりするブローカーは初心者には大変なので，
今回はシンプルに，最もインストールのしやすいmosquittoを使います．

このサイト[^1]を参考にしました．
**Raspberry Pi で mosquitto を使う**
https://qiita.com/ekzemplaro/items/ab90dd630c3ad8e819ab

デバッグモードのコマンド`-d`は使いません．

[^1]: Raspberry Pi で mosquitto を使う　https://qiita.com/ekzemplaro/items/ab90dd630c3ad8e819ab

#ブローカーのインストール

更新があるといけないので，一応updateしておきましょう．

```bash
$sudo apt update
```

Mosquittoのインストールはaptで一発です．

```bash
$sudo apt install mosquitto
```

#コマンドラインツールのインストール

ついでに，コマンドラインでMQTT通信を試せるツールもインストールしておきます．

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

#コマンドラインでのテスト

先程インストールしたmosquitto-clientsを使用してテストします．

Sub側とPub側の２つのターミナル(端末)が必要ですので，開いておきます．
(SubscribeとかPublishとか長いので，Sub/Pubと短く書きます)

##Subscriber(購読者)の起動

次のコマンドを打って，Sub側を待機させておきます．

```bash
$mosquitto_sub -h localhost -t drone/001
```

接続先のMQTTブローカーは自分自身(localhost，127.0.0.1)のＰＣです．
Subscribeするトピック名は`drone/001`としました．
同トピック名を持つメッセージを誰かが投げると，勝手に受信してくれます．

##Publisher(配信者)の起動

次のコマンドを打って，1回だけPubします．

```bash
mosquitto_pub -h localhost -t drone/001 -m "Hello Drone!"
```

こちらもMQTTブローカーは自分自身です．
トピック名を`drone/001`として，同じにしないと届きません．
メッセージの中身は文字列で`Hello Drone!`としました．


##実行結果

mosquitto_sub側の端末に，`Hello Drone!`の文字が表示されます．

```bash:mosquitto_sub側の端末
$mosquitto_sub -h localhost -t drone/001
Hello Drone!
```
mosquitto_pub側を何度も実行すれば，`Hello Drone!`がたくさん表示されます．

また，mosquitto_pub側のトピック名を`drone/002`などの別の名前に変えて実行してみてください．
sub側には届かないことが分かります．

#おわりに

今回はMQTTのブローカーをセットアップし，コマンドラインで通信テストを行いました．
しかし，前もって用意されたコマンドを使っても，イマイチよくわかりませんね．

次回はPythonのプログラムで通信をしてみようと思います．