MCU:ESP32
开发环境:ESP-IDF+VScode
服务器:python运行的本地服务器
python编译器:Anaconda下的JupyterLab
实现思路
IDF编程指南给出的OTA实现流程图
空中升级 (OTA) - ESP32 - — ESP-IDF 编程指南 v5.3 文档 (espressif.com)
实现OTA的时候,需要解决几个问题
1.固件放在哪里(服务器)
2.怎么获取固件(连接服务器)
3.获取固件之后的烧写问题
在我实现OTA的时候把固件放在哪里这个问题困扰了我很久,一开始想放在云服务器,但是发现云服务器的OTA功能好像都需要收费;后面偶然查到可以搭建本地的http服务器。
我尝试了在虚拟机中搭建了Apache2服务器,但是局域网下的其他设备访问不到这个服务器。
之后又尝试了利用python可以跑本地服务器,便采用了这种方案
实现过程
服务器搭建
在python中运行这个程序,便可以通过这个端口以及IP地址访问到这个服务器(端口可以自己设置,IP地址可以在命令行窗口中用ipconfig这个命令进行查看)
import http.server
import socketserver
PORT = 1008
# 你可以更改这个端口
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"Serving at port {PORT}")
httpd.serve_forever()
服务器跑起来之后可以拿同一局域网下的手机试一下能不能成功访问
手机打开浏览器访问
http://192.168.xxx.xx:8080
192.168.xxx.xxx是本地服务器的IP地址,8080是你设置的端口(这个可以在python程序里面自己修改)
如果不能成功访问,试一下关闭电脑的防火墙。成功访问进行下一步。
新建一个OTA升级的示例工程
进入工程,对工程进行设置
idf.py menuconfig
如果是在VScode下面开发,可以直接Ctrl+shift+P,输入menuconfig进行设置
1.首先需要修改连接的WIFI
2.然后修改连接的服务器的URL(http://192.168.xxx.xx:8080/xxx.bin)
3.勾选这个设置,确保可以连接http服务器
修改完这些OTA功能应该是可以实现了,将需要升级的固件(在工程的build目录下,以工程名字命名的.bin文件就是固件)复制到python程序的的目录下
编译完之后在IDF中输入
idf.py flash monitor
就可以进行OTA功能的测试了。
总结
这个工程主要是用IDF提供的一个实现https OTA的一个API(
esp_err_t esp_https_ota(const esp_http_client_config_t *config)
)来实现的,如果不进行安全认证这些功能,主要的代码其实很小
esp_err_t do_firmware_upgrade()
{
esp_http_client_config_t config = {
.url = CONFIG_FIRMWARE_UPGRADE_URL,
.cert_pem = (char *)server_cert_pem_start,
};
esp_https_ota_config_t ota_config = {
.http_config = &config,
};
esp_err_t ret = esp_https_ota(&ota_config);
if (ret == ESP_OK) {
esp_restart();
} else {
return ESP_FAIL;
}
return ESP_OK;
}
大概就这几行就可以实现,当然前提是连接了WIFI并且进行一些初始化。