Chia sẻ đam mê công nghệ
Thiết lập

ESP-NOW cho ESP32: Giao tiếp trực tiếp không cần router

ESP-NOW giúp các bo mạch ESP32 gửi gói dữ liệu trực tiếp qua sóng Wi-Fi, không cần kết nối router. Điểm cần tính trước là giới hạn payload và kênh Wi-Fi khi một bo mạch đồng thời vào mạng LAN.

Tóm tắt nhanh

  • ESP-NOW truyền dữ liệu trực tiếp giữa các thiết bị dùng Wi-Fi radio, không cần router hay kết nối TCP/IP.
  • Giao thức phù hợp với sự kiện ngắn và số đo cảm biến; payload tối đa là 250 byte ở v1.0 và 1.470 byte ở v2.0.
  • Nếu một bo mạch đồng thời kết nối router, các peer ESP-NOW cần dùng cùng kênh Wi-Fi để tránh mất gói.
  • Đây là lựa chọn cho liên lạc cục bộ gọn nhẹ, không thay thế Wi-Fi thông thường khi cần web, LAN hoặc cloud.

Hai bo mạch ESP32 có thể gửi nút bấm, nhiệt độ hay độ ẩm cho nhau mà không cần router. ESP-NOW vẫn dùng sóng Wi-Fi của chip, nhưng gửi các frame trực tiếp theo địa chỉ MAC thay vì đưa dữ liệu qua mạng TCP/IP; vì vậy nó hợp với cảm biến và điều khiển cục bộ hơn là truyền dữ liệu lớn.

ESP-NOW bỏ qua các tầng mạng không cần cho gói dữ liệu nhỏ

Sơ đồ so sánh mô hình OSI và ESP-NOW
Sơ đồ kiến trúc cho thấy ESP-NOW gộp các tầng mạng phía trên thành một tầng giao thức. Ảnh: Espressif Systems

Trong Wi-Fi thông thường, thiết bị kết nối vào điểm truy cập rồi dùng các giao thức mạng để đưa dữ liệu tới ứng dụng. ESP-NOW rút gọn năm tầng phía trên trong mô hình OSI thành một tầng giao thức, đóng dữ liệu ứng dụng vào vendor-specific action frame và gửi tới thiết bị ngang hàng. Cách này giảm phần xử lý trung gian, nhưng không có nghĩa là chip ngừng dùng Wi-Fi: bộ thu phát Wi-Fi vẫn hoạt động, chỉ không cần ghép vào router.

Thiết bị nhận diện nhau bằng địa chỉ MAC. Tài liệu ESP-IDF yêu cầu khởi động Wi-Fi trước khi khởi tạo ESP-NOW và thêm peer vào danh sách trước khi gửi unicast; dữ liệu cần gửi phải nằm trong giới hạn kích thước gói của phiên bản tương thích. Do đó, giao thức phù hợp để chuyển một trạng thái như bật/tắt, một lệnh điều khiển hoặc một số đo cảm biến, thay vì nội dung web hay dữ liệu lớn.

Payload nhỏ khiến ESP-NOW hợp với cảm biến và lệnh điều khiển

Sơ đồ vai trò thiết bị trong ESP-NOW
Mô hình vai trò thiết bị cho thấy liên kết ESP-NOW giữa nút khởi tạo và nút nhận. Ảnh: Espressif Systems

Espressif ghi nhận ESP-NOW v1.0 hỗ trợ payload tối đa 250 byte, còn v2.0 nâng giới hạn lên 1.470 byte. Thiết bị v2.0 có thể nhận gói v1.0; chiều ngược lại có giới hạn tương thích, vì thiết bị v1.0 chỉ xử lý được phần dữ liệu không vượt 250 byte, còn gói dài hơn có thể bị cắt hoặc loại bỏ tùy phiên bản ESP-IDF.

Trong một thử nghiệm thực tế, một bo mạch gửi sự kiện từ nút BOOT để bật đèn ở bo mạch thứ hai; toàn bộ 50 lần nhấn được nhận. Ở thử nghiệm khác, cảm biến AHT10 gửi nhiệt độ và độ ẩm sang bo mạch có màn hình OLED 1,3 inch. Khi đặt hai bo mạch cùng bàn, cách nhau một bức tường rồi hai bức tường, tác giả không ghi nhận gói nào bị mất; kết quả chỉ phản ánh cấu hình thử này, không bảo đảm tầm phủ hay độ tin cậy tương tự trong mọi ngôi nhà.

ESP-NOW có thể gửi broadcast, unicast và hỗ trợ mô hình một-nhiều hoặc nhiều-nhiều theo tài liệu Espressif. ESP-IDF hiện nêu tối đa 20 peer, trong đó tối đa 17 peer được mã hóa; con số mặc định cho peer mã hóa là 7. Khi thiết kế mạng nhiều cảm biến, giới hạn peer, dung lượng mỗi gói và cách xác nhận gói nhận được đều cần tính từ đầu, thay vì xem việc gửi thành công ở tầng MAC là bảo đảm ứng dụng đã xử lý dữ liệu.

Kết nối router kéo theo bài toán đồng bộ kênh

ESP-NOW phát huy lợi thế khi các bo mạch chỉ cần nói chuyện với nhau. Nhưng nếu một bo mạch phải đưa dữ liệu lên Home Assistant, máy chủ trong LAN hoặc Internet, nó cần kết nối Wi-Fi thông thường; lúc đó radio của thiết bị hoạt động trên kênh mà router đang dùng, và các peer ESP-NOW cũng phải khớp kênh.

Trong thử nghiệm XDA, bo mạch nhận kết nối router ở kênh 1 và liên kết vẫn nhận đủ gói khi bo mạch gửi cũng ở kênh đó. Khi tác giả ép thiết bị gửi sang kênh khác, lượng gói thất lạc tăng lên khoảng một nửa; đưa nó về kênh router thì liên lạc trở lại bình thường. Đây là quan sát trên thiết lập cụ thể của tác giả, không phải tỷ lệ mất gói áp dụng cho mọi cấu hình.

ESP-IDF cho phép đặt kênh peer bằng 0 để dùng kênh hiện tại, hoặc chỉ định kênh cụ thể phải trùng với kênh của giao diện Wi-Fi đang dùng. Vì vậy, nếu router tự đổi kênh, một mạng ESP-NOW đang ghép với thiết bị kết nối router có thể cần được kiểm tra lại. Với dự án cần LAN hoặc Internet, Wi-Fi thông thường thường đơn giản hơn; ESP-NOW phù hợp hơn làm liên kết cục bộ giữa nút cảm biến và một gateway.

ESP-NOW không thay thế Wi-Fi khi cần web hoặc cloud

Không có TCP/IP đầy đủ đồng nghĩa thiết bị ESP-NOW không thể tự mở giao diện web hay gọi HTTPS lên máy chủ. Có thể ghép giao thức này với một bo mạch làm gateway: các nút gửi dữ liệu nhỏ bằng ESP-NOW, còn gateway kết nối router để chuyển tiếp lên LAN hoặc cloud. Đổi lại, gateway trở thành điểm phụ thuộc về nguồn điện, cấu hình kênh và xử lý khi mất kết nối.

Với dự án DIY tại Việt Nam, các mạch ESP32 phổ biến có thể đảm nhiệm vai trò nút gửi, nút nhận hoặc gateway; giá linh kiện tùy cửa hàng và phiên bản bo mạch. Trước khi chọn giao thức, nên xác định dữ liệu cần gửi có vừa payload hay không, thiết bị nào cần truy cập LAN, và cách đồng bộ kênh sẽ được quản lý ra sao. Nếu mục tiêu chỉ là truyền trạng thái hoặc số đo trong nhà, ESP-NOW giúp bỏ router khỏi đường truyền giữa hai thiết bị; nếu cần truy cập dịch vụ mạng, router vẫn là phần không thể bỏ qua.

Nguồn tham khảo: Espressif ESP-IDF Programming Guide, Espressif ESP-NOW User Guide, XDA Developers

Bài này thế nào?

Hoá đơn của bài này

Tek viết bài này bằng cà phê. Mời Tek một ly nha?

Theo dõi TekCafe: Facebook · YouTube

Bài viết mới nhất