MosquittoのPub/Subを試す
概要
Mosquittoを試してみたかったので、インストールと簡単なPub/Subを試してみました。
mosquittoのインストール
ここでは、Macの構築を想定しています。
brew install mosquitto
初期状態だと環境によってはmosquittoが受け付けないと思うので、/usr/local/sbin
ディレクトリがない場合は作成して、所有者を変更します
sudo mkdir -p /usr/local/sbin
sudo chown -R $(whoami) /usr/local/sbin
実行方法(常駐プロセスとして起動したい場合)
# デフォルトの設定ファイルは下記にあるので、適当に編集する
# /opt/homebrew/etc/mosquitto/mosquitto.conf
brew services start mosquitto
brew services stop mosquitto
実行方法(手動)
お手軽に実行するのであれば手動が良いと思います。こちらの実行方法だと、その場で設定ファイルを指定して動かしてみることが可能です。下記のようにバックグラウンドで実行しても良いですが、単純にmosquittoの後にCtrl + Cで止めても大丈夫です。
# バックグラウンド実行
mosquitto -c /path/to/your/mosquitto.conf &
# プロセスIDを確認
ps aux | grep mosquitto
# 停止
kill <PID>
ただし、上記の権限設定では適切なパスが紐づいてないので、mosquittoが認識しない可能性があります。which mosquitto
と打っても何も表示されない場合は、.zshrcか.bash_profileに下記を追加して source ~/.bash_profile
などのようにして反映してください。
export PATH="/usr/local/sbin:$PATH"
Pub/Subの通信をパスワード付きでやってみる
設定ファイルとパスワードの暗号化
まず、下記のような設定ファイルを用意します。
listener 1883
allow_anonymous false
password_file password.txt
persistence_location /mosquitto/data
log_type all
ここで、allow_anonymousをfalseにすることで、匿名接続ができず、パスワード認証が必要になります。
次に、mosquitto.confと同じ階層にpassword.txtを用意します。Username:Password
の構成で用意します。
chiikawa:usagi
momonga:yoroi
そして、パスワードを暗号化するためにmosquitto_passwd -U password.txt
を実行します。すると、暗号化された状態でpassword.txtが生成されます。
chiikawa:$7$101$I7QiRm4or4so9MPn$CCcxfTIm/uJ78JYdqqlcOt8+AXJBPPOH8LjAb1Y0Xr0swzM0EbI/BTu4LgVAQjHnCBSUY97wwjhWkrljVh2ZBQ==
momonga:$7$101$OqjEByEV6L5F8Nid$aCElEz+ffqGqv6FFlzgPa3SLEw+wlJvQXAaL6w1ovE51h3pysbdSFgG7JwECjDsHnJ0zCWNdC5rkHeXST+IHMA==
これで準備は完了です。
起動して通信
下記を実行してmosquittoを起動させます。
mosquitto -c /path/to/your/mosquitto.conf
別のターミナルを立ち上げて、Subscriberを起動します。これで、送信された内容を受信できるようになります。
$ mosquitto_sub -d -t hiyatoibaito \
-u chiikawa -P usagi \
--topic baito/tobatsu_1
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending SUBSCRIBE (Mid: 1, Topic: hiyatoibaito, QoS: 0, Options: 0x00)
Client null sending SUBSCRIBE (Mid: 1, Topic: baito/tobatsu_1, QoS: 0, Options: 0x00)
Client null received SUBACK
では、実際に送信してみましょう。
この条件はパスします。
$ mosquitto_pub -d -t hiyatoibaito -m "おっきな討伐成功!! Mar/22/2025 PM 18:15" \
-u chiikawa -P usagi \
--topic baito/tobatsu_1
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q0, r0, m1, 'baito/tobatsu_1', ... (51 bytes))
Client null sending DISCONNECT
# Subscriberでは下記が出力される
Client null received PUBLISH (d0, q0, r0, m0, 'baito/tobatsu_1', ... (51 bytes))
おっきな討伐成功!! Mar/22/2025 PM 18:15
次に、こちらの設定もパスします。
$ mosquitto_pub -d -t orz -m "討伐成功! Mar/22/2025 PM 18:15" \
-u momonga -P yoroi \
--topic baito/tobatsu_1
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q0, r0, m1, 'baito/tobatsu_1', ... (36 bytes))
Client null sending DISCONNECT
# Subscriberでは下記が出力される
Client null received PUBLISH (d0, q0, r0, m0, 'baito/tobatsu_1', ... (36 bytes))
討伐成功! Mar/22/2025 PM 18:15
しかし、パスワードが適切でないと送れません。
mosquitto_pub -d -t orz -m "討伐成功! Mar/22/2025 PM 18:15" \
-u momonga -P rakko \
--topic baito/tobatsu_1
Client null sending CONNECT
Client null received CONNACK (5)
Connection error: Connection Refused: not authorised.
Error: The connection was refused.
Discussion