Trong bài này chúng ta sẽ học cách sử dụng ESP32 FOTA (Firmware Over The Air) thông qua Internet. Và quản lý version của phần mềm trên một website.
Bài 9 Wifi trong Serie Học ESP32 từ A tới Z
Tại sao chúng ta cần FOTA Inernet
Như các bạn đã được học ở bài trước, ESP32 có thể nạp firmware thông qua wifi mà không cần kết nối với mạch nạp, bằng cách tự tạo cho mình 1 web site, người dùng sẽ truy cập vào ESP32 và upload firmware lên.
Trong thực tế hiện nay, rất hiếm khi chúng ta sử dụng phương pháp này trong những mạch thương mại. Có 2 lý do chính:
- Bảo mật: Các bạn không thể share firmware cho khách hàng, điều này có thể dẫn tới việc đối thủ sẽ lấy fw của bạn để sản xuất sản phẩm giống bạn mà không cần phải mất công nghiên cứu
- Khách hàng đa số không thích những thứ khó khăn: Việc update như bài trước có thể rất dễ với bạn, nhưng đối với đa số khách hàng chúng rất phiền phức. Họ thà không sử dụng còn hơn
Vậy nên, chúng ta cần nạp FOTA thông qua Internet. Có một máy chủ lưu trữ và quản lý version của sản phẩm của bạn
Nguyên lý FOTA Internet
Để có thể nạp firmware từ xa cho ESP32 qua Internet. Chúng ta cần 1 máy chủ lưu giữ. Khi cập nhật hệ thống sẽ tuân theo các bước sau:
- Nhà phát triển Upload firmware lên máy chủ
- ESP32 sẽ gọi 1 API lên server đó, truy vấn xem có bản cập nhật mới không. Việc hỏi này sẽ được lặp lại liên tục có thể 1 vài phút 1 lần hoặc 1 vài ngày, tùy người phát triển
- Nếu nhận được thông tin thay đổi version, ESP32 sẽ download firmware về thông qua internet.
- Khởi động lại với firmware mới
Trong bài này chúng ta sẽ sử dụng server của OTA Drive. Một website quản lý firmware miễn phí.
Setup trên OTA Drive
Đầu tiên các bạn truy cập vào website: https://www.otadrive.com/\
Đăng kí một account và đăng nhập vào
Chuyển qua Tab Product và làm các bước sau:
Ok. Vậy là các bạn đã có API key để truy cập vào Product này. Việc tiếp theo chúng ta cần làm là lập trình cho ESP32
Lập trình ESP32 FOTA Internet
Đầu tiên, tạo một project ESP32, mình không hướng dẫn lại nữa.
Tiếp tới là viết các hàm để truy cập vào wifi nhà bạn.
Sau đó viêt hàm cập nhật qua OTA
Trong hàm này chúng ta gọi API tới OTA Drive với các tham số truyền vào là:
- K: Key API chúng ta đã lấy ở bước trước
- V: Version firmware hiện tại để so sánh với version lưu trữ trên server
- S: Là ID của chip, ID này là duy nhất với mỗi con ESP32 để định danh chúng với các ESP32 khác dùng chung firmware.\
Sử dụng hàm getID để lấy ID của ESP32
Cuối cùng, chúng ta sẽ gọi hàm update mỗi 5s 1 lần ( 10 lần count 500ms) trong loop, các bạn có thể sử dụng timer cho việc này.
Trong loop là chương trình chúng ta chạy. Với bài này mình chỉ làm mẫu là gửi qua Serial mỗi 500ms thôi.
Full code
#include <Arduino.h> #include <HTTPUpdate.h> void update_FOTA(); void setup() { Serial.begin(9600); WiFi.begin("SSID", "PASSWORD"); Serial.println("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(WiFi.localIP()); } uint32_t updateCounter = 0; String version = "1.1"; String key = "573db5bf-91b7-4555-884b-67f77a9cc7fd"; void loop() { Serial.print("Ver: "); Serial.println(version); delay(500); if (WiFi.status() == WL_CONNECTED) { updateCounter++; if (updateCounter > 10) { updateCounter = 0; Serial.println("Check update"); update_FOTA(); } } } String getChipId() { String ChipIdHex = String((uint32_t)(ESP.getEfuseMac() >> 32), HEX); ChipIdHex += String((uint32_t)ESP.getEfuseMac(), HEX); return ChipIdHex; } void update_FOTA() { String url = "http://otadrive.com/deviceapi/update?"; url += "k=" + key; url += "&v=" + version; url += "&s=" + getChipId(); // định danh thiết bị trên Cloud WiFiClient client; httpUpdate.update(client, url, version); }
OK, vậy là đã xong. Chúng ta nạp firmware này cho ESP32.
Khi chuyển qua tab Overview và thấy Device Count lên 1 là ESP32 đã kết nối lên server rồi. Lưu ý nếu không thấy thì các bạn refesh trình duyệt nhé
Nhưng lúc này khi check update vẫn thấy 401 vì thiết bị chưa được Verify (Xác nhận tin tưởng)
Các bạn làm theo các bước
Như vậy là ESP32 đã kết nối được với Server và sẵn sàng cho việc FOTA
Quản lý phiên bản trên OTA Drive
Tạo phiên bản firmware ESP32 trên VS code
Đầu tiên chúng ta phải tạo ra các phiên bản firmware cho ESP32.
Các bạn sửa code theo yêu cầu cần nâng cấp, sau đó sửa version là 1.1 (fw mặc định mà bạn nạp lúc trước là 1.0)
Upload firmware lên OTA Drive
Làm tiếp tục nếu bạn có các phiên bản khác
Thay đổi version firmware và FOTA Internet vào ESP32
Các ban chuyển qua tab Group và nhấn mở.
Nhấn monitor để đọc serial về. Các bạn sẽ thấy ESP32 sẽ update khoảng 30s sau đó sẽ reboot và chạy với phiên bản mà bạn chọn về.
Ngoài ra OTA drive còn có nhiều tính năng khác cho việc quản lý phiên bản. Các bạn hãy tự tìm hiểu nhé.
Kết
ESP32 FOTA Internet là một phần rất quan trọng khi các bạn làm các sản phẩm thương mại, vì các sản phẩm khi release chưa chắc đã hoàn hảo, cần update thêm tính năng hoặc sửa lỗi. Vậy nên làm chủ được nó sẽ giúp sản phẩm của bạn sẽ được nâng cấp liên tục, người sử dụng cũng sẽ không cần phải làm gì cả.
Nếu bạn thấy bài viết này có ích hãy bình luận và đừng quên ra nhập Hội Anh Em Nghiện Lập trình nhé.
anh có làm tutorial về server, cách để post file bin lên server và cách để get dữ liệu xuống phía firmware ko ạ
A sẽ làm sau nhé.
rất hay rất bổ ích.
Cám ơn bạn
Bạn cho mình hỏi! khi đang OTA nhưng bị mất mạng hoặc mất điện thì khi khởi động lại ESP32 có cập nhật lại firmware được không
bạn cho mình hỏi sao lúc mình cập nhật hoàn thành nó chạy chương trình mới rồi nhưng khi reset lại nó lại quay về phiên bản cũ và lại tiếp tục cập nhật
xem lại partitions table