IT评测·应用市场-qidao123.com

标题: WIFI毗连与通讯 [打印本页]

作者: 篮之新喜    时间: 2025-1-19 17:12
标题: WIFI毗连与通讯
'' 不要期待运气降临, 应该去努力把握知识 ''  ——  弗莱明
ESP32-S3 支持 2.4 GHz 的 Wi-Fi 4(802.11n)标准,提供高达 150 Mbps 的数据传输速率。它支持 STA(Station)模式、AP(Access Point)模式和 Wi-Fi 直连(Wi-Fi Direct)模式,可以机动地毗连到其他设备或创建自身的网络。ESP32-S3 还支持硬件加速的 Wi-Fi 加密算法,包括 WPA/WPA2-PSK 和 WPA3-SAE 加密。这使得加密息争密数据的速率更快,提高了系统的整体性能和安全性。
Wi-Fi 库支持设置及监控 ESP32 Wi-Fi 连网功能。
它有三种模式:
常用API先容

下面是一些 ESP32S3 Arduino 库中常用的 Wi-Fi 相关函数的先容:
​                          该函数用于毗连到已经存在的Wi-Fi 网络。须要提供要毗连的网络的 SSID 和暗码作为参数
STA模式

STA 模式下,ESP32-S3会创建 Wi-Fi 毗连,毗连到一个已经创建好的 Wi-Fi 热点上,通过该热点来访问互联网。STA 模式使用的场景比较多,比如在智能家居、物联网设备以及工业控制等范畴中,设备须要通过 Wi-Fi 毗连到网络来传递数据。
示例:毗连外部WIF,当毗连乐成时,通过Serial串口输出IP地址
  1. #include <WiFi.h>
  2. #define LED 48
  3. // 定义 要连接的 Wi-Fi 名与密码
  4. const char* ssid = "LEDC"; // 这是我手机热点
  5. const char* password = "12345678"; // 热点的密码
  6. void setup() {
  7.     Serial.begin(115200);//串口调试
  8.     // 先断开之前的连接
  9.     WiFi.disconnect(true);
  10.     // 连接 Wi-Fi
  11.     WiFi.begin(ssid, password);
  12.     Serial.print("正在连接 Wi-Fi");
  13.     // 检测是否链接成功
  14.     while (WiFi.status() != WL_CONNECTED) {
  15.           delay(500);
  16.           Serial.print(".");
  17.     }
  18.     Serial.println("连接成功");
  19.     Serial.print("IP address: ");
  20.     Serial.println(WiFi.localIP());
  21. }
  22. void loop() {
  23.         delay(1000);
  24. }
复制代码
在 C 和 C++ 编程语言中,const char* 是一种常见的范例声明,以下是对其各个部分的详细阐释:
​                当我们把 const、char 和 * 组合在一起形成 const char* 时,它的完整含义是:我们正在声明一个指针,这个指针指向的是 char 范例的数据,并且这些数据是不可修改的常量。
我们可以通过以下代码示例来进一步明白:
  1. const char *str = "Hello, world!";
复制代码
​                在这个例子中,我们声明了一个名为 str 的变量,它的范例是 const char*。str 指向了一个存储在内存中的字符串 "Hello, world!"。这里的 const 关键字包管了我们不能通过 str 指针去修改 "Hello, world!" 这个字符串的内容。例如,以下操作是不允许的:
  1. str[0] = 'h'; // 错误:尝试修改 const 指针指向的数据
复制代码
​                由于 str 是 const char* 范例,通过它修改所指向的数据是不合法的,编译器会报错,以防止我们不警惕修改了不应该修改的数据。
​                总之,使用 const char* 可以有效地防止在步伐中不测修改常量字符串,提高代码的健壮性和可维护性,同时也明确了该指针的操作范围和限定,使代码的意图更加清晰,让其他开发者一看便知,这个指针只能用来读取数据,而不能用于修改数据。
​                这样的声明在处置惩罚字符串常量、函数参数传递(当不希望函数修改字符串内容时)以及许多其他场景中都非常有效,由于它清晰地表明了指针所指向的数据是只读的,克制了潜伏的数据修改错误。
AP模式

​                接入点(AP)是一种提供 Wi-Fi 网络访问的设备,并将其毗连到有线网络的装置。ESP32S3除了不具有与有线网络的接口外,还可以提供类似的功能。这种操作模式称为软接入点(soft-AP)。可以同时毗连到soft-AP的最大站数可以设置4,默以为4。
当ESP32S3单独处于AP模式下时,可以被以为是一个无法访问外网的局域网WiFi路由器节点,它可以接受各类设备的毗连哀求。并可以和毗连设备进行TCP、UDP毗连,实现数据流。在局域物联网的设计中可以承担数据收发节点的作用。
Q:可以简朴明白为一个不能上网的热点?
A:这种明白基本正确。ESP32S3 在 AP 模式下可以被视为一个热点,其他设备可以搜索并毗连到这个热点,但这个热点不会像家庭 Wi-Fi 路由器那样可以将设备毗连到互联网,而只是创建了一个本地的无线网络环境,供毗连的设备之间进行通讯。
示例:当ESP32S3 在 AP 模式下运行时,它将创建一个名为“ESP32S3”的无线网络,并分配一个 IP 地址。其他设备可以搜索并毗连到这个热点,但无法通过这个热点上网。
  1. #include <WiFi.h>
  2. // 设置要创建的热点名与密码
  3. const char* ssid = "ESP32S3";
  4. const char* password = "12345678";
  5. void setup()
  6. {
  7.     Serial.begin(115200);
  8.     // 创建热点
  9.     WiFi.softAP(ssid, password);
  10.     // 打印热点 IP
  11.     Serial.print("Wi-Fi 接入的 IP:");
  12.     Serial.println(WiFi.softAPIP());
  13. }
  14. void loop()
  15. {
  16.     delay(500);
  17. }
复制代码
到此,你应该已经知道怎样使用STA 和 AP 模式了,但是,我们使用WIFI最主要的目标是数据的传输,所以接下来我会先容怎样使用WIFI进行数据传输。
TCP与UDP协议

请先确保WIFI已经毗连,接下来的代码将以STA模式为例子
TCP(Transmission Control Protocol)
UDP(User Datagram Protocol)
总结
TCP例程

起首将两块ESP32一个作为服务器端,一个作为客户端。
先讲服务器端的代码
  1. // 这个是一个简单的服务端,用于接收客户端发送的字符串,并回复一个固定的字符串
  2. #include <WiFi.h>
  3. #include <WiFiClient.h>// 引入 WiFiClient 类
  4. #include <WiFiServer.h>// 引入 WiFiServer 类,服务器端必须有
  5. // 定义 Wi-Fi 网络的 SSID 和密码
  6. const char *ssid = "LEDC";
  7. const char *password = "12344567";
  8. // 定义服务器监听的端口号
  9. const int serverPort = 6700;
  10. WiFiServer server(serverPort);// 创建服务器对象
  11. WiFiClient client; // 创建客户端对象
  12. void setup()
  13. {
  14.     Serial.begin(115200);//串口调试
  15.     // 连接到 Wi-Fi 网络
  16.     WiFi.disconnect(true); // 先断开之前的 Wi-Fi 连接
  17.     WiFi.begin(ssid, password); // 连接到 我的手机热点
  18.     delay(1000);
  19.     while (WiFi.status() != WL_CONNECTED)
  20.     {
  21.         delay(1000);
  22.         Serial.println("Connecting to WiFi...");
  23.     }
  24.     Serial.println("Connectedヾ(≧▽≦*)o");
  25.     // 启动服务器
  26.     server.begin();
  27.     Serial.println("Server started");
  28.     Serial.print("IP Address: ");
  29.     Serial.println(WiFi.localIP());// 获取手机热点分配给ESP32的IP地址并打印到串口
  30.     delay(2000);
  31. }
  32. void loop()
  33. {
  34.     // 检查是否有新的客户端连接
  35.     client = server.available();
  36.     if (client)
  37.     {
  38.         Serial.println("Client connected");
  39.         while (client.connected())
  40.         {
  41.             if (client.available())
  42.             {
  43.                 // 读取客户端发送的字符串,一直读取直到遇到换行符
  44.                 String receivedString = client.readStringUntil('\n');
  45.                 Serial.println("Rec from client: " + receivedString);
  46.                 // 发送响应字符串
  47.                 client.println("Message received by Server");
  48.             }
  49.         }
  50.         Serial.println("Client disconnected");
  51.         client.stop();
  52.     }
  53. }
复制代码
接下来是是客户端的代码
  1. #include <WiFi.h>
  2. #include <WiFiClient.h>
  3. //客户端就不需要WiFiServer库了
  4. // 定义 Wi-Fi 网络的 SSID 和密码
  5. const char* ssid = "";
  6. const char* password = "";
  7. // 定义服务器的 IP 地址和端口号
  8. const char* serverIP = "这个需要先看看服务器端串口调输出的IP地址是多少";
  9. const int serverPort = 6700; //双方通信,监听的端口号要相同
  10. WiFiClient client;
  11. void setup() {
  12.   Serial.begin(115200);
  13.   delay(1000);
  14.   // 连接到 Wi-Fi 网络
  15.   WiFi.begin(ssid, password);
  16.   while (WiFi.status()!= WL_CONNECTED) {
  17.     delay(1000);
  18.     Serial.println("Connecting to WiFi...");
  19.   }
  20.   Serial.println("Connectedヾ(≧▽≦*)o");
  21.   // 尝试连接到服务器
  22.   if (!client.connect(serverIP, serverPort)) {
  23.     Serial.println("Connection to server failed");
  24.     return;
  25.   }
  26.   Serial.println("Connected to server");
  27. }
  28. void loop() {
  29.   if (client.connected()) {
  30.     // 发送字符串
  31.     client.println("Elaina is fine, very fine.");
  32.     Serial.println("String sent: Elaina is fine, very fine.");
  33.     // 检查是否有服务器的响应
  34.     if (client.available()) {
  35.       String response = client.readStringUntil('\n');
  36.       Serial.println("Received from server: " + response);
  37.     }
  38.   } else {
  39.     Serial.println("Not connected to server");
  40.   }
  41.   // 可以根据需要调整发送间隔
  42.   delay(3000);
  43. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4