前言
这篇文章的目的是,学习如何搭建一个简单的 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);
}