Arduino网络编程实战-Ethernet篇-Websocket客户端 Websocket客户端 Arduino Ethernet Shield V1 允许 Arduino 板连接到互联网。 它基于 Wiznet W5100ethernet 芯片(数据表)。 Wiznet W5100 提供支持 TCP 和 UDP 的网络 (IP) 堆栈。 它最多支持四个同时套接字连接。
本次实例将演示如何实现一个简单的Websocket客户端。
1、硬件准备
Arduino Mega 2560
Arduino Ethernet Shield
路由器(推荐可以上网、开启DHCP)
网线一条
电脑一台
2、软件准备
3、代码实现 1)Arduino的Websocket客户端实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 #include <SPI.h> #include <Ethernet.h> #include <Arduino.h> #include <WebSocketClient.h> using namespace net; #define USE\_STATIC 0 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; #if USE\_STATIC IPAddress ip(192, 168, 0, 177); #endif WebSocketClient client; void setup() { Serial.begin(9600); Serial.println("Ethernet Websocket Client Example"); #if USE\_STATIC Ethernet.begin(mac,ip); #else Ethernet.begin(mac); #endif if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); while(true){ delay(1); } } Serial.print("IP:"); Serial.println(Ethernet.localIP()); Serial.print("Subnet Mask:"); Serial.println(Ethernet.subnetMask()); Serial.print("Gateway:"); Serial.println(Ethernet.gatewayIP()); Serial.print("DNS Server:"); Serial.println(Ethernet.dnsServerIP()); client.onOpen([](WebSocket &ws) { Serial.println(F("Connected")); const auto protocol = ws.getProtocol(); if (protocol) { Serial.print(F("Client protocol: ")); Serial.println(protocol); } const char message[]{"Hello from Arduino client!"}; ws.send(WebSocket::DataType::TEXT, message, strlen(message)); }); client.onMessage([](WebSocket &ws, const WebSocket::DataType dataType, const char \*message, uint16\_t length) { switch (dataType) { case WebSocket::DataType::TEXT: Serial.print(F("Received: ")); Serial.println(message); break; case WebSocket::DataType::BINARY: Serial.println(F("Received binary data")); break; } ws.send(dataType, message, length); // Echo back to server }); client.onClose([](WebSocket &, const WebSocket::CloseCode, const char \*, uint16\_t) { Serial.println(F("Disconnected\n")); }); if (!client.open("192.168.0.100", 3000, "/")) { Serial.println(F("Connection failed!")); while (true) ; } Serial.println("connected to websocket server"); } void loop() { client.listen(); }
2)Nodejs的Websocket服务器实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 // simple-ws-server.js const WebSocket = require("ws"); const wss = new WebSocket.Server({ host: "0.0.0.0", port: 3000, }); wss.on("connection", (ws, req) => { ws.remoteAddress = req.socket.remoteAddress.replace(/^.\*:/, ""); console.log(`new client: ${ws.remoteAddress}`); ws.on("message", (message) => { console.log(`[${ws.remoteAddress}] > ${typeof message}:`, message); }); ws.on("close", (code, reason) => { console.log( `[${ws.remoteAddress}] client disconnected: ${code} "${reason}"` ); }); ws.on("error", (err) => console.log(`[${ws.remoteAddress}] error:`, err)); ws.on("ping", () => console.log(`[${ws.remoteAddress}] > ping`)); ws.send("Hello from Node.js"); setTimeout(() => { console.log(`disconnecting ${ws.remoteAddress} ...`); ws.close(); }, 60000); }); wss.on("listening", () => { let remote = wss.address(); console.log(`Server running at ${remote.address}:${remote.port}`); });
在命令行运行node simple-ws-server.js
4、运行结果 1)Nodejs服务端
2)Arduino客户端
文章来源: https://iotsmart.blog.csdn.net/article/details/122752353
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!