1. ESP32网络通信基础:TCP与UDP协议解析
作为一名嵌入式开发者,我经常需要在ESP32上实现网络通信功能。TCP和UDP作为最常用的两种传输层协议,在实际项目中各有其适用场景。ESP32通过内置的lwIP协议栈提供了完整的TCP/IP网络协议支持,让我们能够轻松实现各种网络应用。
在ESP32开发中,理解TCP和UDP的核心差异至关重要。TCP就像打电话,需要先建立连接,确保对方能听到你说的每句话;而UDP则像发短信,直接发送不管对方是否收到。这种根本差异决定了它们在不同应用场景中的表现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. TCP协议在ESP32上的实现
2.1 TCP协议核心特性
TCP(传输控制协议)是一种面向连接的可靠传输协议,它通过多种机制确保数据准确无误地到达目的地:
- 三次握手连接建立:确保通信双方都准备好传输数据
- 序列号和确认应答:为每个数据包编号,接收方需要确认收到
- 滑动窗口机制:动态调整发送速率,匹配接收方处理能力
- 拥塞控制算法:包括慢启动、拥塞避免等机制,防止网络过载
- 错误检测和重传:通过校验和发现错误数据并自动重传
在ESP32上,这些复杂机制都由lwIP协议栈自动处理,开发者只需通过简单的Socket API就能使用这些功能。
2.2 ESP32 TCP客户端实现详解
让我们看一个完整的TCP客户端实现示例。这个例子展示了如何连接到远程TCP服务器并交换数据:
c复制#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
#include "esp_netif.h"
#include "esp_log.h"
#define PORT 1234
#define HOST_IP "192.168.1.100"
void tcp_client_task(void *pvParameters)
{
char rx_buffer[128];
char payload[] = "Hello from ESP32 TCP Client";
// 设置目标服务器地址
struct sockaddr_in dest_addr = {
.sin_addr.s_addr = inet_addr(HOST_IP),
.sin_family = AF_INET,
.sin_port = htons(PORT)
};
// 创建TCP socket
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock < 0) {
ESP_LOGE("TCP", "Failed to create socket");
vTaskDelete(NULL);
return;
}
// 连接到服务器
if (connect(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) != 0) {
ESP_LOGE("TCP", "Failed to connect to server");
close(sock);
vTaskDelete(NULL);
return;
}
// 发送数据
if (send(sock, payload, strlen(payload), 0) < 0) {
ESP_LOGE("TCP", "Send failed");
close(sock);
vTaskDelete(NULL);
return;
}
// 接收数据
int len = recv(sock, rx_buffer, sizeof(rx_buffe
