软硬件条件
硬件条件
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 = ""; // 将接收到的字符清空
}
}