【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで

# はじめに
非同期の双方向通信を使いたくて探していたらMQTTというものを見つけました。
Python, Javaで実装してみたのでそれぞれ記事を分けて紹介します。
1. 【MQTT】コマンドベースでMQTTの導入(本記事)
2. [【MQTT/Python】MQTTのPub/Subをするクラスを実装した](https://qiita.com/koichi_baseball/items/98c2723d37fa2c53563f)(次回)
3. [【MQTT/Java】MQTTのPub/Subをするクラスを実装した](https://qiita.com/koichi_baseball/items/c5b982d2afdd4f6f0887)(次々回)

# 動作環境
 - Windows 10
 - Linux
   + Ubuntu 18.04 LTS
   + Rasbian buster

# MQTT概要
ブローカーを経由してPublish，Subscribeしてデータのやり取りをする通信方法です。
ロボット用のソフトウェアであるROSと同じPub/Subの通信型ですね。(ROS2ではなくROS1の方です)
トピック名とブローカーのホスト名を指定して通信を行います。

このような図が説明としてよく用いられます。ブローカーを通じて双方向通信、一対多の通信ができることがわかります。
>![](https://i.imgur.com/mRf9HTK.png)
出典元：https://qiita.com/shohei1913/items/b355ad7d1bb27141176b

細かい説明は下記サイトなど参考にしてください。
[ロボットエンジニアのためのMQTT (Message Queue Telemetry Transport) 入門](https://myenigma.hatenablog.com/entry/2019/10/27/194549) 
[MQTTライブラリ Paho Python を理解しようとしてみる](https://www.sunbit.co.jp/blog/2019/11/21802/)
[JavaでMQTT入門　ローカル環境でPubSubの動作を検証してみる](https://qiita.com/shohei1913/items/b355ad7d1bb27141176b)

# 必要ソフトのインストール

## mosquitto(MQTTブローカー/クライアント)のインストール
まずはmosquittoと呼ばれるものをインストールしましょう。
Windowsの場合はインストーラーから、Linuxの場合はコマンドでインストールできます。

### 1. windowsの場合

以下のサイトの、「Binary Installation」⇒「Windows」のところから自身の環境に合わせてインストーラーをダウンロードしてください。
https://mosquitto.org/download/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/bc867f81-00db-ec10-a18b-2c3c8cf51c52.png)
(2022/11/19時点、2.0.15が最新のようです)


### 2. Linuxの場合
以下の2つのコマンドを実行してください。

```shell
# Mosquitto(Broker)をインストール
$ sudo apt-get install mosquitto

# Mosquittoクライアントをインストール
$ sudo apt-get install mosquitto-clients
```

## クライアントライブラリのインストール
次回以降に使うPythonとJavaのクライアントライブラリのインストール方法も記載しておきます。
### Python
ライブラリpahoのインストール

```shell
$ pip install paho-mqtt
```

### Java
jarファイルを使用しました。
以下のリンクから**org.eclipse.paho.client.mqttv3_1.2.3.jar**をダウンロードしてください。
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.client.mqttv3/


## 起動
### ① broker(mosquitto)の起動
#### 1. windowsの場合  
コマンドプロンプト等を開いて、mosquittoがインストールされたディレクトリに移動します。
※環境変数に追加しておけばディレクトリの移動は必要ないです。

```shell
$ cd C:\Program Files (x86)\mosquitto
```

その後，、`-v`オプションをつけて起動します。

```shell
$ mosquitto -v
```

ポートが使用中などのエラーが出る際はwindowsのサービスとして既に起動している可能性があります。アプリの検索で「サービス」と検索して一覧から 「Mosquitto Broker」を探してください。以下のように実行中となっていれば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/4cfb7054-128d-b975-4925-be66d8b80dc8.png)

ない場合はファイアウォール設定から1883ポートの設定を見直してください。
再起動後は上記のサービスに登録され、手動でmosquittoを起動することが不要な場合があります。

#### 2. Linuxの場合  
ブローカーの開始と確認、停止は以下のコマンドで行います。

```shell
# システムの起動
$ sudo systemctl start mosquitto
# システムの状態確認
$ sudo systemctl status mosquitto
# システムの終了
$ sudo systemctl stop mosquitto
```

### ② Publisher，Subscriberの起動
ここでは、ホスト名は localhost、トピック名はtestとします。
トピック名は自由ですが、送受信したい PublisherとSubscriberで合わせてください。

オプションの `-h`でホスト名、`-t`でトピック名を指定します。Publisherの場合、送信メッセージは`-m`で指定します。

※Windowsの場合はインストール先のディレクトリに移動するか、環境変数にインストール先のディレクトリを追加してください。
インストール先のディレクトリ：`C:\Program Files (x86)\mosquitto`(環境によります)

```shell:Subscriberの起動
# WindowsもLinux も同じコマンド
$ mosquitto_sub -h localhost -t test
```
次に，新しいコマンド画面を立ち上げて、

```shell:Publisherの起動
# WindowsもLinux も同じコマンド
$ mosquitto_pub -h localhost -t test -m "test message"
```

publishするときに指定したメッセージ内容(test message)がSubsciberの画面に出てくれば成功です。
今回は同一のPC内でしたが、brokerはホスト名を指定すればよいので外部のPCにつなぐこともできます。

# おわりに
MQTTの導入を行いました。
次からは実際のプログラムで使っていこうと思います！
⇒[Python](https://qiita.com/koichi_baseball/items/98c2723d37fa2c53563f)の例、[Java](https://qiita.com/koichi_baseball/items/c5b982d2afdd4f6f0887)の例です。