流程有点绕圈圈先鸡还是先蛋,
不明白的话先从步骤3开始看,
创建示例编译一次后,再回到步骤1
1.首先用VS Code打开运行python代码,创建TCP服务器.
py_ESP32_OTA_server.py
# http.server、socketserver 和 os 是Python标准库的一部分,无需通过pip安装。
import http.server
import socketserver
import os
# 设置文件路径
# file_path = "F:\\001 my file\\05 Generated File\\Python code\\Python Code WIFI_ESP32OTA\\simple_ota\\simple_ota.bin"
# file_path = r"D:\Espressif\frameworks\Work_lrj\OTA\simple_ota_example\build\simple_ota.bin"
# file_path = r"D:\Espressif\frameworks\Work_lrj\OTA\native_ota_example\build\native_ota.bin"
# file_name = "native_ota.bin"
# sub_path = os.path.join("native_ota", file_name)
# file_path = os.path.join(os.getcwd(), sub_path)
file_path = r"D:\Espressif\frameworks\Work_lrj\OTA\native_ota_example\build\native_ota.bin"
# file_path = r"D:\Espressif\frameworks\Work_lrj\flash_burning\build\flash_burning.bin"
file_name = os.path.basename(file_path)
print(file_path)
print(file_name)
# 确保文件存在
if not os.path.exists(file_path):
print(f"文件 {file_path} 不存在。")
exit(1)
# 设置HTTP服务器端口
PORT = 8000
class CustomHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def translate_path(self, path):
# 忽略请求的路径,始终返回指定的文件
return file_path
# 创建HTTP服务器
with socketserver.TCPServer(("", PORT), CustomHTTPRequestHandler) as httpd:
# 打印IP地址
import socket
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
print(f"Hostname: {hostname}")
print(f"IP Address: {ip_address}")
print(f"文件路径: {file_path}")
print(f"文件名称: {file_name}")
print(f"远程地址: http://{ip_address}:{PORT}/{file_name}")
# print('http://192.168.1.3:8000//simple_ota.bin')
httpd.serve_forever()
file_path = r"D:\Espressif\frameworks\Work_lrj\OTA\native_ota_example\build\native_ota.bin"
文件路径可以直接设置你的ESP32项目的 build文件夹\"项目名称".bin
也可以把bin文件复制到python代码目录下,代码有示例了.自行研究一下
2.运行代码后就创建了服务器了.复制远程地址 http://192.168.1.3:8000/native_ota.bin
3.然后创建ESP32的 Native OTA example 示例
4.设置sdkconfig的配置,如URL和WIFI的账户密码.
5.sdk修改后如下图(这个是自动生成,不用你改,打开确认一下有没有修改到位就行)
6.修改CMakeLists.txt,插入 set(PROJECT_VER "1") 后续更改软件版本的话就改1/2/3/4这样子数字增大,或者减小,因为示例只判断版本是否相同,而不判断是否增大.
7.在native_ota_example.c中添加这些代码
#ifndef CONFIG_EXAMPLE_FIRMWARE_UPG_URL
#error "CONFIG_EXAMPLE_FIRMWARE_UPG_URL need define"
#endif
#ifndef CONFIG_EXAMPLE_WIFI_SSID
#error "CONFIG_EXAMPLE_WIFI_SSID need define"
#endif
#ifndef CONFIG_EXAMPLE_WIFI_PASSWORD
#error "CONFIG_EXAMPLE_WIFI_PASSWORD need define"
#endif
void app_main(void)
{
ESP_LOGW(TAG, "");
ESP_LOGW(TAG, "");
ESP_LOGW(TAG, "");
const esp_app_desc_t *app_desc = esp_app_get_description();
ESP_LOGE(TAG, "Current firmware version: %s", app_desc->version);
ESP_LOGW(TAG, "");
ESP_LOGW(TAG, "");
ESP_LOGW(TAG, "");
vTaskDelay(3000 / portTICK_PERIOD_MS);
8.尝试第一次编译后可以得到bin的大小
9.然后根据大小修改partitions.csv文件,
我这里设置了1600K 约1.6MB 肯定是可以装得下0.85MB的
如果是16MB的ESP32S3-N16R8 可以ota0=6MB ota1=6MB 视实际情况而改
我编译能显示b kb mb是因为我修改了
D:\Espressif\ESP-IDF_Tools_v5.4.1\python_env\idf5.4_py3.11_env\Lib\site-packages\esp_idf_size\ng\format_table.py 文件
你搜索format_table.py找到show_image_info()函数就行
# 20250507_005
# Total image size: 1694232 bytes (.bin may be padded larger)
# Total image size: 1654.52 KB (.bin may be padded larger)
# Total image size: 1.62 MB (.bin may be padded larger)
# 修改 D:\Espressif\ESP-IDF_Tools_v5.4.1\python_env\idf5.4_py3.11_env\Lib\site-packages\esp_idf_size\ng\format_table.py
def show_image_info(memmap: Dict[str, Any], args: Namespace) -> None:
msg = 'Total image size: {} bytes (.bin may be padded larger)'.format(
color_diff(memmap['image_size'], memmap['image_size_diff'], args.diff))
log.eprint(msg)
msg = 'Total image size: {:.2f} KB (.bin may be padded larger)'.format(
int(color_diff(memmap['image_size'], memmap['image_size_diff'], args.diff))/1024)
log.eprint(msg)
msg = 'Total image size: {:.2f} MB (.bin may be padded larger)'.format(
int(color_diff(memmap['image_size'], memmap['image_size_diff'], args.diff))/1024/1024)
log.eprint(msg)
10.烧录到板子启动后,打印版本1
11.这个时候把CMakeLists.txt修改 set(PROJECT_VER "2") 为版本2 重新编译代码但是不烧录,
12.然后重启开发板,开发板检测到新的bin文件就会自动升级
13.升级后机器自动重启,版本相同,不再升级
set(PROJECT_VER "2")
只检测版本文本是否相同,并不做版本是否增加检测,比如你可以设置
set(PROJECT_VER "ABCD")
也可以设置
set(PROJECT_VER "0.0.1")
可以看到py的服务器有连接上的信息打印
这样子就可以局域网OTA升级了.
但是很有局限性,非真实项目还不如直接线升级.除非我们做个人项目才会用到局域网升级吧?
引用连接:
ESP-IDF-OTA远程升级简单介绍-宋工_哔哩哔哩_bilibili
如果你看到了这里,可以点链接进去给宋工点个赞,我只是个搬运工做整理而已.
再次!感谢开源!感谢分享!