現在、テスト用に2台のRaspiでMQTTを使ったテレメトリシステムを運用しています。先日、どうも一台のRaspiのファイルシステムの調子が悪くなったようで、コンソールにエラーが出ていました。立ち上がらなくなると大変なので、適宜バックアップを取り、もう一つ新しいRaspiを用意して移行する手順を進めていました。
そして、テストとして新しいRaspiからのデータを手元の計算機(Ubuntu)でサブスクライブしてみたところ、新しいRaspiからのトピックだけを受信しているはず(と思っている)なのに、古いサブスクライブのトピックも同時に受信されてしまいます。
よく見てみると、古いRaspiからのデータをサブスクライブする時にオ、プションとして--disable-clean-session
と--id
を指定していました。新しいRaspiには、同じオプション(idも同じ)で違うトピック(新しいRaspiがパブリッシュするトピック)をサブスクライブするようにブローカにお願いしています。
ここでハタと気づいたのが、「もしかしたら、同じIDだし、クリーンセッションをオフにしてサブスクライブ要求しているから、一度サブスクライブかけたトピック(セッション)はクリーンにならず、他のトピックをサブスクライブしてもついてくるのでは・・・」という点でした。
これを確認するため、--disable-clean-session
をとって、ほかのパラメタは同じで、古いRaspiがパブリッシュしているトピックをサブスクライブ要求してすぐに切断し(これで、セッションが切れるはず)、さらに新しいRaspiがパブリッシュしているトピックのみをサブスクライブ要求してみました。これで昔のトピックサブスライブセッションはクリアされ、新しいトピックのみが受信されることになるはずです。
結果、新しいサブスクライブだけを入手することが出来ました。
具体的には、
|
|
という感じです。
ということで、スクリプトで Clean Session を設定していないサブスクライブを切り替えるときは、プロセスをkillするだけではだめで、 Clean Sessionで一度接続して切断することで、セッションを切る必要があるという事でした。さもないと、同じIDで再接続した時に前にサブスクライブしていたトピックも送られてきてしまう、のでは?ということした。