Arduino代码
我们需要一个WiFiServer类的对象,以创建能够接收客户端连接的TCP服务器。这个类的构造函数有一个可选的端口输入参数,用于指定服务器将要监听的端口号。我们使用端口80。
然后,在我们的TCP服务器上新建一个Websocket server(服务器)。为了使用与Websocket相关的功能,我们需要一个WebSocketServer类的对象。封装函数(wrapper)将负责处理具体的Websocket协议,我们只需要考虑与客户端之间的数据交换即可。
在Arduino的setup函数中,首先打开一个串行连接,以便将接收自客户端的数据打印出来。
[mw_shl_code=applescript,true]
#include <WiFi.h>
#include <WebSocketServer.h>
WiFiServer server(80);
WebSocketServer webSocketServer;
const char *ssid = "MyESP32AP";
const char *password = "testpassword";[/mw_shl_code]
还有两点需要考虑,那就是所创建网络的名称(ssid)以及访问密码。
然后,调用WiFi外部变量(通过WiFi.h库包含进来)的softAP方法以对soft AP进行设置。在连接到路由器提供的WiFi网络时,我们使用的也是这个外部变量。
[mw_shl_code=applescript,true]Serial.begin(115200);
delay(4000);
WiFi.softAP(ssid, password);
Serial.println(WiFi.softAPIP());[/mw_shl_code]
在setup函数最后,我们需要对TCP服务器进行初始化。只需在先前声明的全局WiFiServer对象上调用begin方法即可。
[mw_shl_code=applescript,true]server.begin();[/mw_shl_code]
在主函数中,我们将调用WiFiServer对象的available方法,以确认客户端是否已成功连接。
调用该方法将会返回一个WiFiClient类型的对象。为确认客户端是否连接成功,我们会调用该对象的connected方法。如果客户端成功连接,则该方法会返回true,否则将返回false。
客户端已连接成功的话,我们需要执行Websocket协议握手。只需在我们先前声明的全局WebSocketServer对象上调用handshake方法即可。
该方法的输入参数是我们所获得的WiFiClient对象,如果握手成功则该方法的返回值为true。
[mw_shl_code=applescript,true]if (client.connected() && webSocketServer.handshake(client)) {
// Exchanging data with the client
}[/mw_shl_code]
在条件判断代码部分,我们会声明一个变量,用作接收自客户端的数据缓冲区。只要客户端已连接,我们就循环接收数据、打印到串行控制台并将数据回发给客户端。
通过调用WebSocketServer对象的getData方法,即可从WebSocket获取数据。该方法不需要输入参数,其返回值是一个字符串(其中包含了所接收到的数据)。
为将数据回发给客户端,只需调用sendData方法并把数据作为其输入字符串传给它即可。在本例中,因为服务器就是一台回发服务器,所以要发送的数据就是先前接收的数据。
最终的源代码如下所示,其中包括了与客户端之间的数据交换。请注意,当前文提到的循环结束时,就意味着客户端已经断开,所以我们会把相关信息也打印到串行控制台。
[mw_shl_code=applescript,true]
#include <WiFi.h>
#include <WebSocketServer.h>
WiFiServer server(80);
WebSocketServer webSocketServer;
const char *ssid = "MyESP32AP";
const char *password = "testpassword";
void setup() {
Serial.begin(115200);
delay(4000);
WiFi.softAP(ssid, password);
Serial.println(WiFi.softAPIP());
server.begin();
delay(100);
}
void loop() {
WiFiClient client = server.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); // Delay needed for receiving the data correctly
}
Serial.println("The client disconnected");
delay(100);
}
delay(100);
}[/mw_shl_code]
测试代码
使用Arduino IDE对代码进行编译并上传到您的ESP32开发板,即可对代码进行测试。然后,打开IDE serial monitor并复制打印出来的IP地址。在您Python程序的connect方法中,应该使用此处所输出的IP地址。
一旦您的电脑检测到ESP32 WiFi网络,请直接连接即可。在Windows 8上的视图如下所示。
图1 - Windows 8检测到ESP32 WiFi网络的视图(菜单语言为葡萄牙语)。
然后,运行Python代码。控制台上显示的输出结果如图2所示。和我们所预期的一样,发送到服务器的消息都被回发给了客户端。
图2 - Python程序的输出结果。
在Arduino IDE serial monitor上,程序的输出结果如图3所示。客户端所发送的消息都被接收并打印到了串行控制台上。
图3 - 串行控制台打印的数据(接收自客户端)。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
他写了200多篇有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 :
ESP32教程汇总贴