esp-adf Wi-Fi Service 例程全解析:从加密 Profile 存储、HTTP/BluFi 配网到网络选择与 MCP 远程管理
音视频音频处理嵌入式物联网语音【免费下载链接】esp-adfEspressif Advanced Development Framework for Multimedia Applications项目地址https://gitcode.com/gh_mirrors/es/esp-adf点击查看免费下载导读本文基于 esp-adf 仓库中 wifi_service_example 例程系统讲解 ADFesp_wifi_service组件的完整落地方式如何将 Wi-Fi 凭据加密保存到 NVS、通过 HTTP SoftAP / BluFi 多通道配网、使用 selector 做多网络自动选择与质量监测并通过esp_cli_serviceUART REPL 与 MCP 工具远程管理。读完本文你将能够独立编译、烧录、配置并深度定制这个面向量产 IoT 设备的 Wi-Fi 服务示例同时理解其背后的服务化架构与关键源码实现。例程概览一个服务化的 Wi-Fi 应用骨架wifi_service_example是一个难度 ⭐⭐ 的 Regular Example它演示了 ADFesp_wifi_service组件的完整用法。与传统的裸 Wi-Fi 事件回调写法不同本例程把 Wi-Fi 能力封装成 ADF 的 service 形态创建 Wi-Fi service、将 Wi-Fi profile 加密保存到 NVS、启动配网流程、监听 service 事件并通过 CLI service 提供 profile 与配网控制命令。在一个基于 ADF service 的应用中本例程组合了以下组件依赖关系见 main/idf_component.ymlesp_serviceservice 生命周期与事件总线adf_event_hub统一事件分发esp_config_manager可加密的配置存储层HTTP SoftAP 配网内置 Web UI可选 BluFi 配网profile 存储与网络选择selector网络质量监测Internet 探测、延迟与吞吐退化检测。典型场景需要现场配网、持久化保存 Wi-Fi 凭据、自动重连并通过统一 service 接口获取连接状态与配网事件的 IoT 设备。运行机制八步启动流程根据 README.md 的Run Flow例程按以下顺序启动初始化 NVS启用 BluFi 时同时初始化 Bluetooth host对应 app_main.c 中的nvs_flash_init()与init_bt()创建 HTTP 配网 agent可选创建 BluFi 配网 agent配置加密 NVS 作为 Wi-Fi profile 存储配置 selector 触发条件RSSI、Internet 访问探测、延迟退化、吞吐退化创建并启动esp_wifi_service订阅 service 事件并启动esp_cli_serviceUART REPL当CONFIG_ESP_MCP_ENABLE与CONFIG_WIFI_SERVICE_MCP_ENABLE同时启用时注册 Wi-Fi MCP 工具若选择了 UART transport则启动 MCP UART 服务若没有可用 profile则启动配网流程若已有 profile则使用这些 profile 进行连接选择。这套流程在 app_main.c 的app_main()中逐行落地后文将结合源码逐段展开。环境配置硬件要求ESP-IDF 支持的任意 Espressif 开发板用于配网和连接测试的 Wi-Fi AP用于 HTTP 配网的手机仅在测试 BluFi 配网时才需要安装 Espressif BluFi APP 的手机。默认 IDF 分支例程支持 ESP-IDF release/v5.5 及以后分支ADF 仓库默认使用 ESP-IDF release/v5.5。软件要求用于 HTTP 配网的浏览器测试 BluFi 配网时的 Espressif BluFi 手机 APP。编译与烧录编译准备若尚未配置 ESP-IDF 环境先在 ESP-IDF 根目录执行./install.sh . ./export.sh然后进入例程工程目录cd $ADF_PATH/components/esp_wifi_service/examples/wifi_service_example项目配置目标芯片与关键开关编译前先设置目标芯片。例程为 ESP32 和 ESP32-S3 提供了目标相关默认配置idf.py set-target esp32或idf.py set-target esp32s3重要配置项这些开关的定义与依赖关系可在 Kconfig 中逐条核对配置项作用说明Wi-Fi Service→Provisioning agents→Enable HTTP provisioning agent启用 HTTP 配网 agent对应CONFIG_WIFI_SERVICE_PROV_HTTP_ENABLE默认y仅用非 HTTP 配网时可关闭Wi-Fi Service→Provisioning agents→Embed default HTTP provisioning Web UI内置 HTTP 配网 Web UI对应CONFIG_WIFI_SERVICE_PROV_HTTP_DEFAULT_WEBUI_ENABLE默认y关闭后须由应用提供web_ui.dataWi-Fi Service→Provisioning agents→Enable BLUFI provisioning agent启用 BluFi 配网 agent对应CONFIG_WIFI_SERVICE_PROV_BLUFI_ENABLE依赖 ESP-IDF 的BT_BLE_BLUFI_ENABLE或BT_NIMBLE_BLUFI_ENABLEWIFI_SERVICE_SELECTOR_PROBE_ENABLE启用 selector HTTP probe monitor默认n用于 Internet 连通性检查与延迟退化事件WIFI_SERVICE_SELECTOR_THROUGHPUT_ENABLE启用 selector throughput monitor默认n用于吞吐退化检查与事件ESP_MCP_ENABLE启用共享 MCP server 和 transport属于esp_service的全局 MCP 支持WIFI_SERVICE_MCP_ENABLE编译 Wi-Fi MCP tool 支持依赖ESP_MCP_ENABLE默认nESP_MCP_TRANSPORT_UART通过例程的 UART transport 暴露 MCP tools启用后在例程中启动内置 UART MCP server目标相关的 BluFi 默认配置BluFi 依赖 ESP-IDF Bluetooth 选项例程通过两个目标专属 defaults 文件区分蓝牙协议栈sdkconfig.defaults.esp32启用 Bluedroid 协议栈CONFIG_BT_BLUEDROID_ENABLEDy与CONFIG_BT_BLE_BLUFI_ENABLEysdkconfig.defaults.esp32s3启用 NimBLE 协议栈CONFIG_BT_NIMBLE_ENABLEDy与CONFIG_BT_NIMBLE_BLUFI_ENABLEy。如果当前目标未启用 BluetoothHTTP 配网仍可独立使用。此外 sdkconfig.defaults 还预置了CONFIG_ESP_MCP_ENABLEy、CONFIG_WIFI_SERVICE_MCP_ENABLEy、自定义分区表partitions.csv以及必要的 mbedTLS DH 配置BluFi 安全握手依赖CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA/CONFIG_MBEDTLS_DHM_C。覆盖配网 SoftAP 名称与密码默认 HTTP agent 使用内置 Web UI配网 SoftAP SSID 形如ESP_SVC_XXXXXX其中XXXXXX来自设备 SoftAP MAC 地址见esp_wifi_service_prov_softap_config_t在 esp_wifi_service_prov_http.h 中的定义SSID 为 NULL 时使用默认名。如需固定 AP 名称和密码可在 main/app_main.c 中设置http_cfg.softapesp_wifi_service_prov_http_config_t http_cfg { .name http, .softap { .ssid ESP_SVC_DEMO, .password 12345678, .channel 3, .max_connection 4, }, };其中channel为 0 时保持默认/当前信道max_connection为 0 时保持默认最大连接数。编译与烧录命令编译idf.py build烧录并运行串口 monitor将PORT替换为实际端口idf.py -p PORT flash monitor退出 monitor 使用Ctrl-]。提示例程使用自定义分区表 partitions.csv包含nvsdata/nvs0x6000、phy_initdata/phy和factoryapp/factory分区保证 NVS 有充足空间存放加密 profile。如何使用例程UART REPL 与 CLI 命令启动后例程启动esp_wifi_service并打开提示符为wifi的esp_cli_serviceUART REPL实现见 wifi_service_console.c。常用命令help wifi profile list wifi profile add ssid password [priority 0..20] wifi profile del ssid wifi profile clear wifi connect ssid password|- 表示开放 AP [priority 0..20] [wait_sec] wifi prov start wifi prov stop wifi reeval reboot对照 wifi_service_console.c 的实现细节wifi profile list会先打印last_working最近一次成功连接的 SSID来自esp_wifi_service_profile_mgr_get_last_working()再逐条打印ssid... pri... en0/1en 为 profile 的 enabled 标志wifi profile add默认 priority 为10超出ESP_WIFI_SERVICE_PROFILE_PRIORITY_MAX20会被钳制SSID 超过 32 字节、密码超过 64 字节会报错常量定义见 esp_wifi_service_profile_mgr.hwifi profile del ssid按 SSID 删除wifi profile clear清空全部wifi prov start|stop分别调用esp_wifi_service_start_provisioning()/esp_wifi_service_stop_provisioning()wifi reeval调用esp_wifi_service_request_reeval()请求一次 selector 扫描与重评估reboot通过esp_restart()重启设备。测试 HTTP 配网启动例程等待 HTTP agent 启动使用手机或 PC 连接设备的配网 SoftAP打开 captive portal 页面如果系统没有自动弹出页面可手动访问设备网关地址选择或输入目标 AP 的 SSID填写密码并提交设备会尝试连接连接成功后保存 profile并在串口日志中上报 service 事件。HTTP 配网通道在组件层面还暴露了一组 REST API详见 esp_wifi_service 组件 READMEGET /prov/status查询状态、GET /prov/scan_result获取缓存扫描结果按 RSSI 排序、按 SSID 去重、POST /prov/profiles提交凭据、DELETE /prov/profiles?ssid...删除、POST /prov/profiles/enabled启停 profile、POST /prov/stop结束配网。默认内置 Web UI 提供从扫描、填表、提交到 profile 管理与停止配网的完整浏览器交互。直接演示 request_connect如需直接演示esp_wifi_service_request_connect()可执行wifi connect ssid password [priority 0..20] [wait_sec]开放 AP 的密码参数传-wifi_service_console.c 会将其转为空字符串。该命令会保存或更新 profile、请求 selector 驱动连接并等待最多wait_sec秒直到 STA 获取 IP。默认 priority 为10默认等待时间为30秒wait_sec设为0时命令在连接请求被接受后立即返回。其底层语义对应 esp_wifi_service.h 的esp_wifi_service_request_connect(service, ssid, password, prio, wait_sec)保存/更新 profile、按需停止配网并启动 selector然后跳过扫描/重评估直接连接指定 SSID。MCP 远程管理Wi-Fi 工具集启用 MCP 后CONFIG_ESP_MCP_ENABLE与CONFIG_WIFI_SERVICE_MCP_ENABLE同时为y例程向 service manager 注册以下 Wi-Fi 工具注册逻辑见 app_main.c 的wifi_svc_example_start_mcp()esp_wifi_service_get_status esp_wifi_service_list_profiles esp_wifi_service_add_profile esp_wifi_service_set_profile_enabled esp_wifi_service_delete_profile esp_wifi_service_clear_profiles esp_wifi_service_prov_start esp_wifi_service_prov_stop esp_wifi_service_request_reeval值得注意的几点同时见于 esp_wifi_service 组件 READMEMCP 状态与 profile 查询工具不会返回已保存的 Wi-Fi 密码——这是刻意设计add_profile的响应只回显 SSID 与 index不回显 password冒烟测试脚本对此有专门断言工具描述 JSON 由esp_wifi_service_mcp_schema_get()提供工具分发入口为esp_wifi_service_tool_invoke()见 esp_wifi_service_mcp.h若应用把 MCP transport 暴露到不可信的调试通道之外应自行增加认证与传输安全策略。MCP UART 接线与冒烟测试设置CONFIG_ESP_MCP_TRANSPORT_UARTy后本例程启动内置 UART MCP server使用UART_NUM_1波特率 115200宏定义见 app_main.cMCP TXGPIO25连接到 USB-UART 转接器 RXMCP RXGPIO26连接到 USB-UART 转接器 TXGND开发板 GND 与转接器 GND 共地注意README 中的接线描述为 GPIO25/GPIO26而源码宏WIFI_SVC_EX_MCP_UART_TX_IO 17/WIFI_SVC_EX_MCP_UART_RX_IO 18给出了编译期的默认管脚值实际使用以你烧录的固件配置为准可通过 Kconfig 或源码调整。在例程目录下运行 Wi-Fi MCP UART 冒烟测试python3 scripts/test_wifi_service_mcp_uart.py /dev/ttyUSB1 115200该脚本test_wifi_service_mcp_uart.py是一个基于 pyserial 的 JSON-RPC 2.0 行协议客户端会依次校验tools/list是否包含全部 9 个脚本中还额外校验了esp_wifi_service_request_connect共 10 个Wi-Fi 工具、调用esp_wifi_service_get_status断言返回service_state/connected/provisioning_running/profile_count字段、esp_wifi_service_list_profiles、esp_wifi_service_request_reeval加--mutating参数还会执行 add_profile、set_profile_enabled、prov_start/prov_stop 等状态变更操作加--negative参数会校验非法参数返回错误。日志输出解读以下日志片段展示 HTTP agent 启动后的 service 流程I (642) WIFI_SVC_EXAMPLE: Create Wi-Fi service skeleton with 1 agents I (652) WIFI_SERVICE: Init wifi default: station mode started I (672) WIFI_SERVICE: Init wifi_service: agent http ready I (682) WIFI_SERVICE: Init wifi_service: done with 1 agent(s) I (692) WIFI_SVC_EXAMPLE: Start Wi-Fi service I (742) WIFI_SERVICE_HTTP: HTTP server started: port80 ctrl_port32769 I (752) WIFI_SVC_EXAMPLE: Event received: domainwifi_service id4 namePROV_STARTED I (752) WIFI_SVC_EXAMPLE: Payload: namehttp I (762) WIFI_SERVICE_HTTP: HTTP agent started I (772) WIFI_SERVICE: Start provisioning: agent http started (index0) I (782) WIFI_SERVICE: Start wifi_service: all agents started I (792) WIFI_SVC_CONSOLE: CLI service: type help, wifi ... or reboot提交 Wi-Fi 凭据并获取 IP 后关键日志如下I (15432) WIFI_SERVICE_HTTP: HTTP station connect begin: ssidOffice, password_len8, timeout15000ms I (17342) WIFI_SERVICE_HTTP: HTTP station connect success: ssidOffice I (17362) WIFI_SVC_EXAMPLE: Event received: domainwifi_service id8 namePROV_CREDENTIAL_RECEIVED I (17362) WIFI_SVC_EXAMPLE: Payload: namehttp ssidOffice priority10 password_len8 I (17402) WIFI_SVC_EXAMPLE: Event received: domainwifi_service id3 nameSTA_GOT_IP I (17402) WIFI_SVC_EXAMPLE: Payload: ip192.168.1.123 netmask255.255.255.0 gw192.168.1.1 ip_changed0id3/id4/id8对应 esp_wifi_service.h 中的ESP_WIFI_SERVICE_EVENT_STA_GOT_IP111 之前的编号段由底层事件换算、ESP_WIFI_SERVICE_EVENT_PROV_STARTED、ESP_WIFI_SERVICE_EVENT_PROV_CREDENTIAL_RECEIVED等事件标识事件名由esp_service_get_event_name()解析。日志中的Payload:行由例程自己的事件处理函数打印app_main.c它会按事件类型解析不同 payload 结构如wifi_event_sta_connected_t、ip_event_got_ip_t、esp_wifi_service_prov_event_t等。源码级深度解析1. 加密 NVS Profile 存储例程将 Wi-Fi 凭据加密后存入 NVS核心在 app_main.cstatic esp_config_storage_nvs_t s_wifi_profile_store { .nvs_namespace wifi_svc_ex, .key_primary prof_p, .key_backup prof_b, };随后通过esp_config_storage_init_nvs()创建存储句柄再以esp_config_crypto_ops_t挂接 AES-128-CBC 加密/解密回调wifi_svc_ex_profile_encrypt/wifi_svc_ex_profile_decrypt见 app_main.c。加密格式为[IV(16B) | CIPHERTEXT]IV 由esp_fill_random()生成明文中用 PKCS7 方式补齐到 16 字节块crypto_extra_size设置为16*2字节以容纳 IV 与最坏情况的填充膨胀。profile manager 初始化配置WIFI_SVC_EX_PROFILE_MAX_NUM 8esp_wifi_service_profile_mgr_cfg_t profile_cfg { .max_profiles WIFI_SVC_EX_PROFILE_MAX_NUM, .storage s_wifi_profile_storage, .crypto s_profile_crypto_ops, .crypto_extra_size WIFI_SVC_EX_AES_BLOB_OVERHEAD, }; esp_wifi_service_profile_mgr_t profile_manager NULL; ESP_ERROR_CHECK(esp_wifi_service_profile_mgr_init(profile_cfg, profile_manager));从源码结构看若不配置cryptoprofile 将以明文记录存储配置了crypto则每次写入前加密、读取后解密。这正是现场配网 凭据持久化产品最需要的能力之一。2. 双配网 agent 的创建HTTP 与 BluFi agent 都基于统一的esp_wifi_service_prov_t句柄数组agents[2]创建编译期由 Kconfig 裁剪#if CONFIG_WIFI_SERVICE_PROV_HTTP_ENABLE esp_wifi_service_prov_http_config_t http_cfg { .name http, .profile_manager profile_manager, }; ret esp_wifi_service_prov_http_create(http_cfg, agents[agent_count]); ... #if CONFIG_WIFI_SERVICE_PROV_BLUFI_ENABLE esp_wifi_service_prov_blufi_config_t blufi_cfg { .name blufi, .device_name k_blufi_device_name, // BLUFI_DEVICE .profile_manager profile_manager, }; ret esp_wifi_service_prov_blufi_create(blufi_cfg, agents[agent_count]);BluFi 创建返回ESP_ERR_NOT_SUPPORTED时被当作正常分支跳过蓝牙栈不可用其余错误才打印告警。两个 agent共享同一个 profile_manager 句柄保证配网写入与 selector 读取使用同一份凭据存储——这是 esp_wifi_service.h 明确要求的使用约定。3. 自定义 selector 策略例程在 app_main.c 中展示了一套自定义 selector 策略配置字段与 esp_wifi_service_selector.h 一一对应esp_wifi_service_selector_cfg_t selector_policy { .triggers_mask ESP_WIFI_SERVICE_SELECTOR_TRIGGER_RSSI_LOW | ESP_WIFI_SERVICE_SELECTOR_TRIGGER_PROBE_FAILED | ESP_WIFI_SERVICE_SELECTOR_TRIGGER_LATENCY_DEGRADED | ESP_WIFI_SERVICE_SELECTOR_TRIGGER_THROUGHPUT_DEGRADED, .select_order { ESP_WIFI_SERVICE_SELECTOR_CRITERION_PRIORITY, ESP_WIFI_SERVICE_SELECTOR_CRITERION_QUALITY, ESP_WIFI_SERVICE_SELECTOR_CRITERION_PROBE_TRUSTED, }, .rssi { .threshold_dbm -75, // RSSI 低于 -75 dBm 可触发重评估 .check_period_ms 5000, // 5 秒周期 }, .probe { .url http://connectivitycheck.gstatic.com/generate_204, .check_period_min 5, .timeout_ms 5000, .expected_status 204, .blocked_seconds 15, // 探测失败后临时黑名单时长 .latency_check true, .latency_max_ms 1500, .latency_degraded_consecutive 3, .task { .task_core -1, .task_stack 8192, .task_prio 5, .task_ext_stack false }, }, .throughput { .url https://httpbin.org/bytes/4096, .check_period_min 5, .min_kbps 256, // 最低吞吐 256 kbps .max_bytes 4096, .timeout_ms 5000, .blocked_seconds 15, .throughput_degraded_consecutive 3, .task { .task_core -1, .task_stack 8192, .task_prio 5, .task_ext_stack false }, }, };关键设计点可对照组件 README 的 WiFi Selection and Switching 一节触发条件RSSI 过低、Internet 探测失败、延迟连续退化、吞吐连续退化四者通过triggers_mask位或组合排序准则select_order数组决定候选 AP 的排名优先级——先按用户配置的 profile priority如优先办公室网络再按信号质量RSSI最后按最近一次探测可信度HTTP-OK 历史防抖策略延迟/吞吐采用连续 N 次退化才触发事件latency_degraded_consecutive/throughput_degraded_consecutive 3避免一次抖动导致频繁切换临时黑名单探测失败或质量退化的 BSSID 会被暂时避开blocked_seconds 15防止反复重连到不可用的 AP重试行为selector_policy.retry未设置时使用内置扫描退避表1000, 5000, 10000, 20000, 30000msmax_connect_retry 0表示连接失败后持续重试内置默认策略把selector_policy置为NULL则使用内置策略——低 RSSI 时重评估再按探测可信度、信号质量、profile 优先级依次选择候选。4. service 创建、事件订阅与 STA 配置回调esp_wifi_service_config_t cfg { .name wifi_service, .profile_manager profile_manager, .prov_list agent_count 0 ? agents : NULL, .prov_num agent_count, .selector_policy selector_policy, }; ESP_ERROR_CHECK(esp_wifi_service_create(cfg, wifi_service)); esp_service_t *service_base (esp_service_t *)wifi_service; adf_event_subscribe_info_t sub_info ADF_EVENT_SUBSCRIBE_INFO_DEFAULT(); sub_info.event_id ADF_EVENT_ANY_ID; sub_info.handler wifi_event_handler; sub_info.handler_ctx service_base; ESP_ERROR_CHECK(esp_service_event_subscribe(service_base, sub_info)); ESP_ERROR_CHECK(esp_service_start(service_base));事件处理函数wifi_event_handler()对几乎所有 service 事件做了 payload 解析打印其中两个值得关注的业务用法ESP_WIFI_SERVICE_EVENT_PROV_PEER_DISCONNECTED配网对端断开后如果 profile 管理器中已存在 profileesp_wifi_service_profile_mgr_count() 0例程会自动调用esp_wifi_service_stop_provisioning()把流程切换到 selector 连接阶段ESP_WIFI_SERVICE_EVENT_STA_CONFIG在配网通道或 selector 调用esp_wifi_set_config()之前发布例程在同步回调中把info-config-sta.listen_interval设为3统一作用于 HTTP 配网、BluFi 配网、selector 切换和直接连接请求WIFI_SVC_EX_STA_LISTEN_INTERVAL。5. MCP 注册与 UART transportwifi_svc_example_start_mcp()展示了将 Wi-Fi service 挂到 MCP server 的标准姿势esp_service_manager_config_t mgr_cfg ESP_SERVICE_MANAGER_CONFIG_DEFAULT(); esp_service_manager_create(mgr_cfg, mgr); esp_wifi_service_mcp_schema_get(wifi_schema); // 内嵌工具描述 JSON esp_service_registration_t wifi_reg { .service (esp_service_t *)wifi_service, .category network, .tool_desc wifi_schema, .tool_invoke esp_wifi_service_tool_invoke, }; esp_service_manager_register(mgr, wifi_reg);随后在CONFIG_ESP_MCP_TRANSPORT_UART下创建 UART transport 与 MCP serverserver_name wifi-service-example并启动。这样外部主机即可通过串口以 JSON-RPC 行协议调用 Wi-Fi 工具实现无网络状态下的远程配网与管理。6. 自动化测试佐证例程配套的 pytest_esp_wifi_service_example.py 会在 esp32 / esp32s3 双目标上验证启动日志先匹配Create Wi-Fi service skeleton with \d agents再匹配Start Wi-Fi service。组件级测试位于 esp_wifi_service/test_apps覆盖 profile manager、provisioning、selector、MCP 与存储等单元逻辑可作为深入研读的入口。故障排除BluFi agent 未创建BluFi 只有在启用对应 ESP-IDF Bluetooth BluFi 选项时才会被编译进工程对应CONFIG_WIFI_SERVICE_PROV_BLUFI_ENABLE及其依赖。请使用idf.py set-target esp32或idf.py set-target esp32s3让目标相关 defaults 生效然后检查Wi-Fi Service配网菜单与 ESP-IDF Bluetooth 菜单。找不到配网 SoftAP当前例程没有设置http_cfg.softapHTTP agent 会使用默认的ESP_SVC_XXXXXXSoftAP 名称。测试时如需固定 AP 名称和密码请在 main/app_main.c 中配置http_cfg.softap.ssid和http_cfg.softap.password。HTTP 配网页面没有自动弹出部分操作系统不会稳定弹出 captive portal 页面。连接配网 SoftAP 后可手动打开浏览器访问设备网关地址默认网关通常为192.168.4.1以实际日志为准。重新烧录后 profile 仍然存在profile 保存在 NVS 中普通应用烧录不会清除。可使用以下任一方式清除wifi profile clear或idf.py erase-flash总结wifi_service_example是理解 ADFesp_wifi_service组件的最佳入口它以服务化方式把凭据加密存储、多通道配网、自动选择、质量监测与远程管理整合进一个统一的 service 接口天然适合需要现场配网、持久化凭据、自动重连与集中事件管理的量产 IoT 设备。通过本文的编译配置、CLI 操作、MCP 冒烟测试与源码级解析你可以快速把该例程跑起来并在此基础上按产品需求定制 SoftAP、selector 策略、STA 参数乃至自定义配网通道。相关阅读组件完整 API 与 HTTP REST 接口详见 esp_wifi_service 组件 README单元测试见 esp_wifi_service/test_apps。赞分享音视频音频处理嵌入式物联网语音【免费下载链接】esp-adfEspressif Advanced Development Framework for Multimedia Applications项目地址https://gitcode.com/gh_mirrors/es/esp-adf点击查看免费下载相关推荐esp-adf Wi-Fi Service 全解析多通道配网、Profile 管理与智能网络选择esp adf Wi Fi Service 全解析多通道配网、Profile 管理与智能网络选择 esp adf 的 Wi Fi Service 将设备联网流音视频音频处理嵌入式物联网语音小智xiaozhi-esp32BluFi 配网完全指南基于 esp-wifi-connect 的 BLE Wi-Fi 配网实战小智xiaozhi esp32BluFi 配网完全指南基于 esp wifi connect 的 BLE Wi Fi 配网实战 本文档面向使用小智xia人工智能大模型语音交互助手嵌入式物联网智能硬件MCP 服务Ventoy 字体手把手教程3 分钟换掉启动菜单模糊字Ventoy 字体手把手教程3 分钟换掉启动菜单模糊字 半夜重装系统U 盘一插屏幕上的启动菜单字号小得像蚂蚁看两分钟眼睛就酸。读完这篇 Ventoy 字操作系统固件开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OpenClaw(龙虾助手)微信完整对接指南(2026最新版):TaoToken 统一 Key 打通企业微信网关

OpenClaw(龙虾助手)微信完整对接指南(2026最新版):TaoToken 统一 Key 打通企业微信网关

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 17:11:17 阅读更多 →
深度学习项目避坑指南:机器学习策略与误差分析实战

深度学习项目避坑指南:机器学习策略与误差分析实战

1. 从一份“翻车”的模型说起:为什么需要机器学习策略很多人做深度学习项目时,习惯一上来就调网络结构、换优化器、加数据增强,觉得只要模型够深、数据够多,效果就一定能上去。我刚开始做项目时也是这个思路,结果有一次…

2026/10/15 17:11:17 阅读更多 →
终端自动进入 bash 环境怎么办?Ubuntu shell 切换与启动脚本排查指南

终端自动进入 bash 环境怎么办?Ubuntu shell 切换与启动脚本排查指南

打开终端自动进入 bash 环境,放在以前我压根不会觉得是个问题——Ubuntu 默认 shell 就是 bash,这不是天经地义的事吗?直到我自己换了 zsh,又开始用 fish,再连续帮几位朋友排查同一个现象:明明 chsh 都改了…

2026/10/15 17:11:17 阅读更多 →

最新新闻

PHP微交易源码解析:高频轻量级金融系统实战指南

PHP微交易源码解析:高频轻量级金融系统实战指南

简介:本资源是一套基于PHP开发的微盘微交易系统完整源码,面向Web开发者、金融系统学习者及PHP中级以上技术人员,用于快速搭建小额外汇或虚拟货币类交易平台,掌握高频交易系统核心模块设计。压缩包共4362个文件,主体为2…

2026/10/15 21:05:09 阅读更多 →
Python+OpenCV手势识别实战:源码拆解与调参避坑指南

Python+OpenCV手势识别实战:源码拆解与调参避坑指南

简介:基于Python与OpenCV的手势识别课程设计源代码材料,面向计算机视觉初学者及需要完成图像处理类课题的学生。项目以PyCharm为集成环境,完整演示了调用电脑摄像头按帧采集图像、镜像翻转处理、HSV肤色检测、高斯滤波、轮廓查找、凹凸点计算…

2026/10/15 21:05:09 阅读更多 →
政务统一身份认证隐私保护:数据定级、脱敏与不可逆加密落地指南

政务统一身份认证隐私保护:数据定级、脱敏与不可逆加密落地指南

简介:《C0131国家政务服务平台统一身份认证隐私保护要求》是国家政务服务平台统一身份认证体系的重要规范文件,面向政务平台建设者、系统运维人员及信息安全合规人员,解决自然人身份信息在收集、保存、共享、销毁等环节的隐私保护与分级管控问…

2026/10/15 21:05:09 阅读更多 →
CMMI V2.0不是打分表,而是工程能力诊断框架

CMMI V2.0不是打分表,而是工程能力诊断框架

简介:本资源为CMMI能力成熟度模型集成V2.0官方中文完整版PDF文档,面向项目管理从业者、过程改进工程师、质量体系负责人及企业数字化转型推进人员,旨在提供一套权威、系统、可落地的过程改进路线图。文档由CMMI研究院主导开发,覆盖…

2026/10/15 21:05:09 阅读更多 →
把一条业务线从 0 做到上线后,我提了离职

把一条业务线从 0 做到上线后,我提了离职

缘起则聚,缘尽则散。 天下没有不散的宴席。入职刚满一年,我做了一个决定:走。 不是一时冲动,是想了很久之后的"说走就走"。一、这一年,我做了什么 前四个月。 接手一个已经启动、但还没跑通的项目&#xff0…

2026/10/15 21:05:09 阅读更多 →
5G前传链路损伤仿真测试:eCPRI/RoE在25GbE下的时延、丢包与抖动实战

5G前传链路损伤仿真测试:eCPRI/RoE在25GbE下的时延、丢包与抖动实战

5G前传链路的验证工作,十个人里有九个都是在功能测试上跑得风生水起,但一谈到损伤(impairment)场景,就含糊其辞——“这个我们后面再说”“不影响正常业务就行”。可真实网络不是实验室,光纤被挖断、光模块…

2026/10/15 21:04:08 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →