ESP32S3局域网OTA-基于python搭建TCP服务器给ESP32做局域网OTA升级

流程有点绕圈圈先鸡还是先蛋,

不明白的话先从步骤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

如果你看到了这里,可以点链接进去给宋工点个赞,我只是个搬运工做整理而已.

再次!感谢开源!感谢分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值