Lập trình ESP32 TCP IP với Arduino IDE
Trong dự án này, chúng ta sẽ cùng tìm hiểu cách sử dụng ESP32 TCP IP – Một tính năng quan trọng với các dự án IoT. Cụ thể, chúng ta sẽ cùng tìm hiểu về giao thức TCP/IP, MQTT và Web Server.
Ngoài ra, chúng ta cũng cần các ứng dụng để test và demo tính năng kết nối Internet có tên là Node-RED. Đây là công cụ lập trình fow-based, được phát triển bởi nhóm dịch vụ công nghệ mới của IBM – một phần của JS Foundation.
Giới thiệu về TCP IP
TCP và UDP/IP là các giao thức dùng để gửi các tập tin qua Internet, dựa trên địa chỉ IP.
TCP (Transmission Control Protocol) đề cao tính đáng tin cậy khi gửi tập tin. Tuy nhiên, điều đó không có nghĩa là tập tin gửi qua giao thức TCP sẽ luôn đúng thứ tự và không bao giờ bị lỗi. TCP chỉ đảm bảo người nhận tập tin sẽ gửi thông báo về cho người gửi biết khi họ đã nhận được tập tin. Nếu điều này không xảy ra, người gửi sẽ tiếp tục gửi tập tin liên tục cho đến khi người nhận có thể nhận được tập tin. TCP sử dụng mô hình Server / Client và Server luôn lắng nghe yêu cầu từ Client.
UDP (User Datagram Protocol) không chú trọng đến độ tin cậy, nhưng bù lại chúng tiêu tốn khá ít chi phí và sở hữu tốc độ truyền tập tin nhanh hơn.
Trong bài viết này, mình sẽ hướng dẫn bạn cách lập trình ESP32 TCP IP thành Server hoặc Client (với 2 bản demo):
- Demo 1: ESP32 là Server, chúng sẽ luôn đợi kết nối và nhận “Hello World” từ Client, sau đó in thông tin này lên cửa sổ Terminal.
- Demo 2: ESP32 là Client, chúng sẽ chủ động khởi tạo kết nối và gửi dữ liệu “Hello World” về Server liên tục (theo mỗi 5 giây 1 lần).
Giới thiệu về Node-RED
Để lập trình và làm việc với ESP32 TCP IP, bạn nên sử dụng Node-RED – một công cụ phát triển dựa trên flow được dùng trong các dự án Internet of Things. Bạn có thể truy cập vào link bên dưới để cài đặt công cụ này:
http://nodered.org/docs/getting -started/installation.html
Sau khi tải và cài đặt, bạn mở trình duyệt kết nối Internet và truy cập vào http: //127.0.0.1:1880/
Như giao diện trên, phía bên trái màn hình có các nút tiện ích và giao thức để chúng ta sử dụng, bao gồm UDP, TCP, Debug,…
Trong bài hướng dẫn lập trình này, chúng ta chỉ cần làm việc với một số tools cơ bản như UDP, TCP, Debug và Inject:
1. Nút Debug: Dùng để hiển thị các thông báo trong tab gỡ lỗi, bạn có thể kéo và thả nút này vào không gian làm việc của FLOW rồi click đúp chuột vào nút để xem các thông tin liên quan:
2. Nút inject: Click bên trái nút sẽ giúp đưa một thông báo vào flow, bạn hãy kéo thả chúng vào không gian FLOW để xem các thông tin chi tiết:
3. Nút TCP Input: Nút này hoạt động như một Server hoặc một Client. Trong demo dưới đây, chúng ta chỉ dùng chúng như một Server, có vai trò chấp nhận yêu cầu kết nối của Client ESP32, nhận dữ liệu và gửi đến nút Debug để in thông báo ra màn hình. TCP Input Node giống như một Server ở cổng 8088 và có đầu ra là chuỗi (string).
Lưu ý: Node-RED hỗ trợ chúng ta nhập / xuất mô hình dưới dạng chuỗi JSON. Ví dụ, nếu xuất mô hình dưới dạng JSON, chúng ta được:
[{“id”:”4697139c.bf618c”,”type”:”tcp in”,”z”:”3fdd0fee.405598″,”name”:””,”server”:”server”,”host”:””,”port”:”8088″,”datamode”:”stream”,”datatype”:”utf8″,”newline”:””,”topic”:””,”base64″:false,”x”:109.5,”y”:156,”wires”:[[“ac4b15e3.4a2c88”]]}]
Giới thiệu ESP32 TCP IP
ESP32 cung cấp sẵn thư viện, giúp biến ESP32 thành Server hoặc Client để phục vụ các dự án IoT. Dưới đây là một số khái niệm chính bạn cần biết:
WiFi
Dưới đây là các câu lệnh quan trọng để khởi tạo kết nối với WiFi:
- WiFi.begin(ssid, pass): Bạn cần thay thế SSID (tên WiFi) và pass (mật khẩu WiFi) thành WiFi của bạn.
- WiFi.status(): Trả về kết quả trạng thái hiện tại (có đang kết nối WiFi hay không).
- WiFi.localIP(): Lấy địa chỉ IP cục bộ hiện tại của mạch ESP32 bạn đang dùng.
WiFi Client
Đây là công cụ dùng để tạo một TCP Client, với các câu lệnh quan trọng như:
- connect(host, port): kết nối với TCP Server tại host nào (dựa trên địa chỉ IP) và cổng nào.
- print(data[]): gửi dữ liệu đến Server.
- stop(): ngắt kết nối.
- available(): kiểm tra xem hiện tại có sẵn dữ liệu nào để đọc hay không.
- read(): đọc một byte dữ liệu.
- read(uint8_t *buf, size_t size): đọc byte dữ liệu vào buf.
- write(uint8_t data): ghi một byte dữ liệu.
- write(const uint8_t *buf, size_t size): ghi kích thước byte dữ liệu vào buf.
- connected(): Kết nối với Client.
WiFi Server
Chúng ta sử dụng lớp này để tạo một TCP Server, với các chức năng:
- started(): khởi động SErver.
- available(): kiểm tra xem có máy khách nào đang gửi yêu cầu kết nối.
- Accept(): chấp nhận yêu cầu kết nối từ máy khách
- write(uint8_t data): ghi một byte dữ liệu.
- write(const uint8_t *buf, size_t size): ghi byte vào buf
Mô hình Node-RED
Bạn chỉ cần nhập mô hình Node-RED dưới dạng chuỗi JSON (nhớ thay đổi địa chỉ IP của Server trong TCP Node) là được:
[{“id”:”866fb572.d4ebc”,”type”:”tcp out”,”z”:”f5a25538.3c5518″,”host”:”192.168.1.105″,”port”:”8088″,”beserver”:”client”,”base64″:false,”end”:false,”name”:””,”x”:420.5,”y”:163,”wires”:[]}]
Sau đó, bạn click vào nút Deploy (màu đỏ ở phía trên bên trái) để triển khai mô hình.
Khi thấy chuỗi đã được kết nối, bạn có thể click vào nút inject:
Nếu gặp lỗi disconnected, bạn chỉ cần đợi đến khi TCP Node kết nối lại với ESP32 Server.
Demo 1 – ESP32 là Server
Bước cuối cùng để làm việc với ESP32 TCP IP là nạp code vào mạch ESP32, bạn hãy dùng code mẫu sau (nhớ thay đổi mạng WiFi sao cho phù hợp):
#include <WiFi.h> const char* ssid = "tenda"; const char* password = "phong707"; /* create a server and listen on port 8088 */ WiFiServer server(8088); void setup() { Serial.begin(115200); Serial.print("Connecting to "); Serial.println(ssid); /* connecting to WiFi */ WiFi.begin(ssid, password); /*wait until ESP32 connect to WiFi*/ while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected with IP address: "); Serial.println(WiFi.localIP()); /* start Server */ server.begin(); } void loop(){ /* listen for client */ WiFiClient client = server.available(); uint8_t data[30]; if (client) { Serial.println("new client"); /* check client is connected */ while (client.connected()) { if (client.available()) { int len = client.read(data, 30); if(len < 30){ data[len] = '\0'; }else { data[30] = '\0'; } Serial.print("client sent: "); Serial.println((char *)data); } } } }
Hình ảnh minh họa:
Demo 2 – ESP32 là Client
Trong mô hình Node-RED, bạn cần nhập chuỗi JSON sau (Nhớ đổi địa chỉ IP của Server trong TCP Node):
[{“id”:”4697139c.bf618c”,”type”:”tcp in”,”z”:”3fdd0fee.405598″,”name”:””,”server”:”server”,”host”:””,”port”:”8088″,”datamode”:”stream”,”datatype”:”utf8″,”newline”:””,”topic”:””,”base64″:false,”x”:109.5,”y”:156,”wires”:[[“ac4b15e3.4a2c88”]]}]
Với ESP32 TCP IP, bạn nạp đoạn code sau:
#include <WiFi.h> /* Thay đổi tên và mật khẩu WiFi của bạn*/ const char* ssid = "tenda"; const char* password = "phong707"; /* * Địa chỉ IP của máy tính bạn dùng * [Với hệ điều hành Windows: Sử dụng ipconfig command, Với hệ điều hành Linux: Sử dụng ifconfig command] */ const char* host = "192.168.1.106"; const int port = 8088; void setup() { Serial.begin(115200); Serial.print("Connecting to "); Serial.println(ssid); /* kết nối với WiFi của bạn */ WiFi.begin(ssid, password); /* chờ đến khi ESP32 kết nối với WiFi*/ while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected with IP address: "); Serial.println(WiFi.localIP()); } void loop() { delay(5000); Serial.print("connecting to "); Serial.println(host); /* Sử dụng lớp WiFiClient để tạo kết nối TCP */ WiFiClient client; if (!client.connect(host, port)) { Serial.println("connection failed"); return; } /* Gửi dữ liệu đến Server */ client.print("hello world"); client.stop(); }
Hình minh họa kết quả:
Lời kết
Trên đây là hướng dẫn chi tiết về ESP32 TCP IP, với cả 2 demo là ESP32 làm Server lẫn ESP32 làm Client. Bạn có thể tham khảo thêm các dự án khác với ESP32:
- ESP32 Logging – 4 cách khác nhau để ghi dữ liệu ESP32
- ESP32 DAC – Lập trình tạo âm thanh với Arduino IDE
- Cách bật chế độ Deep Sleep ESP32 trên Arduino IDE
- Gửi Email đính kèm tệp qua máy chủ SMTP trên ESP32
IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers
- Website: https://www.iotzone.vn/
- Fanpage: https://www.facebook.com/Iotzonemaker
- SDT: 0364174499
- Zalo: https://zalo.me/0364174499