Dropbox làm CDN cho OTA firmware update

Làm việc với ESP8266 một thời gian, tôi không thích tổ chức SDK của Espressif nên quyết định viết lại Makefile để sử dụng các tài nguyên chung, như apps, driver, và để quá trình phát triển đơn giản hơn. Môi trường của em nó tôi public ở đây https://github.com/nqd/esp8266-dev. Một trong những điểm tôi sẽ dành rất nhiều thời gian cho nó là FOTA (Firmware Over-The-Air update).

Đây là mô hình của FOTA tôi định sẽ viết cho ESP8266, đơn giản như thế này: host kết nối đến FOTA server, kiểm tra version cuối cùng của application mà nó đang chạy. Nếu nó phát hiện thấy có version mới hơn, nó sẽ tự động tải firmware mới về, khởi động lại host để chạy version mới đó.

FOTA server chạy theo kiến trúc RESTful. Host kiểm tra trạng thái của application (tên chương trình nó đang chạy) thông qua HTTP GET:

Thông tin trả về từ OTA server chưa version cuối cùng như sau:

Nếu host hiện tại đang có phiên bản 0.1.88, nhận thấy nó đang có phiên bản nhỏ hơn, nó sẽ đi đến host/url tương ứng để tải firmware về.

Một cách để cung cấp firmware là lưu nó vào OTA server, khi đó host: fota-host, và url: /firmware/:application/versions/0.1.100 theo kiến trúc REST.

Để scale tốt hơn, tôi không nên lưu firmware vào OTA server; tôi nên sử dụng dịch vụ lưu trữ khác, có khả năng cung cấp băng thông tốt, ổn định như Amazon. Amazon có tính phí, và đương nhiên miễn phí vẫn tốt hơn, như Dropbox🙂.
Trước hết tôi tạo Dropbox Platform app https://www.dropbox.com/developers/apps/create, ví dụ esp-firmware

Sau khi tải hai file user1.bin, user2.bin lên Dropbox, tôi muốn lấy url tương ứng của của user1.bin hay user2.bin. Sử dụng dropbox.js với nodejs, chương trình client đơn gianr như sau sẽ lấy thông tin url của user1.bin

Kết qủa trả về cho status như sau

Sử dụng HTTP client đơn gianr với curl tới url trả về

Opp, đó chưa phải là địa chỉ dẫn đến file thật, nghĩa là client phải nhận thấy mã HTTP status code 302, rồi đi đến địa chỉ kế tiếp. Điều này khá phức tạp cho client như ESP. Tôi muốn có một địa chỉ trực tiếp. Đọc thêm API của nó phát hiện thấy tùy chọn

downloadHack (Boolean)
if set, a long-living download URL will be generated by asking for a preview URL and using the officially documented hack at https://www.dropbox.com/help/201 to turn the preview URL into a download URL

Bổ sung đoạn code trên, thêm vào {downloadHack: true}, kết qủa


Yup, có trường Content-Length: 387808, một yêu cầu của để system_upgrade_start() hoạt động được.

Đây là bước khởi đầu để có thể viết server cho FOTA. Tôi sẽ cập nhật code của server và client sau khi hoàn thành xong.

2 thoughts on “Dropbox làm CDN cho OTA firmware update”

  1. Chào bạn
    Mình đã làm quen với ESP8266 khoản một tháng và viết Firmware dựa trên Espressif (Mình nghĩ cái này là native nhất). Yêu cầu của mình là chỉ cần sử dụng Mqtt để giao tiếp với Broker để nhận và gửi dữ liệu ổn định. Tuy nhiên theo mình thấy thì ESP8266 thật sự không ổn đinh. Ví dụ như: Publish message liên tục mỗi 2s trong vòng 2 phút là không gửi được nữa, đôi khi ESP khởi động lại nhiều lần.

    Bạn có giải pháp nào để ESP8266 thật sự chạy ổn định không. Vì nếu không kết wifi và gửi dữ liệu ổn định thì không thể làm gì, vì hệ thống lúc này không đáng tin cậy. Có lúc điều khiển được, lúc không.

    Mong phản hồi sớm của bạn. Cám ơn bạn.

    1. Tôi không thấy hiện tượng gioongs như anh nói, esp chạy khá ổn định. Tôi ít khi nào gặp lỗi do lib cung cấp bởi espressif (ngoại trừ ssl).
      Đa số SoC khởi động lại khi chương trình mình viết bị lỗi, watchdog timmer khởi động lại hệ thống.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s