ESP32 UDP通信

软硬件条件

硬件条件

ESP-WROOM-32

软件条件

Arduino IDE

AP STA

首先,我们先简单介绍一下WIFI的两种模式: AP 和 STA

STA

STA站点模式,每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。

简单来说,当ESP32配置为STA站点模式时,ESP32 应连接到接入点(路由器),比如 : 家里的WIFI, 手机热点等。

AP

AP,也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就一个AP。

简单来说,当ESP32配置为AP模式时,此时该ESP32相当于一个路由器,其他ESP32(包括手机,电脑)可以连入这个ESP32。

AP STA: 参考链接

UDP

网上关于UDP协议介绍有很多,这里就不做相关介绍了,下面直接来看代码实现。

代码实现

服务器部分

在服务器部分中,我们把ESP32配置为AP模式,便于其他ESP32直接接入此ESP32,无需开手机热点,或连接其他网络。

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP Udp; //  创建udp

const char *ssid = "ESP32_WIFI";   // 服务器名称
const char *password = "12345678"; // 服务器密码

IPAddress local_IP(192, 168, 144, 10); // IP地址
IPAddress gateway(192, 168, 144, 1);   // 网关
IPAddress subnet(255, 255, 255, 0);    // 网络掩码

char Rdata[255];      // 接收客户端发送的字符串
String readUART = ""; // 接收串口字符串

unsigned int localPort = 2023; // 通讯端口

//WIFI初始化
void initWiFi()
{
    WiFi.mode(WIFI_AP);                           // 设置WIFI站点模式为AP
    WiFi.softAPConfig(local_IP, gateway, subnet); // 设置IP地址
    WiFi.softAP(ssid, password);
    WiFi.softAPsetHostname("ESP32"); // 设置主机名字
    Serial.print("IP location:");
    Serial.println(WiFi.softAPIP());
    Udp.begin(localPort); // 启动Udp监听服务

}

void setup()
{
    // ESP32串口0初始化
    Serial.begin(115200);
    // WIFI初始化
    initWiFi();
}

void loop()
{
    int data = Udp.parsePacket();
    if (data > 0)
    {
        Serial.printf("Received %d byte %s, port %d \n", data, Udp.remoteIP().toString().c_str(), Udp.remotePort()); // 串口接收到 的数据  发送端IP
        Udp.read(Rdata, 255);
        Serial.printf(Rdata);
    }
    data = 0;
    if (Serial.available())  //将串口接收到的数据发给 最近一次发送数据给服务器的客户端
    {
        readUART = Serial.readString();
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
        Udp.print(readUART);
        Udp.endPacket();
        readUART = "";
    }
}


客户端部分

在客户端部分中,我们把ESP32配置为STA模式,直接接入到服务器中。

#include <WiFi.h>
#include <WiFiUdp.h> //调用WIFIUDP库
#define LED 2        // LED引脚

WiFiUDP Udp; // 创建wifiUdp

char Rdata[255];      // 接收服务器发送的字符串
String readUART = ""; // 串口接收存储的字符串

unsigned int localPort = 2023;     // 通讯端口 需与服务器相同
const char *ssid = "ESP32_WIFI";   // 服务器设置的名称
const char *password = "12345678"; //  服务器设置的密码

IPAddress ipServer(192, 168, 144, 10); // 服务器IP地址设置
IPAddress ipCliente(192, 168, 144, 20);  // 与服务器不同的IP
IPAddress Subnet(255, 255, 255, 0);    // 网关掩码

// WIFI 初始化
void WiFi_init()
{
  WiFi.mode(WIFI_STA);                  // 将WiFi设置为STA站点模式
  WiFi.begin(ssid, password);           // 打开WIFI,连接到家里的路由器
  while (WiFi.status() != WL_CONNECTED) // 等待连接
  {
  }
  digitalWrite(LED, HIGH);                  // LED亮
  WiFi.config(ipCliente, ipServer, Subnet); // 设置WIFI连接的本机IP和服务器IP,和网络掩码
  Udp.begin(localPort);                     // 打开端口
}

// 串口 初始化
void Serial_init()
{
  Serial.begin(115200); // 串口波特率设置115200
}

// LED 初始化
void LED_init()
{
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW); // LED灭
}

void setup()
{
  Serial_init();
  LED_init();
  WiFi_init();
}

void loop()
{
  int udp_data = Udp.parsePacket(); // 接收收到的数据包大小
  if (udp_data)                     // 判断是否有数据
  {
    Serial.printf("Received %d byte %s, port %d\n", udp_data, Udp.remoteIP().toString().c_str(), Udp.remotePort()); // 串口输出接收到的数据数量,发送客户端的IP和端口
    Udp.read(Rdata, 255);                                                                                        // 读取接收到的数据
    Serial.printf(Rdata);                                                                                        // 串口输出接收到的数据
  }
  if (Serial.available()) // 判断串口是否有数据
  {
    readUART = Serial.readString();         // 读取串口发送来的字符串
    Udp.beginPacket(ipServer, localPort); // 准备发送数据包,设置对应的IP地址和端口的客户端
    Udp.print(readUART);                    // 将要发送的数据发送给客户端
    Udp.endPacket();                        // 结束发送
    readUART = "";                          // 将接收到的字符清空
  }
}


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值