使用Wi-Fi实现ESP32与手机网络助手进行TCP数据收发

在ESP32板块,开发环境搭建完成的基础上,做一个简单的TCP客户端与服务器端的数据收发实验,开发环境是基于乐鑫官方IDF,Linux环境下发开,本实验有助于对例程的理解和应用。

实验前期准备:在手机上下载一个“网络调试助手”APP,并做如下设置。

1.Server地址为自动分配

2.设置手机为Server

3.设置端口号8080,可设置其他

使用Wi-Fi实现ESP32与手机网络助手进行TCP数据收发_第1张图片

实验总体概述:

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收发数据结果

使用Wi-Fi实现ESP32与手机网络助手进行TCP数据收发_第2张图片

手机Server收发数据结果

使用Wi-Fi实现ESP32与手机网络助手进行TCP数据收发_第3张图片

你可能感兴趣的:(ESP32开发)