1.mosquittoとは
IoTの勉強をする上で外せないのが、MQTTプロトコルです。今回はMQTTブローカー実装の一つである、mosquittoを使ってみたいと思います。
mosquittoとはEclipse Foundationが開発・管理するOSSのMQTTブローカー実装です。公式よりdockerイメージが配布されているため、それを使ってみたいと思います。
今回の環境の構成です。送信用のパブリッシャと受信用サブスクライバは別コンテナで立ち上げて実験します。mqttクライアントはmosquitto-clientsを使用して手軽に疎通確認をしてみます。
2.環境構築
2-1. 公式mosquittoコンテナイメージをpullする
$ docker pull eclipse-mosquitto
2-2. mosquitto.confの設定
brokerの最小限の設定を記述しておきます。ローカルに以下の内容のmosquitto.confファイルを作成します。Port番号はデフォルトの1883を指定しておきます。
allow_anonymous true
listener 1883
2-3. mosquittoコンテナ起動
ローカルのmosquitto.confをコンテナ内の/mosquitto/config/mosquitto.confに配置するようにデーモンで起動します。
$ docker run -d -v “/home/user/mosquitto.conf:/mosquitto/config/mosquitto.conf” –name “mqtt-broker” –hostname=”broker” eclipse-mosquitto
試しにコンテナに入ってみます。
$ docker exec -it mqtt-broker /bin/bash
プロセスを確認します。/usr/sbin/mosquittoがmosquitto.confを読んで起動しています。
/ # ps -a
PID USER TIME COMMAND
1 mosquitt 0:00 /usr/sbin/mosquitto -c /mosquitto/config/mosquitto.conf
11 root 0:00 /bin/sh
22 root 0:00 ps -a
/ #
ブローカのIPアドレスを確認します。
/ # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
32: eth0@if33: mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
2-4. pub/subコンテナの作成
パプリッシャとサブスクライバコンテナをUbuntuベースイメージから立ち上げます。私はユーザ作成済みDockerfileからビルドします。Dockerfileは最後にあります。
$ docker image build ./ -t ub2204/sample
ターミナルを2つ立ち上げ、2つのコンテナ起動します。共有フォルダを作って実験しやすくします。
$ docker run -v “/home/user/work/:/home/share” –name “mqtt-pub” -it “ub2204/sample” /bin/bash
$ docker run -v “/home/user/work/:/home/share” –name “mqtt-sub” -it “ub2204/sample” /bin/bash
パプリッシャとサブスクライバコンテナ両方にmosquittoのクライアントをインストールします。
$ sudo apt install mosquitto-clients
3.疎通確認
パブリッシャからデータを送信してサブスクライバで受け取れるか確認します。
3-1. サブスクライバの受信準備
トピック名は”topic1″とします。トピックは配信チャネル名のようなものです。コマンドを実行すると受信待ちに入ります。
(mqtt-subコンテナ)$ mosquitto_sub -h <ブローカコンテナのIPアドレス> -t topic1
3-2. パブリッシャ送信
topic1に”Hello”の文字列を送信してみます。
(mqtt-pubコンテナ)$ mosquitto_pub -h <ブローカコンテナのIPアドレス> -t topic1 -m “Hello”
サブスクライバに文字列が表示されました。
user@0d9a995f5909:~$ mosquitto_sub -h 172.17.0.2 -t topic1
Hello
4.参考
今回使用したDockerfileです。