Trong bài này chúng ta sẽ thiết lập Node Wifi làm WebSocket server và điểu khiển đèn LED thông qua WebSocket.
Client sau khi kết nối thành công với WebSocket server, sẽ gởi các tin nhắn (message) như “on” hoặc “off” để server thay đổi trạng thái của đèn LED.
Trước tiên chúng ta cần tải thư viện arduinoWebSockets tại đây
Để cài đặt thư viện arduinoWebSockets cho Arduino IDE, bạn vào menu Sketch > Include Library > Add .ZIP Library… và chọn file đã tải về ở trên.
Khai báo các thư viện cần thiết:
#include <ESP8266WiFi.h> // Thư viện dùng để kết nối WiFi của ESP8266 #include <WebSocketsServer.h> // Thư viện WebSocketsServer
Để sử dụng thư viện WebSocketsServer ta cần khởi tạo một đối tượng tên là là webSocket chạy trên port 81.
WebSocketsServer webSocket = WebSocketsServer(81);
Khai báo hàm dùng để khởi tạo và xử lý các sự kiện của WebSocket
void startWebSocket() { webSocket.begin(); webSocket.onEvent(webSocketEvent); }
Để điều khiển đèn LED ta dựa vào sự kiện loại WStype_TEXT khi WebSocket server nhận được các tin nhắn dạng văn bản (text) gởi từ phía client.
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { switch (type) { case WStype_TEXT: Serial.printf("[%u] get text: %s\n", num, payload); String message = (char*)payload; webSocket.sendTXT(num, payload); // Thông báo nội dung nhận được cho client if (message == "on") { digitalWrite(led, 0); // Bật đèn LED khi nhận được tin nhắn "on" webSocket.broadcastTXT("Hi All! LED is turned ON"); // Thông báo trạng thái bật LED cho tất cả client đang kết nối } else if (message == "off") { // Bật đèn LED khi nhận được tin nhắn "off" digitalWrite(led, 1); webSocket.broadcastTXT("Hi All! LED is turned OFF"); // Thông báo trạng thái tắt LED cho tất cả client đang kết nối } break; } }
Server có thể gởi message đến một client cụ thể:
webSocket.sendTXT(client_id, message);
hoặc toàn bộ client đang kết nối:
webSocket.broadcastTXT("Hi All!");
Cuối cùng chúng ta cần gọi phương thức webSocket.loop() trong vòng lặp chính để kiểm tra khi có sự kiện WebSocket xảy ra.
void loop() { webSocket.loop(); }
Bạn dùng Arduino IDE để nạp chương trình sau:
#include <ESP8266WiFi.h> // Thư viện dùng để kết nối WiFi của ESP8266 #include <WebSocketsServer.h> // Thư viện WebSocketsServer const char* ssid = "Blocky AP"; // Tên của mạng WiFi mà bạn muốn kết nối đến const char* password = "password_ap"; // Mật khẩu của mạng WiFi const int led = 15; // Đèn led ở chân GPIO2 WebSocketsServer webSocket = WebSocketsServer(81); void setup() { Serial.begin(115200); // Khởi tạo kết nối Serial để truyền dữ liệu đến máy tính pinMode(led, OUTPUT); startWiFi(); startWebSocket(); } void loop() { webSocket.loop(); } void startWiFi() { WiFi.begin(ssid, password); // Kết nối vào mạng WiFi Serial.print("Connecting to "); Serial.print(ssid); // Chờ kết nối WiFi được thiết lập while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("\n"); Serial.println("Connection established!"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Gởi địa chỉ IP đến máy tinh } void startWebSocket() { webSocket.begin(); webSocket.onEvent(webSocketEvent); } void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { switch (type) { case WStype_DISCONNECTED: // Sự kiện khi client ngắt kết nối Serial.printf("[%u] Disconnected!\n", num); break; case WStype_CONNECTED: // Sự kiện khi client kết nối { // Gởi địa chỉ IP đến máy tinh IPAddress ip = webSocket.remoteIP(num); Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); webSocket.sendTXT(num, "Connected"); // Thông báo kết nối thành công cho client } break; case WStype_TEXT: // Sự kiện khi client gởi tin nhắn dạng TEXT Serial.printf("[%u] get text: %s\n", num, payload); String message = (char*)payload; webSocket.sendTXT(num, payload); // Thông báo nội dung nhận được cho client if (message == "on") { digitalWrite(led, 0); // Bật đèn LED khi nhận được tin nhắn "on" webSocket.broadcastTXT("LED is turned ON"); // Thông báo trạng thái bật LED cho tất cả client đang kết nối } else if (message == "off") { // Tắt đèn LED khi nhận được tin nhắn "off" digitalWrite(led, 1); webSocket.broadcastTXT("LED is turned OFF"); // Thông báo trạng thái tắt LED cho tất cả client đang kết nối } break; case WStype_BIN: // Sự kiện khi client gởi tin nhắn dạng BINARY Serial.printf("[%u] get binary length: %u\n", num, length); hexdump(payload, length); // webSocket.sendBIN(num, payload, length); break; } }
Sau khi nạp code thành công, bạn mở Serial Monitor để biết được địa chỉ IP của WebSocket server. Đường dẫn của WebSocket sẽ có dạng như sau: ws://serverIP:81
Ta cần một client chạy trên trình duyệt web để kết nối đến server. Bạn có thể tải chương trình Test Websocket tại đây.
Từ giao diện chương trình bạn kết nối vào WebSocket server đã thiết lập ở trên và thử gởi các tin nhắn như “on“, “off” để kiểm tra sự thay đổi trạng thái của đèn LED ở chân GPIO2 (có sẵn trên ESP8266).
Nếu bạn có chút kiến thức về HTML/JavaScript, bạn có thể tham khảo mã nguồn của chương trình trên để sửa lại theo ý mình.