Https 通过ETH的ESP32 OTA

Https 通过ETH的ESP32 OTA,https,esp32,ota,Https,Esp32,Ota,我有一个运行和工作系统,它是一个带有LAN8720的ESP32,可以通过互联网进行通信 现在,只需平面HTTP请求(通过WiFiClientSecureclient)就可以很好地工作了。但我还需要(通过https)更新设备 现在我有了这个代码: #包括 #包括 #包括 WiFiClientSecure客户端; Serial.println(“准备更新”); //在线旅行社更新吗 otaClient.setunsecure()//跳过SSL证书的验证 如果(!otaClient.connect(数

我有一个运行和工作系统,它是一个带有LAN8720的ESP32,可以通过互联网进行通信

现在,只需平面HTTP请求(通过
WiFiClientSecure
client)就可以很好地工作了。但我还需要(通过https)更新设备

现在我有了这个代码:

#包括
#包括
#包括
WiFiClientSecure客户端;
Serial.println(“准备更新”);
//在线旅行社更新吗
otaClient.setunsecure()//跳过SSL证书的验证
如果(!otaClient.connect(数字\uHQ\uBase\uURL,443)){
Serial.println(“无法连接”);
}
otaClient.print(“GET”);//注意太空!
otaClient.print(数字\u HQ\u二进制\u端点);//API端点
otaClient.println(“HTTP/1.1”);//注意太空!
打印(“主机:”);
otaClient.println(数字\uHQ\uBase\uURL);
otaClient.println(“连接:保持活动”);//不要关闭,因为我们需要执行OTA
打印(“用户代理:”);
otaClient.println(数字用户代理);
println(“缓存控制:无缓存”);
otaClient.println();
无符号长超时=毫秒();
while(otaClient.available()==0){
如果(毫秒()-超时>5000){
Serial.println(“客户端超时!”);
otaClient.stop();
返回;
}
}
while(otaClient.available()){
//读行至/n
String line=otaClient.readStringUntil('\n');
//删除空格,以检查该行是否为标题的结尾
line.trim();
//如果该行为空,
//这是标题的结尾
//休息一会儿,喂狗
//剩余的“客户”到
//Update.writeStream();
如果(!line.length()){
//标题结束
中断;//然后启动OTA
}
//检查HTTP响应是否为200
//否则中断并退出更新
if(第行startsWith(“HTTP/1.1”)){
如果(第200行的索引小于0){
println(“从服务器获取非200状态代码。正在退出OTA更新”);
打破
}
}
//在此提取标题
//从内容长度开始
if(line.startsWith(“内容长度:”){
contentLength=atol((getHeaderValue(第行,“内容长度:”).c_str());
println(“从服务器获取”+字符串(contentLength)+“字节”);
}
//接下来是内容类型
if(line.startsWith(“内容类型:”){
字符串contentType=getHeaderValue(第行,“内容类型:”);
Serial.println(“Got”+contentType+“payload.”);
if(contentType==“应用程序/八位字节流”){
isValidContentType=true;
}
}
}
println(“contentLength:+String(contentLength)+”,isValidContentType:+String(isValidContentType));
if(contentLength&&isValidContentType){
//检查是否有足够的时间更新
bool canBegin=Update.begin(contentLength);
//如果是,开始
如果(可以开始){
println(“开始OTA。这可能需要2-5分钟才能完成。事情可能需要一段时间……耐心!”);
//串行监视器上不会显示任何活动
//所以要有耐心。这可能需要2-5分钟才能完成
size\u t write=Update.writeStream(otaClient);
if(writed==contentLength){
Serial.println(“写入:”+字符串(写入)+“成功”);
}否则{
Serial.println(“仅写:”+ConvertFormatBytes(writed)+“/”+ConvertFormatBytes(contentLength));
//重试??
//execOTA();
}
if(Update.end()){
Serial.println(“OTA完成!”);
如果(Update.isFinished()){
Serial.println(“更新成功完成。正在重新启动”);
特别是重新启动();
}否则{
Serial.println(“更新未完成?出现问题!”);
}
}否则{
Serial.println(“发生错误。错误:”+字符串(Update.getError());
}
}否则{
//没有足够的空间开始OTA
//理解分区和
//空间可用性
Serial.println(“没有足够的空间开始OTA”);
otaClient.stop();
}
}否则{
Serial.println(“响应中没有内容”);
otaClient.stop();
}
此操作运行时没有错误,但在
准备更新控制台消息中被冻结。谁知道我做错了什么


该文件需要来自https域。

您是否关闭了WiFi?@Juraj我没有,现在我添加了
WiFi.mode(WiFi\u off)
禁用wifi。除此之外,我还更新了代码(请参阅更新的主题),现在我遇到了程序未完全加载的问题。(仅限31.55KB/898.28KB)对此有何想法?