mqtt
mosquitto

mosquitt_pub で retain を消す

More than 1 year has passed since last update.

Mosquitto の retain 機能を使っていたんですが削除につまづいたのでメモを残しておきます。

mosquitto の CLI として mosquitto_pub mosquitto_sub があり、こちらを使って説明します。

用意

例用 retain 作成

$ mosquitto_pub -t "chat/alice" -m "Hello there." -r
$ mosquitto_pub -t "chat/bob" -m "Hello" -r
$ mosquitto_pub -t "chat/chris" -m "Yo" -r

-t トピック名
-h ホスト
-m メッセージ
-p ポート
-r retain する

この状態で subscribe をすると retain 機能により以下のようにメッセージが同期されます。

$ mosquitto_sub -t "chat/#" -v
chat/alice Hello there.
chat/bob Hello
chat/chris Yo

-v 詳細(メッセージだけでなくトピック名も表示)

retain の削除には -n を使います。

-n, --null-message
Send a null (zero length) message.

削除してみる(失敗)

retain 全体を消そうとしてみます。

# try
$ mosquitto_pub -t "chat" -r -n
$ mosquitto_pub -t "chat/#" -r -n
Error: Invalid publish topic 'hello/#', does it contain '+' or '#'?

Use 'mosquitto_pub --help' to see usage.

# check
$ mosquitto_sub -t "chat/#" -v
chat/alice Hello there.
chat/bob Hello
chat/chris Yo

削除してみる(成功)

topic 名を明示して、Bob を消そうとしてみます。

$ mosquitto_pub -t "chat/bob" -r -n
$ mosquitto_sub -t "chat/#" -v
chat/alice Hello there.
chat/chris Yo

Bob を消せました

おわり

MQTT の topic をしっかり理解できてませんでした。/ 区切りにしたからといって WebSocket における namespace や room のような集約関係ができるわけではないようです。だからこそ柔軟な topic 指定や管理が出きるのかなと思います。

https://stackoverflow.com/questions/16136943/how-to-get-the-second-column-from-command-output

一括削除のスクリプトがありました。

mosquitto_sub -t "hello/#" -v |while read line _;do mosquitto_pub -t "$line" -r -n;done