代码之家  ›  专栏  ›  技术社区  ›  Doublementi

大师冥想错误:核心1在重试http连接时惊慌失措-ESP32

  •  0
  • Doublementi  · 技术社区  · 2 年前

    我在使用http客户端配置SSL层时遇到了问题-我正在使用connectionKeepAlive将数据循环发布到Firebase服务器,当我想关闭与http.stop的连接,然后再次运行http.connect(server,SSL_PORT)时-在下一次迭代中, 我得到了一个例外:大师冥想错误:核心1恐慌

    基于代码: https://github.com/Xinyuan-LilyGO/T-A7608X/blob/main/examples/Arduino/GPS_NMEA_Parse/GPS_NMEA_Parse.ino

    修改:

    const char root_ca[] PROGMEM = <Firebase cert>
    SSLClient secure_layer(&client);
    HttpClient http = HttpClient(secure_layer, FIREBASE_HOST, SSL_PORT);
    
    void setup() {
    
    secure_layer.setCACert(root_ca);
    }
    
    void loop()
    {
        Serial.print(F("Connecting to network"));
        if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
            Serial.println(" fail");
            delay(1000);
            return;
        }
        
        Serial.println(" OK");
    
        http.connect(FIREBASE_HOST, SSL_PORT);
        
        while (true) {
            if (!http.connected()) {
                Serial.println();
                http.stop();// Shutdown
                Serial.println("HTTP  not connect");
                break;
            }
            else {
                gps_loop();
            }
        }
    }
    
    gps_loop(){
    ...
    String gpsData = "{";
        gpsData += "\"latitude\":" + latitude + ",";
        gpsData += "\"longitude\":" + longitude + ",";
        gpsData += "\"date\":" + datetime + "";
        gpsData += "}";
    
        PostToFirebase("PATCH", FIREBASE_PATH, gpsData, &http);
        }
    

    还有一个问题:

    void PostToFirebase(const char* method, const String & path , const String & data, HttpClient* http) {
      String response;
      int statusCode = 0;
      http->connectionKeepAlive(); // Currently, this is needed for HTTPS
      
      //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
      String url;
      if (path[0] != '/') {
        url = "/";
      }
      url += path + ".json";
      url += "?auth=" + FIREBASE_AUTH;
      Serial.print("POST:");
      Serial.println(url);
      Serial.print("Data:");
      Serial.println(data);
      //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
      
      String contentType = "application/json";
      http->put(url, contentType, data);
      
      //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
      // read the status code and body of the response
      //statusCode-200 (OK) | statusCode -3 (TimeOut)
      statusCode = http->responseStatusCode();
      Serial.print("Status code: ");
      Serial.println(statusCode);
      response = http->responseBody();
      Serial.print("Response: ");
      Serial.println(response);
      //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
    
      //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
      if (!http->connected()) {
        Serial.println();
        http->stop();// Shutdown
        Serial.println("HTTP POST disconnected");
      }
      //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
    }
    

    输出

    Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
    
    Core 1 register dump:
    PC : 0x400d5659 PS : 0x00060e30 A0 : 0x800d525e A1 : 0x3ffb20e0
    A2 : 0x3ffb9d0c A3 : 0x3f4007e5 A4 : 0x00000000 A5 : 0x00000000
    A6 : 0x00ff0000 A7 : 0xff000000 A8 : 0x800d5cd4 A9 : 0x3ffb20c0
    A10 : 0x00000000 A11 : 0x3f40340d A12 : 0x00000002 A13 : 0xffffffff
    A14 : 0x00ff0000 A15 : 0xff000000 SAR : 0x0000000a EXCCAUSE: 0x0000001c
    EXCVADDR: 0x00000000 LBEG : 0x400864c1 LEND : 0x400864d1 LCOUNT : 0xfffffffd
    
    Backtrace: 0x400d5656:0x3ffb20e0 0x400d525b:0x3ffb2100 0x400d4cd4:0x3ffb2120 0x400d27f6:0x3ffb2140 0x400d40a9:0x3ffb21b0 0x400d41d0:0x3ffb2270 0x400d6df9:0x3ffb2290
    

    解码:

    PC: 0x400d5651: stop_ssl_socket(sslclient_context*, char const*, char const*, char const*) at C:\XXX\Arduino\libraries\SSLClient\src\ssl_client.cpp line 339
    EXCVADDR: 0x00000000
    
    Decoding stack results
    0x400d564e: stop_ssl_socket(sslclient_context*, char const*, char const*, char const*) at C:\XXX\Arduino\libraries\SSLClient\src\ssl_client.cpp line 336
    0x400d5253: SSLClient::stop() at C:\XXX\Arduino\libraries\SSLClient\src\SSLClient.cpp line 69
    0x400d4ccc: HttpClient::stop() at C:\XXX\Arduino\libraries\ArduinoHttpClient\src\HttpClient.cpp line 47
    0x400d27f6: PostToFirebase(char const*, String const&, String const&, HttpClient*) at D:\XXX\sketch_jun14a/sketch_jun14a.ino line 387
    0x400d40a9: gps_loop() at D:\XXX\sketch_jun14a/sketch_jun14a.ino line 307
    0x400d41c8: loop() at D:\XXX\sketch_jun14a/sketch_jun14a.ino line 232
    0x400d6df1: loopTask(void*) at C:\XXXi\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\cores\esp32\main.cpp line 50
    

    使用之前定义的SSL和connectionKeepAlive关闭https连接的正确方法是什么?这里到底发生了什么?

    0 回复  |  直到 2 年前
    推荐文章