ESP32 Arduino 学习 :设置 Websocket Client(客户端)


#1

前言

这篇文章的目的是,学习如何搭建一个简单的 websocket 客户端

操作环境

测试用的开发板: bpibit
测试用的软件: Arduino IDE

在下面会运用到 Websocket 库,但是在 IDE 中并没法搜索到,所以只能在 github 上下载。
点击 这个网址

点击 Download ZIP

将库下载后解压到 Arduino IDE 的库文件中。通常而言,这些库文件位于Windows用户文档(Documents)中名为Arduino的文件夹中。例如,在此示例中,库文件的存储地址为C:\ Users \ MyUsername \ Documents \ Arduino \ libraries

打开 ESP8266-Websocket 文件夹中的 ==MD5.c== 和 ==MD5.h== 文件并重命名以下函数:

函数名 更改为(XXX 可以改为其他内容)
MD5Init MD5InitXXX
MD5Update MD5UpdateXXX
MD5Final MD5FinalXXX

代码讲解

WebSocketClient webSocketClient;
WiFiClient client;

创建 WebSocketClient 类对象,用于调用与服务器交互所需的函数。最后,我们需要一个 WiFiClient 类对象,用于在后台为 WebSocketClient 对象提供支持

char path[] = "/echo";
char host[] = "demos.Chentoday.com";

指定连接的主机以及使用的URL路径。为简单起见,我们将使用在线回显 websocket服务器,它可以返回我们先前发送的内容

回显(echo)是网络中的“Hello, World”,所以我们用新的服务器API做的第一件事是创建一个服务器。回显服务器简单地响应连接客户端所发送的任何信息。在这个例子中,我们的WebSocket回显服务器将响应接收到的任何WebSocket消息。以后,如果从浏览器发起对一个回显服务器的连接,就会看到从客户端发出的每条消息都被服务器返回

if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
} else {
    Serial.println("Handshake failed.");
}

执行 websocket handshake 握手,使客户端与服务器通信

使用示例

为了测试此代码,只需编译并将其上传到ESP32即可。您将得到类似于 现象 的输出结果,发送至服务器的消息被返回并打印至串口控制台。
请注意,如果未按照“安装库文件”的说明重命名库函数,则无法编译ESP32代码

#include <WiFi.h>
#include <WebSocketClient.h>

const char* ssid     = "Chentoday";
const char* password = "qwe123456";
char path[] = "/echo";
char host[] = "demos.kaazing.com";

WebSocketClient webSocketClient;
WiFiClient client;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { 
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  delay(5000);
  if (client.connect(host, 80)) { //调用WiFiClient对象的connect方法与主机建立TCP连接
    Serial.println("Connected");
  } else {
    Serial.println("Connection failed.");
  }
  webSocketClient.path = path;  //为WebSocketClient的路径分配全局变量
 
  webSocketClient.host = host;  // 为WebSocketClient的主机数据分配全局变量
  if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
  } else {
    Serial.println("Handshake failed.");
  }
}
void loop() {
  String data;
  if (client.connected()) {
    webSocketClient.sendData("Info to be echoed back"); // 发送数据到服务器
    webSocketClient.getData(data);  // 从服务器接收数据
    if (data.length() > 0) {
      Serial.print("Received data: ");
      Serial.println(data);
    }
  } else {
    Serial.println("Client disconnected.");
  }
  delay(3000);
}

现象

参考资料

ESP32 Arduino教程:Websocket客户端

ESP8266-Websocket 库