ESP8266 làm WebSocket server

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.

Thiết bị cần chuẩn bị

  • 1 x Node WiFi

Chương Trình

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.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Fill out this field
Fill out this field
Vui lòng nhập địa chỉ email hợp lệ.
You need to agree with the terms to proceed

1 Bình luận.

  • Đây là khóa học IoT với Arduino phần nâng cao, giúp các bạn làm quen với các khái niệm về phần truyền và nhận dữ liệu lên Internet thông qua kết nối WiFi và nhiều phương thức (protocol) khác nhau.

Menu