前言
这篇文章主要学习的是 在ESP32上创建Websocket server(服务器)所创建的Websocket server(服务器)将作为回发服务器使用,也就是说它会把接收自客户端的数据回发给客户端。
为了对服务器进行测试,我们将使用Python开发一个非常简单的客户端。
ESP32 服务器起的构建与 ESP32 客户端的构建相似,可以先看这篇文章 ESP32 Arduino 学习 :设置 Websocket Client(客户端)
操作环境
测试用的开发板: bpibit
测试用的软件:
我使用 vscode 作为 python 解释器,用其他 IDE 也可以,例如 PyCharm 等等
ESP32 服务器
代码讲解
WebSocketServer webSocketServer;
创建 WebSocketServer 类的对象,它负责提供从客户端接收请求以及对数据交换进行处理时所需要的方法。
使用示例
为了测试此代码,只需编译并将其上传到ESP32即可。您将得到类似于 现象 的输出结果
#include <WiFi.h>
#include <WebSocketServer.h>
WiFiServer server(80);
WebSocketServer webSocketServer;
const char *ssid = "************";
const char *password = "************";
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 the WiFi network");
Serial.println(WiFi.localIP());
server.begin();
delay(100);
}
void loop()
{
WiFiClient client = server.available(); // 调用 WiFiServer 对象的 available 方法对客户端连接进行监听
if (client.connected() && webSocketServer.handshake(client))
{
String data; // 一个数据缓冲区,用于存放首次接收的客户端数据
while (client.connected())
{
data = webSocketServer.getData(); // 服务器接收数据
if (data.length() > 0)
{
Serial.println(data);
webSocketServer.sendData(data); // 服务器发送数据
}
delay(10); // 确保数据正确接收
}
Serial.println("The client disconnected");
delay(100);
}
delay(100);
}
现象
在下面编写 python 客户端代码时,需将 ESP32 的 IP 地址复杂到 python
python 客户端
python 模块
需要在 Python 上安装一个 Websockets 模块,同样可以使我们免于处理 Websockets 的底层实现
我们将使用一个叫做 websocket-client 的 Python 模块
在Windows命令行执行以下命令即可:
pip install websocket-client
python 代码
# 导入模块
import websocket
import time
ws = websocket.WebSocket()
ws.connect("ws://192.168.137.10/") # websocket连接,我们需要将目标设为“ws://{serverIP}/“,其中服务器IP是ESP32连接到WiFi网络时所分配的地址
i = 0
nrOfMessages = 10
while i < nrOfMessages:
ws.send("Soft AP mode: message nr " + str(i)) # 发送数据
result = ws.recv() # 接收数据
print(result)
i = i+1
time.sleep(1)
ws.close() # 客户端关闭
现象
在Arduino IDE serial monitor上,您将看到所打印的相同消息。最后在所有消息发送完之后,Python客户端会从服务器断开。Arduino循环会检测到客户端已断开,因此在控制台上会打印出一条消息,说明客户端已经断开