TCP/IP组件
ESP系列提供了实现TCP/IP协议栈的库函数,#include <esp_netif.h>
即可使用这些库函数
特点如下:
- 提供TCP/IP协议栈的应用抽象层
- 提供线程保护
- 目前只用于lwIP TCP/IP协议栈(lwIP:Light Weight IP Protocol,支持在嵌入式设备中使用的小型TCP/IP协议栈,占用内存较少)
- 具有丰富的API库函数
- 大多数情况下,应用程序不需要直接调用组件的API,而是从默认的网络事件处理函数中调用
- 不兼容idf4.1以下使用的TCP/IP适配器相关函数,需修改代码进行迁移
ESP-NETIF结构如下(摘自官方文档)
1 | | (A) USER CODE | |
其中……代表初始化;—->—或—<—-代表数据包走向;******代表操作系统的事件调用;|代表用户代码的设置和运行时的配置
配置方法
初始化
- 初始化IO驱动
- 创建一个ESP-NETIF的实例并进行如下配置:
- 特殊属性
- 网络协议栈相关设置
- IO设置
- 将IO驱动句柄和NETIF实例关联
- 配置事件处理函数,至少需要:
- 默认处理函数:用于普通的来自IO驱动器或其他特殊的接口的事件调用
- register处理函数:用故意相关联的应用程序事件调用
运行时配置
- 获取当前TCP/IP设置
- 收取IP事件
- 控制应用程序的FSM
配置的实例
WiFi默认初始化
使用
1 | esp_netif_t *esp_netif_create_default_wifi_ap(void);//初始化wifi为ap模式 |
两个API进行默认状态的wifi初始化,函数会返回对应的esp-netif实例
注意:创建的实例如果不再运行时需要停止并释放内存空间,且不能被多次创建
如果需要使用AP+STA模式,两个接口都需要被创建
相关库函数
- 初始化
1 | esp_netif_init(void);//初始化组件 |
- 配置
1 | esp_netif_set_driver_config(esp_netif_t *esp_netif, const esp_netif_driver_ifconfig_t *driver_config); |
- 使用
1 | esp_netif_receive(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb); |
- 事件处理函数
1 | esp_wifi_set_default_wifi_sta_handlers(void); |
- 默认设置
1 | esp_netif_create_default_wifi_ap(void); |
HTTP Server组件
HTTP Server 组件提供了在 ESP32 上运行轻量级 Web 服务器的功能
使用步骤:
- 使用httpd_start()创建HTTP Server的实例
API会根据具体配置为其分配内存和资源,该函数返回指向服务器实例的指针(句柄)
服务器使用两个套接字,其中一个用于监听HTTP流量(TCP类型),一个用来处理控制信号(UDP类型),它们在服务器的任务循环中轮流使用。TCP 流量被解析为 HTTP 请求,根据请求的 URI (Uniform Resource Identifier统一资源标志符,表示web上每一种可用的资源)来调用用户注册的处理程序,在处理程序中需要发送回 HTTP 响应数据包。
URI通常由三部分组成:资源的命名机制;存放资源的主机名;资源自身的名称。另外,常说的URL是URI的一个子集(Uniform Resource Locator统一资源定位符),URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,URL的格式由三部分组成:第一部分是协议(或称为服务方式);第二部分是存有该资源的主机IP地址(有时也包括端口号);第三部分是主机资源的具体地址,如目录和文件名等。第一部分和第二部分用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。
使用结构体httpd_config_t来配置服务器的各种设定(任务优先级、堆栈大小)
API和结构体如下所示
1 | httpd_start(httpd_handle_t *handle, const httpd_config_t *config);//开启HTTP服务器并分配内存资源 |
- 配置URI处理程序
使用httpd_register_uri_handler()完成
1 | //API原型 |
通过传入httpd_uri_t结构体类型的对象来注册 URI 处理程序
- 使用httpd_stop()函数停止HTTP服务器
该API会根据传入的句柄停止服务器并释放相关联的内存和资源。这是一个阻塞函数——首先给服务器任务发送停止信号,然后等待其终止。期间服务器任务会关闭所有已打开的连接,删除已注册的 URI 处理程序,并将所有会话的上下文数据重置为空。
1 | esp_err_t httpd_stop(httpd_handle_t handle);//根据传入的服务器句柄停止指向的服务器 |
可以使用以下的代码来安全地停止服务器
1 | //示例应用 |
应用实例
1 | /* URI 处理函数,在客户端发起 GET /uri 请求时被调用 */ |