🐡

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