本实验使用 ESP32 通过 STA 模式实现 TCP 的客户端通信。 这个实验的代码为工程“4_5_wifi_TcpClient”目录。
4.5.1. 实验内容
(1) 在 STA 模式下,电脑是 TCP 服务器,ESP32 开发板是 TCP 客户端实现通信。
4.5.2. TCP 通信简介
请回头看 4.4.2,这个实验我们实现的是框图的左边部分(TCP 客户端):
4.5.3. ESP32 函数介绍
这个实验也是使用到的标准 socket 接口,函数的参数和 window 上一致,如下:
新建 socket 函数:socket();
连接函数:connect();
关闭 socket 函数:close();
接收数据函数:recv();
发送数据函数:send();
4.5.4. 代码讲解
使用 vs code 展开本实验的工程目录,如下图:
我们的这个实验,components 文件夹下的 LCD 是显示屏的驱动代码,在 3.4 章有比较详情的讲解,文 件夹 wifi 是如何启动 AP 或者 STA 连接,另外的 wifi 就是本章要讲的 TCP client 实现,程序的入口依然是在 main 下的 app_main.c 文件里。
下面按照程序启动的流程讲解。
(1) 程序启动
在 app_main 主函数里,启动了 WiFi 的 STA 模式,然后创建了一个 TCP 的连接任务。
//用户函数入口,相当于 main 函数 void app_main()
{
......
wifi_init_sta();//启动 WIFI 的 STA
//新建一个 tcp 连接任务
xTaskCreate(&tcp_client_connect, "tcp_client_connect", 4096, NULL, 5, NULL);
}
关于 STA 模式的使用,我们这里不再讲解,在头文件 user_wifi.h 里,有以下的宏定义,在做实验的时 候一定要注意,需要根据实际情况去修改。
#define DEFAULT_SSID "TP_LINK" //STA 模式要接入 WIFI 名称
#define DEFAULT_PWD "12345678" //要接入 wifi 对应的密码
(2) 启动 TCP 客户端任务
在源文件 user_wifi.c 里,wifi 的事件回调函数里等待 wifi 的网络创建成功,通过设置事件通知任务去 连接 TCP 服务器,关键代码如下:
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
......
case SYSTEM_EVENT_STA_GOT_IP:
......
//启动 TCP 客户端连接
xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT); break;
......
}
TCP 连接任务里,分三步实现 TCP 客户端,首先是等待 wifi 网络的连接,接着创建 TCP client,最后创 建接收数据任务。
//TCP client 任务
void tcp_client_connect(void *pvParameters)
{
......
while (1)
{
g_rxtx_need_restart = false;
//第一步:等待 WIFI 连接
xEventGroupWaitBits(tcp_event_group, WIFI_CONNECTED_BIT, false, true, portMAX_DELAY);
......
//第二步:建立 client
int socket_ret = create_tcp_client();
if (socket_ret == ESP_FAIL)
{
......
}
else
{
//建立成功
ESP_LOGI(TAG, "create tcp socket succeed...");
//第三步:建立 tcp 接收数据任务
if (pdPASS != xTaskCreate(&client_recv_data, "client_recv_data", 4096, NULL, 4, &tx_rx_task))
......
}
......
}
(3) 创建 TCP 客户端
通过 2 步实现的 TCP 客户端:新建 socket 和 connect,最后得到了通信的 socket:connect_socket, 用于接收/发送数据。
//创建 TCP client
esp_err_t create_tcp_client()
{
......
//第一步:新建 socket
connect_socket = socket(AF_INET, SOCK_STREAM, 0);
......
//第二步:连接服务器
if (connect(connect_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
......
}
(4) 启动接收的任务
TCP 接收数据任务里调用了 recv 接收数据,然后收到的数据通过 LOG 输出到串口后,再原路返回到发 送方。
//TCP 接收数据任务
void client_recv_data(void *pvParameters)
{
......
while (1)
{
......
//读取接收数据
len = recv(connect_socket, databuff, sizeof(databuff), 0); if (len > 0)
{
//收到的数据在 databuff 里,长度为 len
//可以在这里增加处理
//本实验是原路返回数据
//接收数据回发
send(connect_socket, databuff, strlen(databuff), 0);
}
else
{
......
}
}
......
}
4.5.5. 实验过程
通过 wifi 的 STA 模式实现 TCP 客户端,首先要按下图修改 user_wifi.h,修改要连接的 AP 和密码:
接着修改服务器的 IP 和端口号,修改之后就可以按之前的方法编绎和下载了。
配置下载串口、波特率、编绎和程序下载的详细过程请往回看 3.1.4,在这个实验里都是一笔带过。 (1) 把开发板通过 USB 线接到电脑上,通过设备管理器查看生成的串口。开发板在我们演示电脑上生
成的是 COM3。
(2) 在 menuconfig 菜单里配置下载程序串口。提供的例程配置的串口是 COM3,波特率为 921600。
(3) 通过 make all 编绎工程。
(4) 当编绎通过之后,使用命令 make flash 把程序下载到开发板上。或者参考 2.3.2 节,使用工具 下载。
(5) 使用串口工具打开开发板生成的串口,默认的波特率是 115200。 串口工具在目录:.\开发软件\串口工具-sscom32.rar。
(6) 打开按下开发板的复位键,让程序运行起来,当 ESP32 连接上我们设置的 AP 后,显示屏显示连接的 wifi 名称是:TP_LINK,密码是:12345678,ESP32 开发板分配的 IP:
192.168.1.102,TCP 服务器的 IP 是:192.168.1.90,端口是:10000。
(7) 这一点特别重要。上一步说的 TCP 服务器 IP 就是做实验的电脑 IP,要求电脑和 ESP32 是连接在 同一个路中器下,通过电脑可以 ping 通 ESP32 开发板。
注:如果查看到的 IP 不是之前设置的 IP,需要重新设置并下载程序。
(8) 在电脑上打开网络调试助手,软件位于目录:\开发软件\网络调试助手.rar,解压后打开设置如 下图实验:
(9) 实验过程中,注意查看第 5 步的串口输出。
最后推荐一款开发套件,可以手淘扫码查看。