ESP32Arduino教程:Websocketserver(服务器)
简介
为了对服务器进⾏测试,我们将使⽤Python开发⼀个⾮常简单的客户端。即便是对从没⽤过Python的⼈来说,这也是⼀种⾮常简单(也⾮常强⼤)的程序设计语⾔,因此以下代码肯定不难理解。
当然,如果你仍然不习惯使⽤Python,你也可以参考上⼀篇帖⼦使⽤另⼀个ESP32开发板上运⾏的ESP 32 Websocket 客户端或者使⽤其他编程语⾔开发的Websocket API对代码进⾏测试。
测试使⽤的是⼀个集成esp - wroom -32模块的开发板:FireBeetle ESP32。代码开发是在MicroPython IDE uPyCraft上完成的。
Arduino库
需要注意的是,我在撰写本⽂时,上⾯提到的Websockets库尚未得到ESP32的官⽅⽀持(官⽅⽀持仅限ESP8266)。尽管如此,经过略微修改之后,仍可在ESP32上使⽤这个库。
下⾯所⽰的Arduino代码就是对库的例程进⾏修改所得到的,可以成功⽤在ESP32上。
#include
#include
#include
// Enabe debug tracing to Serial port.
#define DEBUGGING
// Here we define a maximum framelength to 64 bytes. Default is 256.
#define MAX_FRAME_LENGTH 64
// Define how many callback functions you have. Default is 1.
#define CALLBACK_FUNCTIONS 1
#include
WiFlyServer server(80);
WebSocketServer webSocketServer;
/
/ Called when a new message from the WebSocket is received
// Looks for a message in this form:
//
// DPV
//
// Where:
// D is either 'd' or 'a' - digital or analog
// P is a pin #
// V is the value to apply to the pin
//
void handleClientData(String &dataString) { bool isDigital = dataString[0] == 'd';
int pin = dataString[1] - '0';
int value;
value = dataString[2] - '0';
pinMode(pin, OUTPUT);
if (isDigital) {
digitalWrite(pin, value);
} else {
analogWrite(pin, value);
}
Serial.println(dataString);
}
/
/ send the client the analog value of a pin void sendClientData(int pin) {
String data = "a";
pinMode(pin, INPUT);
data += String(pin) + String(analogRead(pin)); webSocketServer.sendData(data);
}
void setup() {
Serial.begin(9600);
SC16IS750.begin();
WiFly.setUart(&SC16IS750);
WiFly.begin();
// This is for an unsecured network
/
/ For a WPA1/2 network use auth 3, and in another command send 'set wlan phrase PASSWORD' // For a WEP network use auth 2, and in another command send 'set wlan key KEY'
WiFly.sendCommand(F("set wlan auth 1"));
WiFly.sendCommand(F("set wlan channel 0"));
WiFly.sendCommand(F("set ip dhcp 1"));
server.begin();
Serial.println(F("Joining "));
// Here is where you set the network name to join
if (!WiFly.sendCommand(F("join arduino_wifi"), "Associated!", 20000, false)) {
Serial.println(F("Association failed."));
while (1) {
// Hang on failure.
}
}
if (!WiFly.waitForResponse("DHCP in", 10000)) {
Serial.println(F("DHCP failed."));
while (1) {
// Hang on failure.
}
}
// This is how you get the local IP as an IPAddress object
Serial.println(WiFly.localIP());
// This delay is needed to let the WiFly respond properly
/
/ This delay is needed to let the WiFly respond properly
delay(100);
}
void loop() {
String data;
WiFlyClient client = server.available();write的返回值
if (ted() && webSocketServer.handshake(client)) {
while (ted()) {
data = Data();
if (data.length() > 0) {
handleClientData(data);
}
sendClientData(1);
sendClientData(2);
sendClientData(3);
}
}
// wait to fully let the client disconnect
delay(100);
}
Python模块
我们还需要在Python上安装⼀个Websockets模块,同样可以使我们免于处理Websockets的底层实现。因此,要安装上⽂提到的库,我们只需要在Windows命令⾏执⾏以下命令即可:
pip install websocket-client
请注意,根据您所使⽤的Python具体版本的不同,在发送命令之前可能需要导航到pip所在的⽂件夹。Python代码
⾸先,导⼊刚刚安装的websocket client模块。此外,还需要导⼊time模块,以便在程序中加⼊延时。然后,基于之前导⼊的模块,创建⼀个WebSocket类的对象实例。
然后,基于之前导⼊的模块,创建⼀个WebSocket类的对象实例。
import websocket
import time
接下来,调⽤WebSocket对象的connect⽅法(使⽤服务器地址作为其输⼊参数)。
ws = websocket.WebSocket()
请注意,由于这是⼀个websocket连接,我们需要将⽬标设为“ws://{serverIP}/“,其中服务器IP是ESP32连接到WiFi⽹络时所分配的地址。
代码中使⽤的是我的ESP32开发板的IP地址,在连接到我的家庭⽹络时我已经知道了具体的IP地址。但是,如果你还不知道你的IP地址,那么我们会在Arduino代码中将其值打印出来。
上述函数调⽤之后,我们就应该成功连接到了服务器上。请注意,为简便起见,我在代码中没有进⾏任何错误处理,但是在实际应⽤中对可能出现的错误进⾏处理⾮常重要。
接下来,为了向服务器发送数据,我们只需调⽤WebSocket对象的send⽅法即可(将包含数据内容的字符串作为输⼊参数)。
ws.send("data to send")
为了从服务器接收数据,我们可以调⽤WebSocket对象的recv⽅法。该⽅法会从服务器返回可⽤的数据,我们应该把这些数据保存到变量中。
result = ws.recv()
最后,调⽤WebSocket对象的close⽅法即可从服务器断开。
result = ws.close()
Python Websocket client的完整源代码如下所⽰。请注意,代码中使⽤循环发送和接收请求,并将从服务器接受到的数据打印出来,以确认服务器真的会将接受到的内容进⾏回发。
你可以修改nrOfMessages变量和sleep时间,以测试服务器在⾯对更多请求和更短间隔时的灵活性。
import websocket
import time
ws = websocket.WebSocket()
i = 0
nrOfMessages = 200
while i<nrOfMessages:
ws.send("message nr: " + str(i))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论