SIM5320 MQTT TCP接続が時間後に予期せず終了する


7

私は、SIM5320を使用してMQTTプロトコルに取り組んでいます。私はATコマンドのドキュメントに精通しており、Arduinoを使用した実装が機能しています。

まず、AT + NETOPENでネットワークソケットを開き、次にAT + CIPOPEN = 0、 "TCP"、 "ip address"、portでTCP接続を開きます。次に、AT + CIPSENDを使用してMQTTプロトコルのデータを送信します。これは正常に実行されます。MQTTを介してSIMモジュールにデータを送信すると、データも受信され、メッセージが検出されます。

MQTTでは、キープアライブ間隔があり、サーバーが通信間で接続を開いたままにしておく時間、基本的にクライアントがサーバーから強制的に切断されるまでにアイドル状態でいられる時間を指定します。ただし、この値を最大18時間に設定しました。これは、15分の切断よりはるかに長い時間です。

15分後にサーバーにコマンドを送信しようとすると問題が発生し、応答がありません。SIMは「+ IPCLOSE:0,4」を発行していません。これは通常、サーバーがクライアントまたはその他の種類のインジケーターを強制的に切断したときに発生します。

さらに、「AT + CIPOPEN?」で示されるように、データを送信することができ、CIP接続がまだ開いているようです。「AT + CIPCLOSE = 0」で接続を閉じようとすると、「+ CIPCLOSE:0,4」と「ERROR」が表示されます。ドキュメントでは「+ CIPCLOSE:0,4」の意味については言及されていませんが、接続を開いたり使用したりできないため、接続を閉じているようには見えません。

接続を確立してからデータを送信するまでの、この15分間に何が起こっているのかを知りたいのですが、データの再送信を試みます。警告や問題の兆候がないので、私はひどく混乱しています。

私は最初に電気工学スタック交換でこの質問をしましたが、ここでも質問するようにアドバイスされました。

ここで書いたコードは、見てみたい人のために添付しました。実行する必要のあるライブラリはありません。


2
説明されているMQTTキープアライブ間隔を確認すると、最も可能性の高い原因は、通信スタック内のある時点でトランスポート接続がドロップされていることです。データを送信することでMQTT通信を維持し、ブローカーが他に何も送信しない場合はpingを送信して戻す必要があります。では、アクティビティがない場合、モデムはスリープ状態になる可能性がありますか?1つの質問は、他のトラフィックがないときに10分ごとにpingメッセージを送信できるかどうかと、それがどのように発生するかです。
リチャードチェンバーズ

1
接続がドロップする前にping要求を送信すると、接続はアクティブのままになります。ただし、pingリクエストを18分ごとに送信するのではなく、10分ごとに送信する方が問題があります。可能であれば、リクエストを1時間ごとにのみ送信します。
Boris Deletic

2
クライアントに使用している言語とMQTTライブラリは何ですか?この情報であなたの投稿された質問を更新してください。
Richard Chambers

1
OPは、UARTリンクを介してモジュールに送信されたATコマンドに基づいてTCP / IPパケットを送信する3Gモジュールを使用しています。ここではLinuxは一切関与していません。OPは基本的に彼自身のMQTTクライアントを作成しています。
hardillb

1
@hardillbわかりました。少しわかりやすくしました。したがって、OPが独自のMQTTクライアントを最初から作成している場合、作業は必要なMQTTキープアライブpingを含むMQTT仕様に従う必要があるように見えます。
Richard Chambers

回答:


7

デフォルトのTCP / IPタイムアウトは15分です。この間隔内に何かを送信して、基礎となるTCP接続を維持するために、それが単なる同期/ ackペアであっても維持する必要があります。

MQTTキープアライブは、Last WillメッセージとTestementメッセージをトリガーするタイミングに関係しています。


1
MQTTキープアライブは、デッド接続またはデッドエージェント(クライアントまたはブローカー)へのライブ接続である可能性のあるものをクローズするタイミングを決定するときに行われます。これにより、最後の意志と遺言がトリガーされます。キープアライブは、Last WillとTestamentをトリガーすることではなく、接続がデッドであるかどうかを判断し、それを閉じること、および接続を閉じることの一部としてLast WillとTestamentをトリガーすることです。
Richard Chambers

1
参照しているTCP / IPタイムアウトについて詳しく教えてください。投稿された質問には当てはまらないようですがよくわからない未確認の送信タイムアウトについて話していると思います。そして、man7.org / linux / man-pages / man7 / tcp.7.htmlによるとtcp_keepalive_time()SO_KEEPALIVEソケットオプションが設定されている場合、キープアライブが送信されるまでのデフォルト値は7200秒です。それ以外の場合、接続は終了します。
Richard Chambers

1
これが問題の原因であると思われます。引用を追加して、SIM5320のこの間隔を増やすための可能な方法を提案していただけませんか?
Boris Deletic

MQTTセットアップと非常によく似たものが表示されます。TCPは切断されているようですが、MQTTクライアント/ブローカーは認識していません。非アクティブ状態が30分を超えて公開した場合、ブローカーからPUBACKは受信されませんが、ブローカーに関する限り、切断は発生していません。
スティーブマグネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.