gpt4 book ai didi

c++ - ESP32 OTA 更新在启动时不断崩溃

转载 作者:行者123 更新时间:2023-12-03 02:46:12 26 4
gpt4 key购买 nike

我正在尝试通过让 ESP32 向 Azure Blob 存储上的文件发出获取请求来 OTA 更新。

出于某种未知的原因,它不允许我使用 WifiClient.connect() 函数,因为它总是返回 0。所以现在我使用 HTTPClient 库向 Azure 上的 Blob 存储发出 get 请求。我让它发出请求,现在我正在尝试将其流式传输到:

Update.writeStream();

但是每当我到达该部分时,它就会崩溃并给出以下消息:

Guru Meditation Error: Core  1 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x00000000 PS : 0x00060630 A0 : 0x800d1a18 A1 : 0x3ffb1f30
A2 : 0x00000000 A3 : 0x3ffb1f64 A4 : 0x3ffc11b8 A5 : 0x00000000
A6 : 0x3ffbd484 A7 : 0x00000000 A8 : 0x800d3304 A9 : 0x3ffb1f10
A10 : 0x3ffb1f64 A11 : 0x3f40124c A12 : 0x00000001 A13 : 0x3ffbd44c
A14 : 0x00000000 A15 : 0x3ffc1678 SAR : 0x0000000a EXCCAUSE: 0x00000014
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff

Backtrace: 0x00000000:0x3ffb1f30 0x400d1a15:0x3ffb1f50 0x400d63bb:0x3ffb1fb0 0x40088b9d:0x3ffb1fd0

这是代码:

http.begin("https://AZUREACCOUNT.blob.core.windows.net/CONTAINER/firmware.bin");
int httpCode = http.GET();
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK) {
WiFiClient * stream = http.getStreamPtr();

unsigned long timeout = millis();
while (stream->available() == 0) {
if (millis() - timeout > 5000) {
Serial.println("Client Timeout !");
stream->stop();
return;
}
}

int contentLength = http.getSize();

if (Update.begin(contentLength)) {
Serial.println("Begin OTA. This may take 2 - 5 mins to complete. Things might be quite for a while.. Patience!");
// No activity would appear on the Serial monitor
// So be patient. This may take 2 - 5mins to complete
size_t written = Update.writeStream((WiFiClient &)stream);

if (written == contentLength) {
Serial.println("Written : " + String(written) + " successfully");
} else {
Serial.println("Written only : " + String(written) + "/" + String(contentLength) + ". Retry?" );
// retry??
// execOTA();
}

if (Update.end()) {
Serial.println("OTA done!");
if (Update.isFinished()) {
Serial.println("Update successfully completed. Rebooting.");
ESP.restart();
} else {
Serial.println("Update not finished? Something went wrong!");
}
} else {
Serial.println("Error Occurred. Error #: " + String(Update.getError()));

}
}
else {
Serial.println("Not enough space");
}

如何使此代码正常工作,以便设备从 Azure Blob 存储获取文件并自行更新?

最佳答案

你必须找出它崩溃的原因。如果没有工具,Backtrace 就无法为您提供帮助。

堆栈
请在您的 Arduino IDE 中安装此工具:
https://github.com/me-no-dev/EspExceptionDecoder

并将错误放入其中以获取调用堆栈并查看它在哪里崩溃。可能它与更新无关,而只与httpclient有关。

SSL:
您正在调用 https 页面,您是否使用 secureClient 以及 SSL 证书?如果没有它,您将无法通过安全连接进行通信。

最后:详细
在详细模式处于事件状态的情况下进行编译。当出现问题时收到每条消息非常重要。对于 https,每条信息对于找出它不能按预期工作的原因都非常重要。

关于c++ - ESP32 OTA 更新在启动时不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58711616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com