9. ESP32-TCP服务端(Arduino)

将ESP32设置为TCP服务器

介绍


TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的(一个客户端对应一个服务端)、可靠的传输层协议。在TCP的工作原理中,它会将消息或文件分解为更小的片段,称为数据包,然后通过Internet发送。这些数据包被TCP层接收后,重新组合成完整的文件或消息。此外,为了确保数据的传递成功,TCP还会对数据流进行错误检查。如果发现错误,TCP会请求重新传输丢失或损坏的数据包。

基本方法


ESP32设置为TCP服务器的流程:

  1. 包含必要的库:
    在Arduino项目中,首先需要包含与ESP32和网络通信相关的必要库:

    #include <Arduino.h>
    #include <WiFi.h>
    
  2. 配置网络参数:
    设置用于ESP32访问点(Access Point,AP)的网络参数,如SSID(Wi-Fi名称)和密码。

    const char *ssid = "esp32_tcp";
    const char *password = "987654321";
    
  3. 创建TCP服务器对象:
    使用WiFiServer类创建一个TCP服务器对象,并指定服务器监听的端口。

    WiFiServer server(1133);
    

    这里的1133是服务器监听的端口号,你可以根据需要选择一个未被占用的端口。

  4. 设置服务器:
    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地址。

  5. 处理客户端连接和通信:
    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相关的一些重要函数和类的总结:

  1. WiFiServer 类:

    • 构造函数: WiFiServer(uint16_t port)
    • 成员函数:
      • begin(): 启动服务器,开始监听指定端口。
      • available(): 检查是否有客户端请求连接,返回一个 WiFiClient 对象表示新的连接。
      • status(): 返回服务器状态。
      • stop(): 关闭服务器。
  2. 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(): 关闭连接。
  3. 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);
  }
}

串口发送且得到返回
在这里插入图片描述

  • 26
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于您的问题 "esp32 tcp_server",我可以为您提供以下信息: ESP32是一款低功耗的WiFi和蓝牙双模模块,可以用于物联网和嵌入式应用开发。要创建一个TCP服务器,您需要使用ESP-IDF(ESP32 IoT Development Framework)中的API来设置和管理网络连接。 以下是一个简单的示例代码,用于在ESP32上创建一个TCP服务器: ```cpp #include <WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; WiFiServer server(80); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { Serial.println("New client connected"); while (client.connected()) { if (client.available()) { String request = client.readStringUntil('\r'); Serial.println(request); client.println("Hello from ESP32 TCP Server"); delay(10); client.stop(); Serial.println("Client disconnected"); } } } } ``` 在这个示例中,您需要将"your_SSID"和"your_PASSWORD"替换为您的WiFi网络的名称和密码。代码将连接到WiFi网络,并在端口80上创建一个TCP服务器。当有客户端连接时,它将打印请求并向客户端发送"Hello from ESP32 TCP Server"消息。 请注意,这只是一个简单的示例,您可以根据您的需求进行修改和扩展。您还可以使用ESP-IDF提供的其他功能来进行更复杂的TCP服务器开发。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值