一、应用简介
用户可以通过ESP32提供的API来创建TCP客户端。本文介绍ESP32中创建TCP客户端以及与服务器之间的数据收发。
二、TCP客户端
2.1 创建客户端
#include "esp_log.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>
#include "freertos/task.h"
static void tcpClientRecvTask(void *pvParameters);
/****************************************
* DEFINITIONS
*/
#define TCP_PORT 8003
#define TCP_SERVER_ADRESS "192.168.102.199"
/*****************************************
* LOCAL VARIABLES
*/
// 打印标识
static const char *s_tcpClientTag = "tcp_client";
// 连接套接字
static int s_connectSocket = 0;
// 连接标志1-连接0-未连接
static int s_ifTcpConnect = 0;
/*****************************************
* LOCAL FUNCTIONS
*/
/**
@brief 创建TCP客户端
@param 无
@return 无
*/
static void createTcpClient(void)
{
struct sockaddr_in server_addr;
ESP_LOGI(s_tcpClientTag, "will connect ");
//新建socket
s_connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (s_connectSocket < 0)
{
//新建失败后,关闭新建的socket,等待下次新建
close(s_connectSocket);
return ;
}
//配置连接服务器信息:端口+ip
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(TCP_PORT);
server_addr.sin_addr.s_addr = inet_addr(TCP_SERVER_ADRESS);
ESP_LOGI(s_tcpClientTag, "connectting server...");
//连接服务器
if (connect(s_connectSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
ESP_LOGE(s_tcpClientTag, "connect failed!");
//连接失败后,关闭之前新建的socket,等待下次新建
close(s_connectSocket);
return;
}
ESP_LOGI(s_tcpClientTag, "connect success!");
s_ifTcpConnect = 1;
// 开启接收任务
xTaskCreate(tcpClientRecvTask, "tcp_client_recv", 9216, NULL, 5, NULL);
}
/**
@brief TCP客户端接收数据任务
@param pvParameters -[in] 任意参数
@return 无
*/
static void tcpClientRecvTask(void *pvParameters)
{
int len = 0;
uint8_t databuff[1024];
while(1)
{
//每次接收都要清空接收数组
memset(databuff, 0x00, sizeof(databuff));
len = recv(s_connectSocket, databuff, sizeof(databuff), 0);
//打印接收到的数组
if(len > 0)
{
ESP_LOGI(s_tcpClientTag, "recvData: %s\n", databuff);
}
else
{
vTaskDelay(1 * 100 / portTICK_RATE_MS);
}
}
vTaskDelete(NULL);
}
/**
@brief TCP发送数据
@param pData -[in] 发送数据
@return 无
*/
void TcpSendData(char *pData)
{
if(s_ifTcpConnect == 1)
{
send(s_connectSocket, pData, strlen(pData), 0);
}
}
• 由 青梅煮久 写于 2020 年 12 月 23 日