# 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"