目录
前言
使用VSCODE+ESP-IDF 实现ESP32的TCP客户端和TCP服务端通信
一、新建工程
配置ESP32连接的网络
二、修改代码
修改tcp_client.c的代码如下
/* BSD Socket API Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <string.h>
#include <sys/param.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "protocol_examples_common.h"
#include "addr_from_stdin.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
/*注意修改这里TCP连接的IP地址和端口号*/
#if defined(CONFIG_EXAMPLE_IPV4)
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV4_ADDR
#elif defined(CONFIG_EXAMPLE_IPV6)
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV6_ADDR
#else
#define HOST_IP_ADDR ""
#endif
#define PORT CONFIG_EXAMPLE_PORT
static const char *TAG = "example";
static const char *payload = "hello world\r\n";
typedef struct
{
unsigned char TCP_ClientTag[1024 * 100];
// unsigned char TCP_DataBuffer[50];
char *pData;
} _TCP_Data ;
_TCP_Data TCP_Data;
void tcp_client_task(void *pvParameters)
{
char rx_buffer[128];
char host_ip[] = HOST_IP_ADDR;
int addr_family = 0;
int ip_protocol = 0;
while (1) {
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr(host_ip);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(PORT);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
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, connecting to %s:%d", host_ip, PORT);
int err = connect(sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));
if (err != 0) {
ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
break;
}
ESP_LOGI(TAG, "Successfully connected");
// int err = 0;
static unsigned int SendDataCnt = 0;
static unsigned int Time1 = 0;
static unsigned int Time2 = 0;
while (1) {
unsigned int LocalUserID = 1;
unsigned int FarUserID = 2;
unsigned int DataLen = 1024 * 40;
TCP_Data.TCP_ClientTag[0] = 0xA1;
TCP_Data.TCP_ClientTag[1] = 0xA2;
TCP_Data.TCP_ClientTag[2] = LocalUserID;
TCP_Data.TCP_ClientTag[3] = LocalUserID>>8;
TCP_Data.TCP_ClientTag[4] = LocalUserID>>16;
TCP_Data.TCP_ClientTag[5] = LocalUserID>>24;
TCP_Data.TCP_ClientTag[6] = FarUserID;
TCP_Data.TCP_ClientTag[7] = FarUserID>>8;
TCP_Data.TCP_ClientTag[8] = FarUserID>>16;
TCP_Data.TCP_ClientTag[9] = FarUserID>>24;
TCP_Data.TCP_ClientTag[10] = DataLen;
TCP_Data.TCP_ClientTag[11] = DataLen>>8;
TCP_Data.TCP_ClientTag[12] = DataLen>>16;
TCP_Data.TCP_ClientTag[13] = DataLen>>24;
TCP_Data.TCP_ClientTag[14] = 0xA3;
TCP_Data.TCP_ClientTag[15] = 0xA4;
// strcpy(&TCP_Data.TCP_DataBuffer,payload);
err = send(sock,&TCP_Data,1024 * 100, 0);
//send(sock,payload,strlen(payload), 0);
if (err < 0) {
ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
break;
}
Time2 = esp_log_timestamp();
SendDataCnt+=err;
if((Time2 - Time1) > 1000)
{
float TCP_Speed = ((float)SendDataCnt)/((float)(Time2 - Time1)/1000.0f); /*bytes/s*/
ESP_LOGI(TAG,"TCP speed = %f kb/s\r\n",TCP_Speed / 1024.0f);
Time1 = Time2;
SendDataCnt = 0;
}
// int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
// // Error occurred 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, host_ip);
// ESP_LOGI(TAG, "%s", rx_buffer);
// }
vTaskDelay(1);//1 / portTICK_PERIOD_MS
}
if (sock != -1) {
ESP_LOGE(TAG, "Shutting down socket and restarting...");
shutdown(sock, 0);
close(sock);
}
}
vTaskDelete(NULL);
}
void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
/* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
* Read "Establishing Wi-Fi or Ethernet Connection" section in
* examples/protocols/README.md for more information about this function.
*/
ESP_ERROR_CHECK(example_connect());
xTaskCreate(tcp_client_task, "tcp_client", 4096, NULL, 5, NULL);
}
编译下载后
三、测试
随便下载一个TCP/UDP网络助手TCP/UDP网络助手
需要注意的是,买的模块质量参差不齐,距离远的时候可能会连接不到WIFI,或者通信的速度非常的慢!巨坑!!!