MQTT-SN をサポートする、Really Small Message Broker (RSMB) 1.3.0.2 を実行しています。MQTT-SN プロトコル経由で Arduino クライアントと通信しています。
Arduino はスリープ状態のクライアントであり、バッテリー駆動のデバイスです。仕組みは次のとおりです。
- 起動後、ブローカーに接続
- センサー値ごとにトピックを登録し、QOS 1 で最初の測定値を発行します (この例では 3 つのセンサー値があります) 2.1 各登録および発行メッセージはブローカーによって確認されます
- 期間を指定してブローカーから切断 - スリープ状態になることを示します
- ウェイクアップ後、クリーン セッション 0 (または false) で再接続します。
- QOS 1 で 1 つのセンサー値を公開
- ブローカからのパブリッシュ承認を待ちます - ここに問題があります。それは来ません。
問題は、ステップ 5 で送信されたメッセージがブローカーによって確認されないことです。Arduino はそのメッセージを数回再送信しようとしますが、あきらめます。
私の理解では、cleansession 0 に再接続すると、以前のすべてのサブスクリプションが有効になり、topicID からトピック名へのマッピングも有効になります。
これが私のコメント付きの RSBM ログです。
Client connects
20150227 152211.587 132 127.0.0.1:55701 <- MQTT-S CONNECT cleansession: 0
20150227 152211.587 1998536376 127.0.0.1:55701 XinoRf_1 -> MQTT-S CONNACK returncode 0 (0)
20150227 152211.588 CWNAN0000I Client connected to udp port 1885 from XinoRf_1 (127.0.0.1:55701)
Here start 1st topic registration and acknowledgment - its id is 1
20150227 152211.678 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S REGISTER msgid: 1 topicid: 0 topicname: net/mf/ha/
20150227 152211.678 132 127.0.0.1:55701 XinoRf_1 -> MQTT-S REGACK msgid: 1 topicid: 1 returncode: 0 (0)
Here starts send and acknowledge of a 1st message in topic 1
20150227 152211.753 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 2 qos: 1 retained: 0
20150227 152211.753 1998536376 127.0.0.1:55701 XinoRf_1 -> MQTT-S PUBACK msgid: 2 (0)
Here start 2nd topic registration and acknowledgment - its id is 2
20150227 152211.753 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S REGISTER msgid: 3 topicid: 0 topicname: net/mf/ha/
20150227 152211.846 132 127.0.0.1:55701 XinoRf_1 -> MQTT-S REGACK msgid: 3 topicid: 2 returncode: 0 (0)
Here starts send and acknowledge of a 1st message in topic 2
20150227 152211.921 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 4 qos: 1 retained: 0
20150227 152211.921 1998536376 127.0.0.1:55701 XinoRf_1 -> MQTT-S PUBACK msgid: 4 (0)
Here start 3rd topic registration and acknowledgment - its id is 3
20150227 152212.005 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S REGISTER msgid: 5 topicid: 0 topicname: net/mf/ha/
20150227 152212.005 132 127.0.0.1:55701 XinoRf_1 -> MQTT-S REGACK msgid: 5 topicid: 3 returncode: 0 (0)
Here starts send and acknowledge of a 1st message in topic 3
20150227 152212.080 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 6 qos: 1 retained: 0
20150227 152212.080 1998536376 127.0.0.1:55701 XinoRf_1 -> MQTT-S PUBACK msgid: 6 (0)
Here Arduino sends disconnect request with duration 4000 (it does not matter what value is sent here, behaviour is same)
20150227 152212.080 1998536376 127.0.0.1:55701 XinoRf_1 <- MQTT-S DISCONNECT duration: 4000
20150227 152212.461 CWNAN0038I Disconnection request received from client XinoRf_1
20150227 152212.461 132 127.0.0.1:55701 XinoRf_1 -> MQTT-S DISCONNECT duration: 0 (0)
At this point Arduino sleeps appprox. 4 seconds
Arduino reconnects with clean session 0 - I believe all previous registrations should be kept by the broker
20150227 152217.519 132 127.0.0.1:55701 <- MQTT-S CONNECT cleansession: 0
20150227 152217.519 1998536376 127.0.0.1:55701 XinoRf_1 -> MQTT-S CONNACK returncode 0 (0)
20150227 152217.519 CWNAN0000I Client connected to udp port 1885 from XinoRf_1 (127.0.0.1:55701)
At this point Arduino is connecte
Here starts send a 2nd message in topic 1 - message never gets acknowledged by the broker.
20150227 152217.603 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 7 qos: 1 retained: 0
Following messages are resent by the client
20150227 152232.595 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 7 qos: 1 retained: 0
20150227 152247.575 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 7 qos: 1 retained: 0
20150227 152301.577 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 7 qos: 1 retained: 0
20150227 152317.536 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 7 qos: 1 retained: 0
20150227 152332.516 132 127.0.0.1:55701 XinoRf_1 <- MQTT-S PUBLISH msgid: 7 qos: 1 retained: 0
その後、eclipse.org (RSMB が現在維持されている場所) で、この動作の原因となる報告されたバグがほとんどないことがわかりました。
- バグ 424704 - MQTT-SN ブローカーが公開されたトピックを忘れる
- バグ 430788 - クライアントが再接続したときに、キューに入れられたメッセージを受信しない
- バグ 430828 - RSMB で持続性が true の場合、MQTT-SN クライアントは接続前に発行されたメッセージを受信しません
ミハル