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.