SeeedJP / WioLTEforArduino

GNU General Public License v2.0
33 stars 19 forks source link

Wio.HttpGetを1分毎に関数呼びすると数時間後にエラーになります。 #38

Closed alldonet closed 2 years ago

alldonet commented 2 years ago

以下の現象が発生しています。

連続HTTP通信の場合、定期的にWio. TurnOnOrResetとか呼ぶ必要があるでしょうか。

参考:HttpGet

matsujirushi commented 2 years ago

エラーになった原因を特定したいのですが、返されるコード(-1)だけでは判断つかないです。 https://github.com/SeeedJP/WioLTEforArduino/blob/dbf03c75895d41502891a1fd25087f2c646dd5f5/src/WioLTE.cpp#L1112

Debugを有効にして、エラー発生直前と直後のログを調べてもらえませんか? image

alldonet commented 2 years ago

今回の現象は実行時間と関係ないと確認しました。 この現象はランダムで、実行時間は長くなるほどエラー発生率は上がるわけです。

エラー復旧ロジックなし、連続にHTTP GET/POSTリクエストを発行すると、20~300回目の間にエラーが発生します。

HTTP通信エラーの際以下のロジックを実行するとエラーは復旧され、HTTP通信は長時間に続けれます。 現時点では、3000回以上の通信を確認しました。永久に実行できそうです。

Wio.PowerSupplyLTE(true);
Wio.TurnOnOrReset();
Wio.Activate("soracom.io", "sora", "sora");

DebugONで実行すると、以下のログは表示されました。

12:16:53.262 -> -> +QHTTPPOST: 0,200,2
12:16:53.262 -> - GET https://****
12:16:53.262 -> <- AT+QHTTPCFG="sslctxid",1
12:16:53.262 -> -> 
12:16:53.262 -> -> OK
12:16:53.262 -> <- AT+QSSLCFG="sslversion",1,4
12:16:53.262 -> -> 
12:16:53.262 -> -> OK
12:16:53.262 -> <- AT+QSSLCFG="ciphersuite",1,0XFFFF
12:16:53.262 -> -> 
12:16:53.262 -> -> OK
12:17:03.262 -> <- AT+QSSLCFG="seclevel",1,0
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> <- AT+QHTTPCFG="requestheader",1
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> <- AT+QHTTPURL=59
12:17:03.262 -> -> 
12:17:03.262 -> -> CONNECT
12:17:03.262 -> <- (binary)
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> === header
12:17:03.262 -> GET /**** HTTP/1.1
12:17:03.262 -> Host: ****
12:17:03.262 -> Accept: */*
12:17:03.262 -> Connection: close
12:17:03.262 -> User-Agent: QUECTEL_MODULE
12:17:03.262 -> 
12:17:03.262 -> 
12:17:03.262 -> ===
12:17:03.262 -> <- AT+QHTTPGET=60,136
12:17:03.262 -> -> 
12:17:03.262 -> -> CONNECT
12:17:03.262 -> <- (binary)
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> -> 
12:17:03.262 -> -> +QHTTPGET: 0,200,0
12:17:03.262 -> <- AT+QHTTPREAD
12:17:03.262 -> -> 
12:17:03.262 -> -> CONNECT
12:17:03.262 -> -> (binary)
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> -> 
12:17:03.262 -> -> +QHTTPREAD: 0
12:17:03.262 -> <- AT+CSQ
12:17:03.262 -> -> 
12:17:03.262 -> -> +CSQ: 17,99
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> - POST https://****
12:17:03.262 -> <- AT+QHTTPCFG="sslctxid",1
12:17:03.262 -> -> 
12:17:03.262 -> -> OK
12:17:03.262 -> <- AT+QSSLCFG="sslversion",1,4
12:17:03.262 -> -> 
12:17:03.262 -> -> ERROR
12:17:03.262 -> ### TIMEOUT ###
12:17:03.262 -> ERROR! 1209
matsujirushi commented 2 years ago

ログありがとうございます。 ログを確認したところ、SSL設定の箇所で、セルラーモジュール(EC21-J)内部でエラーが発生しているようです。(セルラーモジュールから"ERROR"が返ってきています。)

ログ抜粋:

12:17:03.262 -> <- AT+QSSLCFG="sslversion",1,4
12:17:03.262 -> -> 
12:17:03.262 -> -> ERROR

コード箇所: https://github.com/SeeedJP/WioLTEforArduino/blob/5bb1be1e0b4c1d5d554cfb65e71d88528a178c9f/src/WioLTE.cpp#L1209

思いつく回避策としては、

  1. セルラーモジュールを再起動。(Wio.PowerSupplyCellular(false) -> Wio.PowerSupplyCellular(false))
  2. SORACOM Beamを使用。(Wio LTE Cat.1はHTTP通信)

です。

alldonet commented 2 years ago

確認ありがとうございました。 エラーの元と解決方法を了解しました。

こちらの負荷テストで以下の復旧ロジックにて 1万回以上の連続HTTP通信が確認できました。 これで永久実行ができそう。

Wio.TurnOnOrReset();
Wio.Activate("soracom.io", "sora", "sora");

回答なりました。 ありがとうございました。