在Arduino IDE上使用Web-Socket客户端实现两台ESP32之间的实时数据传输
扫描二维码
随时随地手机看文章
近年来,基于Arduino和ESP32的web服务器项目在各种应用中变得非常流行和有用。但是这种web服务器的一个主要缺点是它的静态特性。意思是通过HTTP更新网页,你需要在更新任何数据之前更新整个网页。这个问题有很多解决方法,比如几秒钟后自动刷新网页,等等。
但是最有效的方法是使用WebSocket连接来实时获取更新的数据。这种方法不仅效率高,而且为资源密集型应用程序节省了大量的时钟周期。
在我们之前的一篇文章中,我们构建了这样一个基于ESP32的WebSocket服务器,它可以托管网页并发送更新,而无需完全刷新页面。这样做让我们想知道是否有任何方法可以将ESP32配置为可以通过Wi-Fi连接到服务器的客户端。
为了回答这个问题,我们将构建一个基于ESP32的WebSocket客户端,它将能够连接到ESP32 WebSocket服务器。
这样,我们将使用最快、最有效的方式在ESP设备之间建立通信。所以,不要再拖延了,让我们开始吧。
在我们之前的项目中,我们已经构建了许多基于ESP32的项目和物联网相关应用程序的项目,如果您对该主题感兴趣,您可以查看它们。
ESP32 WebSocket客户端是如何工作的?
这个项目的目标是将ESP32配置为WebSocket客户端,这样做将使我们能够在两个ESP32设备之间建立更快和稳定的通信。
首先,客户端通过WebSocket握手建立一个WebSocket连接。握手从一个HTTP请求开始,该请求允许所有必需的服务处理HTTP连接和WebSocket连接。
一旦连接建立,esp32就可以以全双工模式发送和接收数据。使用WebSocket协议,客户端(Web浏览器和ESP32板)可以不需要请求就可以向服务器发送和接收信息,如果配置正确,服务器可以请求客户端发送或接收数据。正如我们前面所说的,如果客户端是web浏览器,这个过程仍然成立。
构建ESP32 WebSocket客户端所需组件
构建基于ESP32的WebSocket客户端所需的组件如下所示。我们用非常通用的元件设计了这个电路,这使得复制过程非常容易。
•ESP32开发板- 2
•128 X 64 OLED显示屏- 1
•面包板- 2
•DHT22传感器- 1
•LED红- 1
•330R电阻- 1
•跳线
•USB电缆
ESP32 WebSocket服务器端,客户端-原理图
基于ESP32的WebSocket客户端测试电路的完整原理图如下所示。
正如你在上面的图表中看到的,我们有两个电路;一个用于ESP32 WebSocket服务器,我们在前一篇文章中讨论过,另一个用于基于ESP32的WebSocket客户端。在这个项目中,我们将讨论客户端。
客户端的演示电路并不多,一个简单的128x64 OLED显示器连接到一个ESP32模块。
打开电源后,客户端可以通过WebSocket连接连接到服务器,并从服务器实时获取数据。
ESP32 Websocket客户端Arduino代码
用于将esp32配置为WebSocket客户端的完整代码可以在本页底部找到。添加所需的头文件和源文件后,您应该能够直接编译Arduino代码,而不会出现任何错误。如果你没有ESP32 Websocket库,你可以从下面给出的链接下载它们。
•下载Adafruit SSD1396 OLED显示库
•下载Arduino Websockets库由Links2004
•下载Arduino JSON库由bblanchon
我们通过包含所有必需的库来开始编写代码。由于我们正在使用WebSocket客户端和OLED,我们需要包括websocketclient .h库以及Adafruit_SSD1306.h和ArduinoJson.h库以及WiFi.h和WebServer.h库。
接下来,我们定义OLED显示器的屏幕宽度和屏幕高度。
之后,我们定义Wi-Fi的SSID和Password,接下来我们定义WebSocketsClient实例并分配一个静态JSON文档,我们将在其中保存传入的JSON字符串。
最后,我们为LED显示器创建一个SSD1306实例,并将屏幕高度和屏幕宽度作为参数传递。
接下来,我们有我们的设置函数,其中我们调用WiFi。begin(SSID, password)开始Wi-Fi实例的方法,并将之前定义的SSID和密码作为参数传递。
接下来,我们用115200波特初始化串行以进行调试。一旦Wi-Fi初始化,我们初始化显示并检查它是否连接。
接下来,我们开始一个WebSocket连接,并为WebSocket初始化一个事件句柄。当WebSocket事件发生时,invent处理程序调用webSocketEvent()函数。
接下来,我们有了loop()函数。在循环函数中,我们通过调用WebSocket.loop()函数来保持WebSocket的活动状态。
接下来,我们有WebSocket事件函数。这个函数在WebSocket事件发生时自动调用。在这个函数中,我们首先检查是否有传入的有效负载,并验证它是否是字符串。
我们期望从服务器得到一个JSON字符串。如果它是一个字符串,那么我们使用deserializeJSON函数对它进行反序列化,并传递有效负载和我们之前声明的静态JSON文档。
一旦JSON字符串被反序列化,我们就声明了三个变量来保存服务器发送的三个参数,即LED_STATUS和来自DHT22传感器的温度和湿度数据。
一旦我们这样做,我们设置显示器,并将所有信息打印到OLED显示器上。
测试ESP32无线客户端
基于ESP32的WebSocket客户端的测试电路如上所示。正如你所看到的,在左边,我们有一个基于ESP32的服务器,它有一个DHT22传感器和一个LED连接,在右边,我们有我们的安卓手机,它作为一个WebSocket客户端,在右边,我们有另一个ESP32板,它作为另一个WebSocket客户端。
现在,由于我们通过WebSocket连接,如果DHT传感器数据或LED状态发生变化,这些变化将反映在手机上,我们也可以在OLED显示器上观察到变化。
果然,当我们点击“打开和关闭”按钮时,OLED显示屏上的数据也会发生变化,我们也会从DHT22传感器获得恒定的数据流,这意味着我们的WebSocket连接工作顺利。
这标志着ESP32 WebSocket教程结束。
本文编译自iotdesignpro