将ESP32设置为TCP服务器
介绍
TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的(一个客户端对应一个服务端)、可靠的传输层协议。在TCP的工作原理中,它会将消息或文件分解为更小的片段,称为数据包,然后通过Internet发送。这些数据包被TCP层接收后,重新组合成完整的文件或消息。此外,为了确保数据的传递成功,TCP还会对数据流进行错误检查。如果发现错误,TCP会请求重新传输丢失或损坏的数据包。
基本方法
ESP32设置为TCP服务器的流程:
-
包含必要的库:
在Arduino项目中,首先需要包含与ESP32和网络通信相关的必要库:#include <Arduino.h> #include <WiFi.h>
-
配置网络参数:
设置用于ESP32访问点(Access Point,AP)的网络参数,如SSID(Wi-Fi名称)和密码。const char *ssid = "esp32_tcp"; const char *password = "987654321";
-
创建TCP服务器对象:
使用WiFiServer 类创建一个TCP服务器对象,并指定服务器监听的端口。WiFiServer server(1133);
这里的
1133 是服务器监听的端口号,你可以根据需要选择一个未被占用的端口。 -
设置服务器:
在setup() 函数中进行服务器的初始化和启动。void setup() { Serial.begin(115200); WiFi.softAP(ssid, password); server.begin(); Serial.print("IP:");// 串口打印AP_IP Serial.println(WiFi.softAPIP()); }
这里,
WiFi.softAP(ssid, password) 将ESP32配置为访问点,server.begin() 启动TCP服务器,并使用Serial.println(WiFi.softAPIP()) 打印ESP32的IP地址。 -
处理客户端连接和通信:
在loop() 函数中,通过server.available() 检查是否有新的客户端连接。如果有新连接,通过WiFiClient 对象处理通信。void loop() { // 循环检测有无客户端 有请求-能连接-有数据 WiFiClient client = server.available();// client指向发出请求的客户端对象 if (client) { // 处理新客户端连接 while (client.connected()) { if (client.available()) {//检测有无数据可读 // 处理客户端发送的数据 char val = client.read();// 读取一个字节数据 Serial.println(val); client.print(val); // 回发数据给客户端 } } } else { client.stop(); delay(2000); } }
server.available(); 此函数用于检查是否有客户端试图连接到服务器。如果有客户端可用,它将返回一个WiFiClient 对象,表示新的客户端连接。如果没有客户端试图连接,则返回一个WiFiClient 对象,其值为false。
在循环检测新的客户端连接,如果有新连接,就在连接建立的状态下处理客户端发送的数据。
常用API
ESP32的Arduino核心库(Arduino core for ESP32)提供了一组用于TCP通信的API。以下是关于ESP32 Arduino库中与TCP相关的一些重要函数和类的总结:
-
WiFiServer 类:
- 构造函数:
WiFiServer(uint16_t port) - 成员函数:
begin() : 启动服务器,开始监听指定端口。available() : 检查是否有客户端请求连接,返回一个WiFiClient 对象表示新的连接。status() : 返回服务器状态。stop() : 关闭服务器。
- 构造函数:
-
WiFiClient 类:
- 构造函数:
WiFiClient() - 成员函数:
connect(IPAddress ip, uint16_t port) : 连接到指定IP地址和端口的服务器。connect(const char *host, uint16_t port) : 连接到指定主机名和端口的服务器。connected() : 检查是否与服务器建立了连接。available() : 检查是否有数据可用于读取。read() : 读取一个字节的数据。readBytes(char *buffer, size_t length) : 读取指定长度的数据。print() /println() : 向服务器发送数据。stop() : 关闭连接。
- 构造函数:
-
WiFi 操作相关:
WiFi.softAP(ssid, password) : 将ESP32配置为Access Point(热点)。WiFi.softAPIP() : 获取ESP32 Access Point的IP地址。WiFi.localIP() : 获取ESP32的本地IP地址。
这些是ESP32 Arduino核心库中与TCP通信相关的一些重要函数和类。详细的文档可以查看ESP32 Arduino文档。
完整程序和测试效果
#include <Arduino.h> #include <WiFi.h> // ESP32作为tcp服务端,手机或者电脑的调试助手 // 作为客户端,进行通信 const char *ssid = "esp32_tcp"; const char *password = "987654321"; // tcp服务端对象 WiFiServer server(1133); void setup() { Serial.begin(115200); WiFi.softAP(ssid, password); server.begin(); // 串口打印AP_IP Serial.print("IP:"); Serial.println(WiFi.softAPIP()); } void loop() { // 循环检测有无客户端 有请求-能连接-有数据 WiFiClient client = server.available(); // client指向发出请求的客户端对象 if (client) { Serial.println("新客户端."); Serial.println(client.localIP()); while (client.connected()) { // 连接成功进入循环 if (client.available())//检测有无数据可读 { char val = client.read(); // 读取一个字节数据 Serial.println(val); client.print(val); // 回发数据给客户端 } } } else { client.stop(); delay(2000); } }
串口发送且得到返回