95754


現在spresenseを利用して、サーバーにデータを送る簡易なソフトの開発をしています。  
開発環境はspresense arduinoを使用しており、スケッチ例の"LteWebClient"によりLTE接続を確認できています。  
エラーハンドリングによるLTEのハングアップを防ぐため、WDT（ウォッチドッグタイマー）を使用してリブートを試してみましたが、下記のようなエラーが発生し、LTE接続ができずにプログラムが停止してしまいます。リブート後も正常に動作可能な解決策をご教授いただけないでしょうか。  
※配線の都合上、ハードウェアガイドに記載あるリセットボタンやDTR操作でのリセットは考えておりません。

lte_power_on result error : -120

[code]

    // initialize the library instance
    LTE lteAccess;
    LTEClient OutClient;
    HttpClient client = HttpClient(OutClient, server, port);
    
    void setup(){
      char apn[LTE_NET_APN_MAXLEN] = APP_LTE_APN;
      LTENetworkAuthType authtype = APP_LTE_AUTH_TYPE;
      char user_name[LTE_NET_USER_MAXLEN] = APP_LTE_USER_NAME;
      char password[LTE_NET_PASSWORD_MAXLEN] = APP_LTE_PASSWORD;
    
      // initialize serial communications and wait for port to open:
      Serial.begin(9600);
      DebugSerial.begin(9600);
    
      // initialize WDT
      Watchdog.begin();
    
      // Initialize LowPower library
      LowPower.begin();
    
      // Get the boot cause
      bootcause_e bc = LowPower.bootCause();
    
      DebugSerial.println("Starting HTTP client.");
    
      /* Set if Access Point Name is empty */
      if (strlen(APP_LTE_APN) == 0) {
        DebugSerial.println("This sketch doesn't have a APN information.");
        // readApnInformation(apn, &authtype, user_name, password);
      }
      DebugSerial.println("=========== APN information ===========");
      DebugSerial.print("Access Point Name  : ");
      DebugSerial.println(apn);
      DebugSerial.print("Authentication Type: ");
      DebugSerial.println(authtype == LTE_NET_AUTHTYPE_CHAP ? "CHAP" :
                     authtype == LTE_NET_AUTHTYPE_NONE ? "NONE" : "PAP");
      if (authtype != LTE_NET_AUTHTYPE_NONE) {
        DebugSerial.print("User Name          : ");
        DebugSerial.println(user_name);
        DebugSerial.print("Password           : ");
        DebugSerial.println(password);
      }
    
    while (true) {
    
      while (lteAccess.begin() != LTE_SEARCHING) {
        DebugSerial.println("Could not transition to LTE_SEARCHING.");
        DebugSerial.println("Please check the status of the LTE board.");
      }
      /* The connection process to the APN will start.
      * If the synchronous parameter is false,
      * the return value will be returned when the connection process is started.
      */
      if (lteAccess.attach(APP_LTE_RAT,
                          apn,
                          user_name,
                          password,
                          authtype,
                          APP_LTE_IP_TYPE) == LTE_READY) {
        DebugSerial.println("attach succeeded.");
        break;
      }
    
      /* If the following logs occur frequently, one of the following might be a cause:
      * - APN settings are incorrect
      * - SIM is not inserted correctly
      * - If you have specified LTE_NET_RAT_NBIOT for APP_LTE_RAT,
      *   your LTE board may not support it.
      * - Rejected from LTE network
      */
      DebugSerial.println("An error has occurred. Shutdown and retry the network attach process after 1 second.");
      lteAccess.shutdown();
      sleep(1);
      }
    }
    void loop() {
    
      if (Serial.available()) {
        uint8_t dataLength = Serial.read(); // データ長の取得
    
        delay(100); // PICからデータが全て送られるのを待つ
    
        sendData(dataLength); // データの作成と送信
      }
    }
    
    //サーバーにデータを転送
    void sendData(const String& payload){
      // Watchdog timerを有効
      Watchdog.start(10000);
    
      //疑似的にLTEハングしたと仮定する。
      sleep(100);
      
      //HTTP POST
    
      // Watchdog timerを停止
      Watchdog.stop();
    }
    
[/code]


CC BY-SA 4.0
2023-07-18T01:47:41.917
95667
2023-07-26T07:25:23.427
2023-07-26T07:25:23.427
3060
59145
question
spresense
Spresense でウォッチドッグタイマーを使用した再起動後に LTE 接続がエラーになる


具体的な情報が足りていないのでコミュニティでアドバイスもしにくいと思います。  
まずは、できる範囲でコードなど具体的なものを共有した方が良いと思います。

lte_power_onのエラーメッセージは、以下のものだと思われます。  
エラー番号が-120なので、errno.hだと-EALREADYになると思われます。  
<https://github.com/sonydevworld/spresense-arduino-
compatible/blob/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/LTE/src/LTECore.cpp#L212>

コードがないので推測で解釈すると、  
WDT発動後に再度begin経由でlte_power_onが呼ばれるが、すでにpower_on状態なのでエラーが出ているのではと思われます。

最適解でないかもしれませんが、WDT発動でlte_powerが落とされないのであれば、lte_power_onを呼ぶ箇所で、EALREADYが返るならエラーに落とさずに継続の処理をすすめて動くかなどを確認することも一つの策になると思います。


CC BY-SA 4.0
2023-07-19T01:34:32.673
95679
2023-07-19T01:34:32.673
49022
95667
answer


Spresense SDK/Arduino バージョン v3.0.0, v3.1.0 にて、  
LTE使用中に WDT（ウォッチドッグタイマー）による再起動が発生すると、  
再起動後にLTEの電源が入ったままになっているため、次のLTEの初期化に失敗するという不具合がありました。

こちら回避策として、スケッチのコード例を以下に示します。  
起動要因をみてウォッチドッグによるリブートだった場合、LTEの電源Offを行っています。  
LTE初期化前にこちらのコードを実行することで、ウォッチドッグによる再起動後も正常にLTEが起動できるようになりますので試してみてください。

[code]

    #include <LowPower.h>
    #include <arch/board/board.h>
    
      bootcause_e bc = LowPower.bootCause();
      if (bc == WDT_REBOOT) {
          board_power_control(PMIC_GPO(2), false);
      }
    
      // LTE初期化
    
[/code]

恒久的な対策はSDK側のコード修正になるため、GitHub の Issue へ登録しておきました。  
<https://github.com/sonydevworld/spresense/issues/676>


CC BY-SA 4.0
2023-07-26T02:01:24.817
95754
2023-07-26T07:23:48.767
2023-07-26T07:23:48.767
3060
29520
95667
answer