disable-clean-sessionオプション

一昨日から気になっていたmosquitto_sub --disable-clean-sessionオプションですが、試してみました。

ブローカに向かって--desiable-clean-session--idの2つのオプションをつけてサブスクライブを要求します。

1
2
3
4
5
6
7
$ mosquitto_sub -h HOSTNAME -t YOUR/TOPIC/NAME --qos 1 --disable-clean-session --id CONNECTION-ID
1417781342, 1691, 0, 0, 0
1417781402, 1691, 0, 0, 0
1417781461, 1691, 0, 0, 0
1417781522, 1691, 0, 0, 0  <<時刻 21:12:02 で中断
^C

--idオプションはサブスクライバが同一であることを主張するためのもののようですので、これが一致することで「再接続だから配信していないデータを送らなきゃ」と認識してくれます。--idを指定しないとデフォルトのプロセス番号を元にしたものになるので、プロセスを止めて再度起動した場合「再接続」と認識してもらえません。
また、–qosが1もしくは2でないとダメみたいです。QoS 0は配信保証がなされないクオリティ指定ですので、当然といえば当然。

データが来たところで、適当に中断します。このトピックではパブリッシャが1分毎に1データを送ってきます。データの最初のフィールドがエポックタイムです。よく見ると60づつ増えていっているのがわかります。

そしてCtrl-Cでプロセスを止めます。

では、ここでしばらく待って。。。。。

わかりやすいように、タイムスタンプを印刷してからサブスクライブを再開します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ date ; mosquitto_sub -h __host-name__ -t YOUR/TOPIC/NAME --qos 1 --disable-clean-session --id testclient
Fri Dec 5 21:24:54 JST 2014
1417781581, 1692, 0, 0, 0  << 再開したのは21:24:54だけど、21:13:01のデータから配信されている。
1417781642, 1691, 0, 0, 0
1417781701, 1691, 0, 0, 0
1417781761, 1692, 0, 0, 0
1417781822, 1691, 0, 0, 0
1417781881, 1691, 0, 0, 0
1417781942, 1692, 0, 0, 0
1417782002, 1692, 0, 0, 0
1417782061, 1692, 0, 0, 0
1417782121, 1692, 0, 0, 0
1417782182, 1692, 0, 0, 0
1417782241, 1692, 0, 0, 0
1417782302, 1692, 0, 0, 0
1417782361, 1692, 0, 0, 0
:

おお、きちんと中断している間のデータも配信されました。

--idオプションには次のように書かれています。

-i, - -id

The id to use for this client. If not given, defaults to mosquittosub\ appended with
the process id of the client. Cannot be used at the same time as the –id-prefix argument.

通常、IDはmosquitto_sub_${PID}になるようです。でもpidは起動するたびに変わってしまうので、同じクライアントとは認識されませんね。物理経路のトラブル等で通信が途絶えた場合は大丈夫でしょうけれど。

--id-prefixはプリフィックスを固定してしまうオプションなので、--idとは共存できないということですね。

関連するところで
ブローカの方の設定でclientid_prefixeというのがあるのですが、これを設定(mosquitto.conf内)すると、指定したプリフィックスのついたクライアントしか接続出来ないようにできるようです。

clientid_prefixes prefix

If defined, only clients that have a clientid with a prefix that matches clientidprefixes will be
allowed to connect to the broker. For example, setting
“secure-“_ here would mean a client
“_secure-_client” could connect but another with clientid “mqtt” couldn’t. By default,
all client ids are valid.

となるようです。セキュリティの一助になるかしら?