Trong bài viết này chúng ta sẽ tìm hiểu cách tạo một socket server trên ESP8266 trên nền Arduino, vâng lại arduino đơn giản dễ làm. Để test socket server này ta dùng một socket client là Putty. Bạn có thể tải nó ở đây Putty

Chuẩn bị

  • Board NodeMCU/ESP8266
  • Arduino IDE

Chương trình

To get started, we need to include the ESP8266WiFi.h library, so we can connect the ESP8266 to a WiFi network.

Để bắt đầu ta cần thêm thư viện ESP8266WiFi.h để có thể connect ESP8266 vào mạng WiFi, tất nhiên là bạn phải biết thông tin về mạng wifi  của mình rồi

Tiếp theo là ta cần một object WiFiServer class, để dùng cho cấu hình socket server và lắng nghe các kết nối từ các socket client.  Contructor của WiFiServer class nhận argument port là integer, đây là port để listen thông tin từ các client.

#include "ESP8266WiFi.h"

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPass";

WiFiServer wifiServer(80);

Tiếp theo là hàm setup của Arduino, bắt đầu là mở kết nối, output kết quả ra terminal. Ở đây ESP8266 sẽ kết nối vào 1 mạng wifi ví dụ là ABC, thì client cũng phải kết nối vào mạng đó để có thể connect được với nhau

Tại cuối hàm setup ta sẽ gọi method begin trong WiFiServer object. Method này sẽ dùng để init socket server. Bạn có thể check bản full setup như dưới đây.

void setup() {

  Serial.begin(115200);

  delay(1000);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting..");
  }

  Serial.print("Connected to WiFi. IP:");
  Serial.println(WiFi.localIP());

  wifiServer.begin();
}

Chúng ta sẽ quản lý client trong vòng main loop. Vì socket server của chúng ta không phải là dạng bất đồng bộ(asynchronous) nên cần phải poll WiFiServer object định kỳ để check xem có socket client hay không. Nếu bạn muốn dùng  asynchronous thì nên tham khảo thư viện này .

Để check xem client có hay không thì chúng ta phải gọi method  available trong WiFiServer object. Method này không có argument, nó chỉ return object của class WiFiClient. Tuy nhiên hàm này là non-blocking nên nó sẽ trả về giá trị nếu không có client nào kết nối.

Có cách để kiểm tra client có kết nối hay không là sử dụng connected method của WiFiClient object. Một thứ nữa là WiFiClient class sẽ overrides toán tử bool  C++ để return the value được trả về bởi connected method, có nghĩa là ta có thể dễ dàng đưa object vào trong điều kiện IF để kiểm tra kết nối của client.

WiFiClient client = wifiServer.available();

if (client) {
  // Client handling code
}

WiFiClient client = wifiServer.available(); if (client) { // Client handling code }

Nếu client đã kết nối thì ta bắt đầu đọc data cho tới khi nó mất kết nối.

if (client) {

    while (client.connected()) {
      // Poll for data
    }
}

Trong vòng loop, ta sẽ check nếu có data thì gọi  available method trong WiFiClient object, nó sẽ trả về số lượng byte có sẵn, nếu ko có byte nào thì return 0.

Khi có byte để đọc thì ta gọi read method trong WiFiClient object và in nó ra serial console. Tất nhiên phải có delay nho nhỏ tại mỗi lần polling để đảm bảo nhận đủ data

if (client) {

    while (client.connected()) {

      while (client.available()>0) {
        char c = client.read();
        Serial.write(c);
      }

      delay(10);
    }
}

Bạn có thể xem full source code bên dưới

#include "ESP8266WiFi.h"

const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPass";

WiFiServer wifiServer(80);

void setup() {

  Serial.begin(115200);

  delay(1000);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting..");
  }

  Serial.print("Connected to WiFi. IP:");
  Serial.println(WiFi.localIP());

  wifiServer.begin();
}

void loop() {

  WiFiClient client = wifiServer.available();

  if (client) {

    while (client.connected()) {

      while (client.available()>0) {
        char c = client.read();
        Serial.write(c);
      }

      delay(10);
    }

    client.stop();
    Serial.println("Client disconnected");

  }
}

Chạy thử demo

Để test thử xem chương trình thế nào thì chúng ta phải compile và upload code xuống, sau đó mở terminal lên xem kết quả thôi

Sau khi kết nối vào mạng wifi thì chương trình sẽ in ra thông tin IP, copy IP này lại để nhập vào putty

Tiếp theo ta mở Putty chọn Hostname là cái IP vừa copy, port 80, RAW và connect

Mở terminal của Arduino lên và quan sát, sau đó gõ lệnh bên putty kiểm tra

Kết

Vậy là ta đã biết được cách đơn giản để tạo socket server trên esp8266/nodemcu rồi, chuẩn bị hành trang cho mấy bài tiếp theo thôi ae ơi.