2つのトピックが。。。

現在、テスト用に2台のRaspiでMQTTを使ったテレメトリシステムを運用しています。先日、どうも一台のRaspiのファイルシステムの調子が悪くなったようで、コンソールにエラーが出ていました。立ち上がらなくなると大変なので、適宜バックアップを取り、もう一つ新しいRaspiを用意して移行する手順を進めていました。

そして、テストとして新しいRaspiからのデータを手元の計算機(Ubuntu)でサブスクライブしてみたところ、新しいRaspiからのトピックだけを受信しているはず(と思っている)なのに、古いサブスクライブのトピックも同時に受信されてしまいます。

よく見てみると、古いRaspiからのデータをサブスクライブする時にオ、プションとして--disable-clean-session--idを指定していました。新しいRaspiには、同じオプション(idも同じ)で違うトピック(新しいRaspiがパブリッシュするトピック)をサブスクライブするようにブローカにお願いしています。

ここでハタと気づいたのが、「もしかしたら、同じIDだし、クリーンセッションをオフにしてサブスクライブ要求しているから、一度サブスクライブかけたトピック(セッション)はクリーンにならず、他のトピックをサブスクライブしてもついてくるのでは・・・」という点でした。

これを確認するため、--disable-clean-sessionをとって、ほかのパラメタは同じで、古いRaspiがパブリッシュしているトピックをサブスクライブ要求してすぐに切断し(これで、セッションが切れるはず)、さらに新しいRaspiがパブリッシュしているトピックのみをサブスクライブ要求してみました。これで昔のトピックサブスライブセッションはクリアされ、新しいトピックのみが受信されることになるはずです。

結果、新しいサブスクライブだけを入手することが出来ました。

具体的には、

Why Two topics comes up??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ mosquitto_sub --disable-clean-session --id abcd -t data/OLD_pi -q 1
(古いRaspiからのデータ)
^c
  これで、このサブスクライブはおしまいにした、と思っていたが。。。。

$ mosquitto_sub --disable-clean-session --id abcd -t data/NEW_pi -q 1
(古いRaspiからのデータ)
(新しいRaspiからのデータ)
^C

  ??なぜ2つから??
  --disable-clean-sessionがあると一度サブスクライブしたセッションは、
  IDに張り付いているのでは???
  だから、同じIDで違うトピックをサブスクライブしようとしても、
  前のセッションも復活する?
  ならば、昔のセッションをクリアにしてあげればいいはず。

$ mosquitto_sub --id abcd -t data/OLD_pi -q 1
^c
  clean sessionで接続してすぐに切断。
  これで、古いサブスクライブのセッションが切れたはず。

$ mosquitto_sub --disable-clean-session --id abcd -t data/NEW_pi -q 1
(新しいRaspiからのデータ)
(新しいRaspiからのデータ)
(新しいRaspiからのデータ)

  思ったとおり

という感じです。

ということで、スクリプトで Clean Session を設定していないサブスクライブを切り替えるときは、プロセスをkillするだけではだめで、 Clean Sessionで一度接続して切断することで、セッションを切る必要があるという事でした。さもないと、同じIDで再接続した時に前にサブスクライブしていたトピックも送られてきてしまう、のでは?ということした。