ESP32 学习日志(6)——TCP客户端应用


一、应用简介

用户可以通过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 日

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值