Skip to content

ESP32-C3 使用 Rust 开发 HTTP 服务器

这是ESP-IDF提供的一个示例代码,使用Rust开发HTTP服务器。 protocols/http_server/restful_server 演示了如何实现 RESTful API 服务器和 HTTP 服务器,并结合前端浏览器 UI,设计了多个 API 来获取资源,使用 mDNS 解析域名,并通过半主机技术将网页部署到主机 PC、SPI flash 或 SD 卡上。

主要参考:

API 参考 » 应用层协议 » HTTP 服务器

1.前端页面如何存储的?

  • 本程序在使用了VUE开发一个前端页面。这个页面要想使用,需要先将页面上传至单片机(如果使用 spiffs ,需要将页面上传至 spiffs)。

  • 编译前端,直接使用 npm run build 命令,会生成一个 dist 文件夹,需要将这个文件夹中的内容上传至单片机即可。

  • 上传之前需要在 spiffs 中配置一个分区,用于存储前端页面。如何创建了,那就用到了分区表。 在此程序中,我们自定义了一个分区表。partitions_example.csv 这个文件就是用来定义分区的。

    txt
    # Name,   Type, SubType, Offset,  Size, Flags
    # Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
    nvs,      data, nvs,     0x9000,  0x6000,
    phy_init, data, phy,     0xf000,  0x1000,
    factory,  app,  factory, 0x10000, 1M,
    www,      data, spiffs,  ,        2M,

    在这个表中,可以看到 www 这个分区,这个分区就是用来存储前端页面的。www 这个分区的类型是 spiffs,大小是 2M

  • 分区表如何在单片机中生效的呢?答案时,编译程序后,会生成一个分区表文件 partitions.bin. 这个文件会被烧录到单片机的0x8000位置,这样分区表就生效了。

  • 如何将前端页面上传至单片机呢? 在 main目录下有一个CMakeLists.txt文件,查看一下这个文件的内容。

    makefile
    idf_component_register(SRCS "esp_rest_main.c"
                                "rest_server.c"
                        PRIV_REQUIRES esp_http_server esp_driver_gpio fatfs json spiffs nvs_flash
                        INCLUDE_DIRS ".")
    
    if(CONFIG_EXAMPLE_WEB_DEPLOY_SF)
        set(WEB_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../front/web-demo")
        if(EXISTS ${WEB_SRC_DIR}/dist)
            spiffs_create_partition_image(www ${WEB_SRC_DIR}/dist FLASH_IN_PROJECT)
        else()
            message(FATAL_ERROR "${WEB_SRC_DIR}/dist doesn't exit. Please run 'npm run build' in ${WEB_SRC_DIR}")
        endif()
    endif()

    在这个文件中,有 spiffs_create_partition_image 这个命令,这个命令就是用来将前端页面上传至单片机的。这个命令是 ESP-IDF 提供的一个命令.

  • 通过以上处理后,我们单片机里面的www分区里面,就有了前端页面。剩下的就是如何将前端页面显示出来了。

2.功能是如何实现的?

  • nvs初始化

  • esp-netif 初始化

  • esp-netif 事件处理

  • 初始化 mdns

  • netbiosns 初始化

  • wifi连接 - example_connect

    • wifi连接 - example_wifi_connect
      • 启动wifi - example_wifi_start
        • 初始化wifi - esp_wifi_init
        • netif 创建wifi - esp_netif_create_wifi
        • netif 工作模式设置 - esp_wifi_set_default_wifi_sta_handlers
        • 设置wifi存储 - esp_wifi_set_storage
        • 设置工作模式 - esp_wifi_set_mode
        • 启动wifi - esp_wifi_start
      • 启动wifi连接 - example_wifi_sta_do_connect
    • 注册掉线回调函数 - esp_register_shutdown_handler
    • 打印连接信息 - example_print_all_netif_ips
  • 初始化fs

  • 启动 http 服务器