# my_async_tcp components for IDF - 苦于使用乐鑫官方http组件时存在部分问题无法解决,通过学习AsyncTCP库设计思路,基于ESP IDF v5.4.0平台,利用LWIP raw API设计了这个异步TCP服务组件。本组件采用事件驱动架构、对客户端对象及事件进行资源池化管理,提供非阻塞式操作,提高了并发能力。受现有条件影响,只使用了ESP32C3进行测试。  <!-- 实际使用时可替换为架构图 --> ## 目录 - [核心特性](#核心特性) - [快速开始](#快速开始) - [API参考](#api参考) - [编译配置](#编译配置) - [内存管理](#内存管理) - [贡献指南](#贡献指南) - [其他事项](#其他事项) - [许可证](#许可证) --- ## 核心特性 ### 客户端功能 - **异步连接**:支持IP/域名两种连接方式 - **数据流控制**:窗口大小动态调整 - **ACK超时检测**:可配置应答超时阈值 - **延迟确认**:支持TCP延迟ACK优化 - **Nagle算法**:可选启用/禁用低延迟模式 - **事件回调**:连接/断开/数据/错误全生命周期事件 ### 服务器功能 - **事件池、连接池预分配**:减少动态内存分配 - **并发控制**:可配置最大backlog队列 - **连接回收**:自动重置客户端状态 - **统一事件循环**:单任务处理所有I/O事件 ### 系统特性 - **零拷贝设计**:pbuf直接传递减少内存复制 - **线程安全队列**:带互斥锁保护的事件队列 - **LWIP原生集成**:直接操作tcp_pcb控制块 --- ## 快速开始 ### 依赖项 - ESP-IDF 5.4.0+ ### 基础用法 ``` // 最小服务器示例 #include "AsyncClient.hpp" #include "AsyncServer.hpp" void setup() { AsyncServer server(8080); server.set_connected_handler([](void*, AsyncClient* client) { client->set_data_received_handler([](void*, AsyncClient* c, const char* data, size_t len) { c->write(data, len); // echo服务器 }); }); server.begin(); } ``` ## API参考 ### AsyncClient类 #### 连接管理 1. 通过IP地址建立连接:connect(ip_addr_t, uint16_t) 2. 通过域名建立连接:connect(const char*, uint16_t) 3. 优雅关闭/强制终止连接:close(bool force=false) #### 数据操作 1. 发送原始数据:write(const void*, size_t) 2. 缓冲发送模式:add()/send() 3. 手动确认接收数据:ack(size_t len) ### AsyncServer类 #### 服务器控制 1. 启动监听:begin() 2. 关闭服务器:end() 3. 获取服务器状态:get_connection_state() #### 配置 1. 全局Nagle算法开关:set_nodelay(bool) ## 编译配置 1. ACK超时时间(ms):CONFIG_ASYNC_MAX_ACK_TIME 2. 最大等待连接数:CONFIG_SERVER_BACKLOG_LEN 3. 客户端对象池大小:CONFIG_CLIENT_POOL_LEN 4. 事件队列深度:CONFIG_EVENTS_QUEUE_LEN 5. 建议增大WatchDog超时时间,以防止多并发条件下处理超时; ## 内存管理 ### 对象生命周期 1. 客户端实例(服务器使用时):由服务器对象池统一管理; 2. pbuf处理:在接收回调中必须调用ack()或手动pbuf_free(); 3. 事件处理:由事件池自动化分配、回收; ## 贡献指南 1. 本牛马目前仅能以业余时间开发、测试开发板只有非官方ESP32C3,软件未进行充分测试,如有问题请告知; 2. 欢迎提供各类支持; ## 许可证 ``` /* * 本组件根据本人理解,在IDF v5.4.0 版本上实现,采用乐鑫代码风格不兼容原作者的API。 * Hristo Gochkov 的异步 TCP 库 (https://github.com/me-no-dev/AsyncTCP) * 原代码版权遵循 GNU LGPL 2.1 许可 * * 本代码版权声明: * Copyright (c) 2023 小林同学. All rights reserved. * Apache License 2.0 © 2023 小林同学 ```
idf.py add-dependency "smallin/my_async_tcp^1.0.0"