# esp32-wifi-manager 该组件原作者[tonyp7/esp32-wifi-manager](https://github.com/tonyp7/esp32-wifi-manager),原作者已经不再进行维护,在原作基础上适配了最新的esp-idf sdk,解决了一些bug,原始的[README链接](README_ori.md) *esp32-wifi-manager* 是一个纯C的esp-idf组件,该组件可通过web端配置和查看wifi连接信息 *esp32-wifi-manager* 将在启动时自动尝试重新连接到之前保存的网络,如果找不到保存的wifi,它将启动自己的AP接入点,您可以通过该接入点进入到web端管理和连接到ESP32的wifi网络,成功连接后,软件将在一段时间后(默认为1分钟)自动关闭AP接入点。 *esp32-wifi-manager* 支持esp-idf 4.2及以上的版本 # 目录 - [esp32-wifi-manager](#esp32-wifi-manager) - [目录](#目录) - [演示照片](#演示照片) - [使用](#使用) - [前提条件](#前提条件) - [快速开始](#快速开始) - [配置](#配置) - [将esp32-wifi-manager加入到您的代码](#将esp32-wifi-manager加入到您的代码) - [与esp32-wifi-manager集成](#与esp32-wifi-manager集成) - [事件列表](#事件列表) - [事件参数](#事件参数) - [与http服务器交互](#与http服务器交互) - [线程安全和NVS访问](#线程安全和nvs访问) - [License](#license) # 演示照片  # 使用 ## 前提条件 - esp-idf **4.2及以上版本** - esp32系列芯片 ## 快速开始 clone仓库 ```bash git clone https://github.com/JackHuang021/esp32-wifi-manager.git ``` 进入到 *examples* 下的 *default_demo* 工程目录 ```bash cd esp32-wifi-manager/examples/default_demo ``` 通过*idf*工具编译烧录到esp32 ```bash idf.py build flash monitor ``` 烧录完成后,使用任何具有wifi功能的设备,您都会看到一个名为*esp32*的新wifi接入点。使用默认密码*esp32pwd*连接到它。如果你的设备上没有弹出专属入口,你可以访问默认IP地址:http://10.10.0.1 ## 配置 通过 *menuconfig* 进行配置 ```bash idf.py menuconfig ``` 进入到 Component config -> Wifi Manager Configuration,可以看到下面的界面:  您可以更改AP接入点的的ssid和密码,但强烈建议保留默认值。您的密码长度应该在8到63个字符之间,以符合WPA2标准。如果密码设置为空值或长度小于8个字符,则*esp32-wifi-manager*会将其接入点创建为开放的wifi网络。 您还可以更改各种计时器的值,例如,一旦建立连接,接入点关闭所需的时间(默认值:60000ms)。将此计时器设置为0,将看不到连接wifi成功的反馈,关闭AP接入点将立即终止web端的当前会话,请谨慎设置。 最后,您可以通过将默认URL地址 ”*/*“ 更改为其它地址,例如 ”*/wifimanager/*“,选择将 *esp32-wifi-manager* 重新定位到不同的URL,如果您希望自己的web应用程序与 *esp32-wifi-manager* 的网页共存,此功能尤其有用。 # 将esp32-wifi-manager加入到您的代码 为了在您的esp-idf项目中有效地使用 *esp32-wifi-manager* ,请将整个 *esp32-wifi-manager* 仓库复制(或git clone)到 *components* 子文件夹中。 工程目录结构应该如下所示: - project_folder - build - components - esp32-wifi-manager - main - main.c 完成后,您需要编辑项目根目录下的 *CMakeLists.txt* 文件,以注册 *components* 文件夹,通过添加以下行来完成的: ```cmake set(EXTRA_COMPONENTS_DIRS components/) ``` 通常 *CMakeLists.txt* 的内容如下所示 ```cmake cmake_minimum_required(VERSION 3.5) set(EXTRA_COMPONENT_DIRS components/) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(name_of_your_project) ``` 完成后,您现在可以在用户代码中添加头文件: ```c #include "wifi_manager.h" ``` 您现在需要做的就是在代码中调用 `wifi_manager_start()` ,如果您不清楚怎么使用,请参阅[examples/default_demo](examples/default_demo)。 ## 与esp32-wifi-manager集成 实际上,有三种不同的方法可以将 esp32-wifi-manager 集成到您的代码中,并与之交互: * 在你的代码中轮询 wifi 连接状态 * 使用事件回调 * 直接修改 *esp32-wifi-manager* 代码以满足您的需求 **事件回调**是使用 *esp32-wifi-manager* 最简洁的方式,也是推荐的方式。一个典型的用例是当 *esp32-wifi-manager* 最终连接到接入点时收到通知。为了做到这一点,您只需定义一个回调函数: ```c void cb_connection_ok(void *pvParameter){ ESP_LOGI(TAG, "I have a connection!"); } ``` 然后只需通过调用以下命令进行事件注册: ```c wifi_manager_set_callback(WM_EVENT_STA_GOT_IP, &cb_connection_ok); ``` 现在每次触发事件时它都会调用此函数。[examples/default_demo](examples/default_demo)包含使用回调的示例代码。 ### 事件列表 可以添加回调的事件列表由 *wifi_manager.h* 中的 *message_code_t* 定义。它们如下: * WM_ORDER_START_HTTP_SERVER * WM_ORDER_STOP_HTTP_SERVER * WM_ORDER_START_DNS_SERVICE * WM_ORDER_STOP_DNS_SERVICE * WM_ORDER_START_WIFI_SCAN * WM_ORDER_LOAD_AND_RESTORE_STA * WM_ORDER_CONNECT_STA * WM_ORDER_DISCONNECT_STA * WM_ORDER_START_AP * WM_EVENT_STA_DISCONNECTED * WM_EVENT_SCAN_DONE * WM_EVENT_STA_GOT_IP * WM_ORDER_STOP_AP 实际上,跟踪 *WM_EVENT_STA_GOT_IP* 和 *WM_EVENT_STA_DISCONNECTED* 是了解您的 esp32 是否有连接的关键。在使用 *esp32-wifi-manager* 的典型应用程序中,其他消息大多可以忽略。 ### 事件参数 回调函数参数包含一个 `void` 指针,对于大多数事件,此参数为空,少数选定事件具有可供用户代码利用的附加数据,如下: * `WM_EVENT_SCAN_DONE` 与 `wifi_event_sta_scan_done_t *` 对象一起发送。 * `WM_EVENT_STA_DISCONNECTED` 与 `wifi_event_sta_disconnected_t *` 对象一起发送。 * `WM_EVENT_STA_GOT_IP` 与 `ip_event_got_ip_t *` 对象一起发送。 这些对象是标准的 esp-idf 结构,并在[官方页面](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html)有记录。 [examples/default_demo](examples/default_demo)演示了如何读取 `ip_event_got_ip_t` 对象来访问分配给 esp32 的 IP 地址。 ## 与http服务器交互 由于 *esp32-wifi-manager* 生成了自己的 http 服务器,您可能希望扩展此服务器以在应用程序中提供您自己的页面。 可以使用标准 esp_http_server 来注册您自己的 URL 处理程序来实现这一点。 ```c esp_err_t my_custom_handler(httpd_req_t *req){ ``` 然后通过以下方式注册处理程序 ```c http_app_set_handler_hook(HTTP_GET, &my_custom_handler); ``` [examples/http_hook](examples/http_hook) 包含了一个 `/helloworld` 注册网页的示例 ## 线程安全和NVS访问 *esp32-wifi-manager* 访问非易失性存储以将其wifi配置信息存储并加载到专用命名空间 `espwifimgr` 中。如果您想确保永远不会与对 NVS 的并发访问发生冲突,您可以包含 `nvs_sync.h` 并使用 `nvs_sync_lock()` 和 `nvs_sync_unlock()` 的调用。 ```c nvs_handle handle; if(nvs_sync_lock( portMAX_DELAY )){ if(nvs_open(wifi_manager_nvs_namespace, NVS_READWRITE, &handle) == ESP_OK){ /* do something with NVS */ nvs_close(handle); } nvs_sync_unlock(); } ``` `nvs_sync_lock` 等待作为参数发送给它的 `ticks` 数以获取互斥锁,建议使用 portMAX_DELAY,实际上,`nvs_sync_lock()` 几乎永远不会等待。 # License *esp32-wifi-manager* 使用了MIT LICENSE。因此,只要您保留原始版权,它就可以包含在任何项目中,无论是否是商业项目。请您务必阅读LICENSE文件。
idf.py add-dependency "jackhuang021/esp32-wifi-manager^0.0.1"