在ESP32板块,开发环境搭建完成的基础上,做一个简单的TCP客户端与服务器端的数据收发实验,开发环境是基于乐鑫官方IDF,Linux环境下发开,本实验有助于对例程的理解和应用。
实验前期准备:在手机上下载一个“网络调试助手”APP,并做如下设置。
1.Server地址为自动分配
2.设置手机为Server
3.设置端口号8080,可设置其他
实验总体概述:
Step1:ESP32 Wi-Fi设置为STA模式,将其连接到路由器(AP)上
Step2:使用IPv4,TCP协议,ESP32作为Client
Step3:将手机连接到同一个路由器上,使手机IP与ESP32 STA IP处于同一个网段下,我的即是192.168.1,并设置为Server(准备阶段已完成)
Step4:实现Client和Server间数据的收发
实验具体实现:
参考官方IDF,例程目录esp\esp-idf\examples\protocols\sockets\tcp_client
Client端实现的关键代码分析,初始化Wi-Fi配置,设置为sta模式,ssid为连接AP名,password为密码
#define EXAMPLE_WIFI_SSID "2-401-meeting"
#define EXAMPLE_WIFI_PASS "1122334455"
/*sta结构体关键成员初始化*/
wifi_config_t wifi_config =
{
.sta =
{
.ssid = EXAMPLE_WIFI_SSID,
.password = EXAMPLE_WIFI_PASS,
},
};
配置TCP网络协议栈,设置Server地址(我的即为192.168.1.112),端口号8080
#define HOST_IP_ADDR "192.168.1.112" //Server IP address
#define PORT 8080
#define IPPROTO_IP 0
struct sockaddr_in destAddr;
destAddr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
destAddr.sin_family = AF_INET;
destAddr.sin_port = htons(PORT);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
Client客户端socket实现代码,首先创建socket描述符,然后连接server
while(1)
{
/* 创建socket */
int sock = socket(addr_family, SOCK_STREAM, ip_protocol);
if (sock < 0)
{
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
break;
}
ESP_LOGI(TAG, "Socket created");
/* 连接server */
int err = connect(sock, (struct sockaddr *)&destAddr, sizeof(destAddr));
if (err != 0)
{
ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
break;
}
ESP_LOGI(TAG, "Successfully connected");
}
Client收发数据,完整代码可查看IDF相关例程
while (1)
{
/* 发送数据 */
int err = send(sock, payload, strlen(payload), 0);
if (err < 0)
{
ESP_LOGE(TAG, "Error occured during sending: errno %d", errno);
break;
}
/* 接收数据 */
int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
// Error occured during receiving
if (len < 0)
{
ESP_LOGE(TAG, "recv failed: errno %d", errno);
break;
}
// Data received
else
{
rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string
ESP_LOGI(TAG, "Received %d bytes from %s:", len, addr_str);
ESP_LOGI(TAG, "%s", rx_buffer);
}
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
在Linux终端中使用命令make monitor(在工程所在目录下的脚本命令),观察Client收发数据结果
手机Server收发数据结果