我在使用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连接的正确方法是什么?这里到底发生了什么?