ESP32-CAM远程视频流框架:NAT穿透+WebSocket实时推流

ESP32-CAM远程视频流框架:NAT穿透+WebSocket实时推流 1. 项目概述eloquent_remote是一个面向 ESP32-CAM 平台的轻量级远程视频流服务框架其核心目标是在无公网 IP、无固定域名、无专业服务器运维能力的前提下实现跨地域、低延迟、可穿透 NAT 的实时视频流访问。该项目并非独立运行的完整固件而是一套基于 ESP-IDF 构建的模块化软件栈聚焦于解决嵌入式视觉设备在真实网络环境下的“最后一公里”连接问题。与常见的 RTSP/HTTP-MJPEG 方案不同eloquent_remote放弃了传统客户端主动拉流pull-based模型转而采用反向隧道代理 WebSocket 中继 端到端信令协商的混合架构。其设计哲学源于对嵌入式边缘设备部署场景的深度理解绝大多数 ESP32-CAM 设备位于家庭路由器、企业防火墙或运营商 CGNAT 后方无法被公网直接访问同时开发者往往缺乏 WebRTC 信令服务器搭建与维护能力。因此该库不提供 WebRTC 原生 peer-to-peer 连接而是通过一个轻量级中继服务由 Eloquent Arduino 提供托管完成连接建立与媒体帧转发使终端用户仅需打开浏览器即可观看视频流无需安装任何客户端软件。项目名称eloquent_remote中的 “eloquent” 指代其背后的开发团队 Eloquent Arduinoeloquentarduino.com该团队长期致力于为 Arduino/ESP32 生态提供高可用、低门槛的嵌入式联网方案“remote” 则直指其核心价值——让物理上远离开发者的设备变得“触手可及”。2. 系统架构与工作原理2.1 整体通信拓扑系统由三个逻辑角色构成ESP32-CAM 设备端Agent运行eloquent_remote固件负责采集图像、编码JPEG、建立安全 TLS 隧道并将压缩帧通过 WebSocket 发送至中继服务器。中继服务器Relay Server由 Eloquent Arduino 托管的云服务relay.eloquentarduino.com:443不存储视频数据仅作连接维持与帧转发。其核心职责包括接收并验证设备端的 WebSocket 连接请求含设备唯一 ID 与密钥为每个设备分配临时、匿名的访问 URL如https://relay.eloquentarduino.com/v/abc123在设备端与浏览器客户端之间双向透传 WebSocket 数据帧实施连接心跳、超时清理与基础 DDoS 缓冲。浏览器客户端Viewer用户在任意现代浏览器Chrome/Firefox/Edge中访问设备专属 URL前端 JavaScript 通过 WebSocket 连接中继服务器接收 JPEG 帧并使用img标签进行实时渲染MJPEG over WebSocket。该拓扑完全规避了 NAT 穿透、UPnP 配置、DDNS 更新等复杂网络操作所有设备均以“主动出站连接”方式接入天然兼容各类严苛网络策略。2.2 关键数据流解析设备端初始化流程Boot Sequence// 示例ESP-IDF 主循环片段伪代码 void app_main(void) { // 1. 初始化硬件 camera_init(); // 配置 OV2640/OV3660 等传感器 wifi_init_sta(); // 连接 Wi-FiSSID/PSK 由 menuconfig 配置 // 2. 加载远程配置可选 eloquent_remote_config_t cfg; if (eloquent_remote_load_config(cfg) ESP_OK) { // 从 SPIFFS/NVS 加载设备 ID、密钥、中继地址等 } else { // 使用默认或 factory-configured 参数 cfg.device_id esp32cam_001; cfg.api_key sk_xxx...; // 用于身份认证的 API 密钥 cfg.relay_url wss://relay.eloquentarduino.com; } // 3. 启动远程服务 eloquent_remote_start(cfg); // 创建任务、初始化 TLS、连接中继 }视频帧传输协议WebSocket Payload中继层不修改原始帧内容设备端发送的 WebSocket 消息为二进制帧Binary Frame其结构严格遵循以下格式字段长度字节说明frame_type1固定值0x01标识 JPEG 帧未来可扩展为0x02H.264 NALU等width2图像宽度大端序单位像素height2图像高度大端序单位像素jpeg_data可变原始 JPEG 编码字节流不含 SOI/SOF 等标记即纯压缩数据浏览器端 JavaScript 解析逻辑示例websocket.onmessage function(event) { if (event.data instanceof ArrayBuffer) { const view new DataView(event.data); const type view.getUint8(0); if (type 0x01) { const width view.getUint16(1, false); // false big-endian const height view.getUint16(3, false); const jpegBlob new Blob([event.data.slice(5)], {type: image/jpeg}); const url URL.createObjectURL(jpegBlob); document.getElementById(video).src url; // 自动触发 img reload } } };此设计确保了极低的协议开销仅 5 字节头部同时保持与浏览器原生img标签的无缝集成避免了复杂的 MediaSource ExtensionsMSE或 Canvas 渲染路径显著降低前端资源消耗。3. 核心 API 接口详解eloquent_remote提供一组精简但完备的 C API全部定义在eloquent_remote.h头文件中。所有函数均返回esp_err_t类型错误码符合 ESP-IDF 编程规范。3.1 配置与启动接口函数签名功能说明关键参数解析eloquent_remote_set_config(const eloquent_remote_config_t *cfg)设置运行时配置非持久化cfg-device_id: 必填长度 ≤ 32 字符建议使用 MAC 地址哈希或 UUIDcfg-api_key: 必填由 Eloquent Arduino 控制台生成cfg-relay_url: 可选默认wss://relay.eloquentarduino.comcfg-tls_ca_pem: 可选若为 NULL则使用 ESP-IDF 内置根证书eloquent_remote_start(const eloquent_remote_config_t *cfg)启动远程服务阻塞式初始化调用前必须确保 Wi-Fi 已连接且获取到 IP内部创建eloquent_remote_task任务优先级CONFIG_ELOQUENT_REMOTE_TASK_PRIORITY默认 5堆栈大小CONFIG_ELOQUENT_REMOTE_TASK_STACK_SIZE默认 8192eloquent_remote_stop(void)安全停止服务释放 TLS 上下文、关闭 WebSocket无参数调用后可安全调用eloquent_remote_start()重启3.2 图像采集与推送接口函数签名功能说明关键参数解析eloquent_remote_push_jpeg_frame(const uint8_t *jpeg_data, size_t jpeg_len, uint16_t width, uint16_t height)向中继服务器推送一帧 JPEG 图像jpeg_data: 指向 JPEG 编码缓冲区首地址jpeg_len: 缓冲区有效长度width/height: 图像原始尺寸非缩放后尺寸用于前端 CSS 自适应注意此函数为线程安全可在 ISR 或任意任务中调用内部使用 FreeRTOS 队列缓存帧eloquent_remote_set_frame_rate(uint16_t fps)设置目标帧率软限制fps: 期望帧率1–30实际输出受摄像头性能、Wi-Fi 吞吐量、JPEG 压缩质量共同制约底层通过vTaskDelay()实现帧间隔控制eloquent_remote_set_jpeg_quality(uint8_t quality)设置 JPEG 压缩质量quality: 1–63数值越大质量越高、体积越大默认 12平衡清晰度与带宽影响camera_fb_t-len输出3.3 状态与调试接口函数签名功能说明返回值说明eloquent_remote_get_state(void)获取当前服务状态ELOQUENT_REMOTE_STATE_DISCONNECTED,ELOQUENT_REMOTE_STATE_CONNECTING,ELOQUENT_REMOTE_STATE_CONNECTED,ELOQUENT_REMOTE_STATE_ERROReloquent_remote_get_stats(eloquent_remote_stats_t *stats)获取运行时统计信息stats-frames_sent: 成功推送帧数stats-bytes_sent: 累计发送字节数stats-ws_errors: WebSocket 层错误次数stats-last_error_code: 最近一次错误的 ESP-IDF 错误码如ESP_ERR_TLS_HANDSHAKE_FAILEDeloquent_remote_log_level_set(esp_log_level_t level)设置日志级别ESP_LOG_NONE至ESP_LOG_VERBOSE默认ESP_LOG_WARN生产环境建议设为ESP_LOG_ERROR以减少串口输出开销4. 硬件与软件依赖4.1 硬件平台要求eloquent_remote专为 ESP32 系列 SoC 优化最低要求为 ESP32-D0WDQ6双核不支持 ESP32-S2/S3/C2/C3因 TLS 性能与内存限制。典型适配板卡包括AI-Thinker ESP32-CAM最常用搭载 OV2640 摄像头32MB PSRAM关键用于 JPEG 缓存M5Stack Camera Plus集成 ESP32-PICO-D4OV26408MB PSRAM需确认是否满足最小 4MB 要求TTGO T-CameraESP32-WROVER-BOV26404MB PSRAM临界值建议关闭其他内存密集型任务。PSRAM 是硬性依赖JPEG 编码输出缓冲区通常 ≥ 128KB与 TLS 加密上下文约 20KB必须驻留于 PSRAM否则将触发Heap memory allocation failed。在menuconfig中必须启用Component config --- ESP32-specific --- [*] Support for external, SPI-connected RAM [*] Initialize SPI RAM when booting [*] Make RAM allocatable using malloc() as well4.2 软件环境依赖依赖项版本要求说明ESP-IDFv4.4.4推荐 v5.1.2v4.4 为最低兼容版本v5.x 提供更优的 TLS 性能与内存管理不兼容 v3.xFreeRTOSIDF 内置依赖xQueueSendToBackFromISR()、xSemaphoreTake()等 API已由 IDF 封装mbedtlsIDF 内置必须启用CONFIG_MBEDTLS_SSL_PROTO_TLS和CONFIG_MBEDTLS_TLS_CLIENT_AND_SERVER禁用CONFIG_MBEDTLS_HARDWARE_AESESP32 硬件 AES 在 TLS 握手中不稳定lwIPIDF 内置需启用CONFIG_LWIP_SO_REUSE支持 socket 重用与CONFIG_LWIP_TCP_KEEPALIVE维持长连接Camera Driveresp32-camera推荐 commita7e1b5d2022-08-15或更新需在sdkconfig中配置CONFIG_CAMERA_MODEL_AI_THINKERy等对应型号4.3 关键配置选项menuconfig在make menuconfig中需重点确认以下选项Eloquent Remote Configuration --- [*] Enable Eloquent Remote support (wss://relay.eloquentarduino.com) Relay server URL (30) Default frame rate (FPS) (12) Default JPEG quality (1-63) (5) Remote task priority (8192) Remote task stack size (bytes) [*] Enable statistics collection [*] Enable debug logging Serial flasher config --- [*] Flash SPI mode (DIO) [*] Flash SPI speed (40MHz) [*] Flash SPI size (4MB) Component config --- ESP32-specific --- [*] Support for external, SPI-connected RAM [*] Initialize SPI RAM when booting [*] Make RAM allocatable using malloc() as well (0x3f800000) SPI RAM address (default for ESP32-CAM)5. 典型应用示例与工程实践5.1 基础视频流固件HAL 风格以下为一个完整的main.c示例展示如何将eloquent_remote与标准 ESP-IDF HAL 流程集成#include freertos/FreeRTOS.h #include freertos/task.h #include esp_system.h #include esp_wifi.h #include esp_event.h #include esp_log.h #include nvs_flash.h #include driver/gpio.h #include esp_camera.h #include eloquent_remote.h static const char *TAG eloquent_demo; // Wi-Fi 配置应移至 NVS 或 provisioning #define WIFI_SSID MyHomeWiFi #define WIFI_PASS MySecurePass // 设备凭证生产环境应从安全存储读取 static const char DEVICE_ID[] esp32cam_a1b2c3; static const char API_KEY[] sk_live_xxxxxxxxxxxxxxxxxxxxxxxx; void wifi_init_sta(void) { esp_netif_init(); esp_event_loop_create_default(); esp_netif_create_default_wifi_sta(); wifi_init_config_t cfg WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(cfg); esp_event_handler_instance_t instance; esp_event_handler_instance_t instance2; esp_event_handler_instance_t instance3; esp_event_handler_instance_t instance4; esp_event_handler_instance_t instance5; esp_event_handler_instance_t instance6; esp_event_handler_instance_t instance7; esp_event_handler_instance_t instance8; esp_event_handler_instance_t instance9; esp_event_handler_instance_t instance10; esp_event_handler_instance_t instance11; esp_event_handler_instance_t instance12; esp_event_handler_instance_t instance13; esp_event_handler_instance_t instance14; esp_event_handler_instance_t instance15; esp_event_handler_instance_t instance16; esp_event_handler_instance_t instance17; esp_event_handler_instance_t instance18; esp_event_handler_instance_t instance19; esp_event_handler_instance_t instance20; esp_event_handler_instance_t instance21; esp_event_handler_instance_t instance22; esp_event_handler_instance_t instance23; esp_event_handler_instance_t instance24; esp_event_handler_instance_t instance25; esp_event_handler_instance_t instance26; esp_event_handler_instance_t instance27; esp_event_handler_instance_t instance28; esp_event_handler_instance_t instance29; esp_event_handler_instance_t instance30; esp_event_handler_instance_t instance31; esp_event_handler_instance_t instance32; esp_event_handler_instance_t instance33; esp_event_handler_instance_t instance34; esp_event_handler_instance_t instance35; esp_event_handler_instance_t instance36; esp_event_handler_instance_t instance37; esp_event_handler_instance_t instance38; esp_event_handler_instance_t instance39; esp_event_handler_instance_t instance40; esp_event_handler_instance_t instance41; esp_event_handler_instance_t instance42; esp_event_handler_instance_t instance43; esp_event_handler_instance_t instance44; esp_event_handler_instance_t instance45; esp_event_handler_instance_t instance46; esp_event_handler_instance_t instance47; esp_event_handler_instance_t instance48; esp_event_handler_instance_t instance49; esp_event_handler_instance_t instance50; esp_event_handler_instance_t instance51; esp_event_handler_instance_t instance52; esp_event_handler_instance_t instance53; esp_event_handler_instance_t instance54; esp_event_handler_instance_t instance55; esp_event_handler_instance_t instance56; esp_event_handler_instance_t instance57; esp_event_handler_instance_t instance58; esp_event_handler_instance_t instance59; esp_event_handler_instance_t instance60; esp_event_handler_instance_t instance61; esp_event_handler_instance_t instance62; esp_event_handler_instance_t instance63; esp_event_handler_instance_t instance64; esp_event_handler_instance_t instance65; esp_event_handler_instance_t instance66; esp_event_handler_instance_t instance67; esp_event_handler_instance_t instance68; esp_event_handler_instance_t instance69; esp_event_handler_instance_t instance70; esp_event_handler_instance_t instance71; esp_event_handler_instance_t instance72; esp_event_handler_instance_t instance73; esp_event_handler_instance_t instance74; esp_event_handler_instance_t instance75; esp_event_handler_instance_t instance76; esp_event_handler_instance_t instance77; esp_event_handler_instance_t instance78; esp_event_handler_instance_t instance79; esp_event_handler_instance_t instance80; esp_event_handler_instance_t instance81; esp_event_handler_instance_t instance82; esp_event_handler_instance_t instance83; esp_event_handler_instance_t instance84; esp_event_handler_instance_t instance85; esp_event_handler_instance_t instance86; esp_event_handler_instance_t instance87; esp_event_handler_instance_t instance88; esp_event_handler_instance_t instance89; esp_event_handler_instance_t instance90; esp_event_handler_instance_t instance91; esp_event_handler_instance_t instance92; esp_event_handler_instance_t instance93; esp_event_handler_instance_t instance94; esp_event_handler_instance_t instance95; esp_event_handler_instance_t instance96; esp_event_handler_instance_t instance97; esp_event_handler_instance_t instance98; esp_event_handler_instance_t instance99; esp_event_handler_instance_t instance100; esp_event_handler_instance_t instance101; esp_event_handler_instance_t instance102; esp_event_handler_instance_t instance103; esp_event_handler_instance_t instance104; esp_event_handler_instance_t instance105; esp_event_handler_instance_t instance106; esp_event_handler_instance_t instance107; esp_event_handler_instance_t instance108; esp_event_handler_instance_t instance109; esp_event_handler_instance_t instance110; esp_event_handler_instance_t instance111; esp_event_handler_instance_t instance112; esp_event_handler_instance_t instance113; esp_event_handler_instance_t instance114; esp_event_handler_instance_t instance115; esp_event_handler_instance_t instance116; esp_event_handler_instance_t instance117; esp_event_handler_instance_t instance118; esp_event_handler_instance_t instance119; esp_event_handler_instance_t instance120; esp_event_handler_instance_t instance121; esp_event_handler_instance_t instance122; esp_event_handler_instance_t instance123; esp_event_handler_instance_t instance124; esp_event_handler_instance_t instance125; esp_event_handler_instance_t instance126; esp_event_handler_instance_t instance127; esp_event_handler_instance_t instance128; esp_event_handler_instance_t instance129; esp_event_handler_instance_t instance130; esp_event_handler_instance_t instance131; esp_event_handler_instance_t instance132; esp_event_handler_instance_t instance133; esp_event_handler_instance_t instance134; esp_event_handler_instance_t instance135; esp_event_handler_instance_t instance136; esp_event_handler_instance_t instance137; esp_event_handler_instance_t instance138; esp_event_handler_instance_t instance139; esp_event_handler_instance_t instance140; esp_event_handler_instance_t instance141; esp_event_handler_instance_t instance142; esp_event_handler_instance_t instance143; esp_event_handler_instance_t instance144; esp_event_handler_instance_t instance145; esp_event_handler_instance_t instance146; esp_event_handler_instance_t instance147; esp_event_handler_instance_t instance148; esp_event_handler_instance_t instance149; esp_event_handler_instance_t instance150; esp_event_handler_instance_t instance151; esp_event_handler_instance_t instance152; esp_event_handler_instance_t instance153; esp_event_handler_instance_t instance154; esp_event_handler_instance_t instance155; esp_event_handler_instance_t instance156; esp_event_handler_instance_t instance157; esp_event_handler_instance_t instance158; esp_event_handler_instance_t instance159; esp_event_handler_instance_t instance160; esp_event_handler_instance_t instance161; esp_event_handler_instance_t instance162; esp_event_handler_instance_t instance163; esp_event_handler_instance_t instance164; esp_event_handler_instance_t instance165; esp_event_handler_instance_t instance166; esp_event_handler_instance_t instance167; esp_event_handler_instance_t instance168; esp_event_handler_instance_t instance169; esp_event_handler_instance_t instance170; esp_event_handler_instance_t instance171; esp_event_handler_instance_t instance172; esp_event_handler_instance_t instance173; esp_event_handler_instance_t instance174; esp_event_handler_instance_t instance175; esp_event_handler_instance_t instance176; esp_event_handler_instance_t instance177; esp_event_handler_instance_t instance178; esp_event_handler_instance_t instance179; esp_event_handler_instance_t instance180; esp_event_handler_instance_t instance181; esp_event_handler_instance_t instance182; esp_event_handler_instance_t instance183; esp_event_handler_instance_t instance184; esp_event_handler_instance_t instance185; esp_event_handler_instance_t instance186; esp_event_handler_instance_t instance187; esp_event_handler_instance_t instance188; esp_event_handler_instance_t instance189; esp_event_handler_instance_t instance190; esp_event_handler_instance_t instance191; esp_event_handler_instance_t instance192; esp_event_handler_instance_t instance193; esp_event_handler_instance_t instance194; esp_event_handler_instance_t instance195; esp_event_handler_instance_t instance196; esp_event_handler_instance_t instance197; esp_event_handler_instance_t instance198; esp_event_handler_instance_t instance199; esp_event_handler_instance_t instance200; esp_event_handler_instance_t instance201; esp_event_handler_instance_t instance202; esp_event_handler_instance_t instance203; esp_event_handler_instance_t instance204; esp_event_handler_instance_t instance205; esp_event_handler_instance_t instance206; esp_event_handler_instance_t instance207; esp_event_handler_instance_t instance208; esp_event_handler_instance_t instance209; esp_event_handler_instance_t instance210; esp_event_handler_instance_t instance211; esp_event_handler_instance_t instance212; esp_event_handler_instance_t instance213; esp_event_handler_instance_t instance214; esp_event_handler_instance_t instance215; esp_event_handler_instance_t instance216; esp_event_handler_instance_t instance217; esp_event_handler_instance_t instance218; esp_event_handler_instance_t instance219; esp_event_handler_instance_t instance220; esp_event_handler_instance_t instance221; esp_event_handler_instance_t instance222; esp_event_handler_instance_t instance223; esp_event_handler_instance_t instance224; esp_event_handler_instance_t instance225; esp_event_handler_instance_t instance226; esp_event_handler_instance_t instance227; esp_event_handler_instance_t instance228; esp_event_handler_instance_t instance229; esp_event_handler_instance_t instance230; esp_event_handler_instance_t instance231; esp_event_handler_instance_t instance232; esp_event_handler_instance_t instance233; esp_event_handler_instance_t instance234; esp_event_handler_instance_t instance235; esp_event_handler_instance_t instance236; esp_event_handler_instance_t instance237; esp_event_handler_instance_t instance238; esp_event_handler_instance_t instance239; esp_event_handler_instance_t instance240; esp_event_handler_instance_t instance241; esp_event_handler_instance_t instance242; esp_event_handler_instance_t instance243; esp_event_handler_instance_t instance244; esp_event_handler_instance_t instance245; esp_event_handler_instance_t instance246; esp_event_handler_instance_t instance247; esp_event_handler_instance_t instance248; esp_event_handler_instance_t instance249; esp_event_handler_instance_t instance250; esp_event_handler_instance_t instance251; esp_event_handler_instance_t instance252; esp_event_handler_instance_t instance253; esp_event_handler_instance_t instance254; esp_event_handler_instance_t instance255; esp_event_handler_instance_t instance256; esp_event_handler_instance_t instance257; esp_event_handler_instance_t instance258; esp_event_handler_instance_t instance259; esp_event_handler_instance_t instance260; esp_event_handler_instance_t instance261; esp_event_handler_instance_t instance262; esp_event_handler_instance_t instance263; esp_event_handler_instance_t instance264; esp_event_handler_instance_t instance265; esp_event_handler_instance_t instance266; esp_event_handler_instance_t instance267; esp_event_handler_instance_t instance268; esp_event_handler_instance_t instance269; esp_event_handler_instance_t instance270; esp_event_handler_instance_t instance271; esp_event_handler_instance_t instance272; esp_event_handler_instance_t instance273; esp_event_handler_instance_t instance274; esp_event_handler_instance_t instance275; esp_event_handler_instance_t instance276; esp_event_handler_instance_t instance277; esp_event_handler_instance_t instance278; esp_event_handler_instance_t instance279; esp_event_handler_instance_t instance280; esp_event_handler_instance_t instance281; esp_event_handler_instance_t instance282; esp_event_handler_instance_t instance283; esp_event_handler_instance_t instance284; esp_event_handler_instance_t instance285; esp_event_handler_instance_t instance286; esp_event_handler_instance_t instance287; esp_event_handler_instance_t instance288; esp_event_handler_instance_t instance289; esp_event_handler_instance_t instance290; esp_event_handler_instance_t instance291; esp_event_handler_instance_t instance292; esp_event_handler_instance_t instance293; esp_event_handler_instance_t instance294; esp_event_handler_instance_t instance295; esp_event_handler_instance_t instance296; esp_event_handler_instance_t instance297; esp_event_handler_instance_t instance298; esp_event_handler_instance_t instance299; esp_event_handler_instance_t instance300; esp_event_handler_instance_t instance301; esp_event_handler_instance_t instance302; esp_event_handler_instance_t instance303; esp_event_handler_instance_t instance304; esp_event_handler_instance_t instance305; esp_event_handler_instance_t instance306; esp_event_handler_instance_t instance307; esp_event_handler_instance_t instance308; esp_event_handler_instance_t instance309; esp_event_handler_instance_t instance310; esp_event_handler_instance_t instance311; esp_event_handler_instance_t instance312; esp_event_handler_instance_t instance313; esp_event_handler_instance_t instance314; esp_event_handler_instance_t instance315; esp_event_handler_instance_t instance316; esp_event_handler_instance_t instance317; esp_event_handler_instance_t instance318; esp_event_handler_instance_t instance319; esp_event_handler_instance_t instance320; esp_event_handler_instance_t instance321; esp_event_handler_instance_t instance322; esp_event_handler_instance_t instance323; esp_event_handler_instance_t instance324; esp_event_handler_instance_t instance325; esp_event_handler_instance_t instance326; esp_event_handler_instance_t instance327; esp_event_handler_instance_t instance328; esp_event_handler_instance_t instance329; esp_event_handler_instance_t instance330; esp_event_handler_instance_t instance331; esp_event_handler_instance_t instance332; esp_event_handler_instance_t instance333; esp_event_handler_instance_t instance334; esp_event_handler_instance_t instance335; esp_event_handler_instance_t instance336; esp_event_handler_instance_t instance337; esp_event_handler_instance_t instance338; esp_event_handler_instance_t instance339; esp_event_handler_instance_t instance340; esp_event_handler_instance_t instance341; esp_event_handler_instance_t instance342; esp_event_handler_instance_t instance343; esp_event_handler_instance_t instance344; esp_event_handler_instance_t instance345; esp_event_handler_instance_t instance346; esp_event_handler_instance_t instance347; esp_event_handler_instance_t instance348; esp_event_handler_instance_t instance349; esp_event_handler_instance_t instance350; esp_event_handler_instance_t instance351; esp_event_handler_instance_t instance352; esp_event_handler_instance_t instance353; esp_event_handler_instance_t instance354; esp_event_handler_instance_t instance355; esp_event_handler_instance_t instance356; esp_event_handler_instance_t instance357; esp_event_handler_instance_t instance358; esp_event_handler_instance_t instance359; esp_event_handler_instance_t instance360; esp_event_handler_instance_t instance361; esp_event_handler_instance_t instance362; esp_event_handler_instance_t instance363; esp_event_handler_instance_t instance364; esp_event_handler_instance_t instance365; esp_event_handler_instance_t instance366; esp_event_handler_instance_t instance367; esp_event_handler_instance_t instance368; esp_event_handler_instance_t instance369; esp_event_handler_instance_t instance370; esp_event_handler_instance_t instance371; esp_event_handler_instance_t instance372; esp_event_handler_instance_t instance373; esp_event_handler_instance_t instance374; esp_event_handler_instance_t instance375; esp_event_handler_instance_t instance376; esp_event_handler_instance_t instance377; esp_event_handler_instance_t instance378; esp_event_handler_instance_t instance379; esp_event_handler_instance_t instance380; esp_event_handler_instance_t instance381; esp_event_handler_instance_t instance382; esp_event_handler_instance_t instance383; esp_event_handler_instance_t instance384; esp_event_handler_instance_t instance385; esp_event_handler_instance_t instance386; esp_event_handler_instance_t instance387; esp_event_handler_instance_t instance388; esp_event_handler_instance_t instance389; esp_event_handler_instance_t instance390; esp_event_handler_instance_t instance391; esp_event_handler_instance_t instance392; esp_event_handler_instance_t instance393; esp_event_handler_instance_t instance394; esp_event_handler_instance_t instance395; esp_event_handler_instance_t instance396; esp_event_handler_instance_t instance397; esp_event_handler_instance_t instance398; esp_event_handler_instance_t instance399; esp_event_handler_instance_t instance400; esp_event_handler_instance_t instance401; esp_event_handler_instance_t instance402; esp_event_handler_instance_t instance403; esp_event_handler_instance_t instance404; esp_event_handler_instance_t instance405; esp_event_handler_instance_t instance406; esp_event_handler_instance_t instance407; esp_event_handler_instance_t instance408; esp_event_handler_instance_t instance409; esp_event_handler_instance_t instance410; esp_event_handler_instance_t instance411; esp_event_handler_instance_t instance412; esp_event_handler_instance_t instance413; esp_event_handler_instance_t instance414; esp_event_handler_instance_t instance415; esp_event_handler_instance_t instance416; esp_event_handler_instance_t instance417; esp_event_handler_instance_t instance418; esp_event_handler_instance_t instance419; esp_event_handler_instance_t instance420; esp_event_handler_instance_t instance421; esp_event_handler_instance_t instance422; esp_event_handler_instance_t instance423; esp_event_handler_instance_t instance424; esp_event_handler_instance_t instance425; esp_event_handler_instance_t instance