Mục lục:

Thiết lập máy chủ cập nhật tự động ESP8266: 7 bước
Thiết lập máy chủ cập nhật tự động ESP8266: 7 bước

Video: Thiết lập máy chủ cập nhật tự động ESP8266: 7 bước

Video: Thiết lập máy chủ cập nhật tự động ESP8266: 7 bước
Video: Lập trình esp8266 - Bài 2 - Hướng dẫn điều khiển thiết bị từ xa qua wifi sử dụng blynk iot 2024, Tháng mười một
Anonim
Thiết lập máy chủ cập nhật tự động ESP8266
Thiết lập máy chủ cập nhật tự động ESP8266

Nhiều người hiện đang sử dụng ESP8266 dưới nhiều hình thức của nó (ESP-01S, Wemos D1, NodeMCU, Sonoff, v.v.) cho các hệ thống tự động hóa gia đình. Nếu bạn viết mã của riêng mình (như tôi làm), việc cập nhật từng mã này riêng biệt ngay cả qua OTA (qua mạng) sẽ trở nên hơi tẻ nhạt.

Ví dụ: hệ thống của tôi có 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV và một NodeMCU chia sẻ cơ sở mã chung, vì vậy có tất cả 33 thiết bị cần cập nhật khi tôi tạo một mã đơn giản thay đổi.

Nhưng có một cách dễ dàng hơn: Một "máy chủ cập nhật". Lõi Arduino IDE + ESP8266 tuyệt vời có một thư viện để thực hiện hầu hết công việc (ESP8266httpUpdate), nhưng bạn cần biết cách thiết lập máy chủ của riêng mình để làm cho nó hoạt động.

Có thể hướng dẫn này chỉ cho bạn cách sử dụng máy chủ NODE-RED, nhưng logic tương tự áp dụng cho bất kỳ công nghệ máy chủ nào bạn chọn, ví dụ: Apache + PHP, v.v.

Bước 1: Những gì bạn cần

  1. Arduino IDE
  2. Lõi ESP8266
  3. Bất kỳ bảng nhà phát triển ESP8266 nào có RAM flash 1M trở lên
  4. Một Máy chủ Web (ngay cả một chiếc Raspberry Pi khiêm tốn cũng sẽ làm được - Đó là thứ tôi sử dụng)
  5. (tùy chọn) công cụ mkspiffs nếu bạn muốn tự động cập nhật hình ảnh hệ thống tệp SPIFFS

Bước 2: Tạo một kho lưu trữ để chứa phần mềm cơ sở nhị phân

Tạo một kho lưu trữ để giữ phần mềm cơ sở nhị phân
Tạo một kho lưu trữ để giữ phần mềm cơ sở nhị phân

Trên máy chủ của tôi, tôi có một thư mục có tên / home / pi / trucFirmware chứa các phần mềm thiết bị khác nhau và hình ảnh SPIFFS

Tôi duy trì một tệp nhị phân riêng biệt cho từng loại phần cứng (từ một tệp nguồn duy nhất với một vài #defines) và khi bản phát hành mới sẵn sàng, tôi sử dụng lệnh menu Arduino IDE "sketch / Export Binary" đã biên dịch cho từng thiết bị đích. mặc dù có 5 loại phần cứng khác nhau, chỉ có hai mã nhị phân SPIFFS: phiên bản 1M và phiên bản 4M - được xây dựng bằng công cụ mkspiffs - vì tất cả các thiết bị đều có flash 1M hoặc 4M.

Bước 3: Tạo Binaries

Sử dụng tùy chọn trình đơn Arduino IDE sketch / Export Compiled Binary, tạo phần sụn sẽ được tải lên thiết bị khi nó yêu cầu từ máy chủ cập nhật.

Nếu bạn cần tệp nhị phân SPIFFS, bạn sẽ cần cài đặt công cụ mkspiffs.

Khi bạn đã có nó, việc xây dựng hệ nhị phân SPIFFS rất đơn giản. Tôi có tệp lô một dòng cho phiên bản 1M lấy số phiên bản làm tham số (% 1)

mkspiffs -c data / spiffs_% 1_1M.bin

và một cái khác cho phiên bản 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c dữ liệu / spiffs_% 1_4M.bin

Sau đó, tôi sao chép tất cả các tệp nhị phân đã biên dịch và tệp.binary SPIFFS vào kho lưu trữ

Bước 4: Tạo luồng máy chủ

Tạo luồng máy chủ
Tạo luồng máy chủ

Tôi đang sử dụng NODE-RED, nhưng logic đơn giản sẽ giống nhau trên bất kỳ công nghệ / ngôn ngữ máy chủ nào.

a) Xác định một url sẽ lắng nghe yêu cầu ESP8266httpUpdate. Serevr raspberryPi của tôi ở trên 192.168.1.4 và nghe trên cổng 1880 cho / cập nhật với loại phần cứng được thêm vào. Vì vậy, nếu tôi định yêu cầu một tệp nhị phân cho Wemos D1 Mini, url kết thúc là:

192.168.1.4:1880/update/d1_mini

b) Tạo mã để xử lý logic sau:

ESP8266: "Xin chào, tôi đang chạy phiên bản phần sụn a.b.c, bạn có phiên bản mới hơn không?"

Nếu có phiên bản mới hơn, máy chủ chỉ gửi nó dưới dạng tải dữ liệu nhị phân trong phản hồi http. Lớp ESP8266httpUpdate thực hiện phần khó khăn là sao chép nhị phân vào bộ nhớ, thay đổi địa chỉ khởi động phần sụn thành mã mới hơn là (nếu được yêu cầu) khởi động lại thiết bị để chạy mã mới.

Mặt khác, nếu không có phiên bản cao hơn, nó sẽ trả lời bằng lỗi http 304 có nội dung hiệu quả là: "Tôi không có gì cho bạn" và mã của bạn tiếp tục chạy như bình thường.

Bước 5: Thêm Logic máy chủ

Nút đầu tiên trong luồng "lắng nghe" yêu cầu http tới url https://192.168.1.4:1880/update với loại thiết bị được thêm vào. Nó chuyển nó đến nút chức năng "Xây dựng đường dẫn tìm kiếm" có mã javascript sau:

msg.type = msg.req.params.type; var h = msg.req.headers; msg.version = h ["x-esp8266-version"];

msg.mode = h ["x-esp8266-mode"];

if (msg.mode == "sketch") {msg.payload = "/ home / pi / trucFirmware / *. ino." + msg.type + ". bin"; } else {var sz = h ['x-esp8266-chip-size']; msg.payload = "/ home / pi / trucFirmware / spiffs _ * _" + (sz / 1048576) + "M.bin"; } trả về tin nhắn;

Điều này chỉ thiết lập đường dẫn thích hợp với ký tự đại diện cho hàm sys theo sau, chỉ cần chạy

ls - r

Đầu ra sau đó được đưa đến nút chức năng "So sánh các phiên bản":

var f = msg.payload.split ("\ n") [0]; msg.filename = f;

if (msg.mode == "sketch") {

f = f.replace ("/ home / pi / trucFirmware / truc_", ""); f = f.replace (". ino." + msg.type + ". bin", ""); } else {f = f.replace ("/ home / pi / trucFirmware / spiffs_", ""); f = f.replace (/ _ / dM \.bin /, ""); }

if (msg.version <f) {

node.warn ("yêu cầu nâng cấp");

node.warn ("sẽ trả về" + msg.filename); trả về tin nhắn; } node.warn ("không nâng cấp"); msg.statusCode = 304; msg.payload = ;

trả về tin nhắn;

Sau đó, nút chuyển đổi đảm bảo rằng thông báo 304 "không cần cập nhật" được gửi hoặc tệp nhị phân mới thực sự được trả lại và gửi trở lại thiết bị.

Bước 6: Thêm mã vào Sketch để yêu cầu cập nhật

Bản phác thảo cần có mã sau được bao gồm trong đó để nó sẽ tự động cập nhật vào lần tiếp theo bạn tăng số phiên bản:

#bao gồm

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// NÀY_DEVICE được đặt sớm hơn tùy thuộc vào các định nghĩa thời gian biên dịch khác nhau // mà cuối cùng xác định kiểu hw, ví dụ: #define NÀY_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" NÀY_DEVICE; // đây là máy chủ raspberry Pi của tôi, 1880 là cổng NODE-RED mặc định // / update là url tôi đã chọn để máy chủ "lắng nghe", theo sau là loại thiết bị… bool realUpdate (bool sketch = false) {Chuỗi thư; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (sai); if (sketch) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Đây là dòng "thực hiện công việc"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("CẬP NHẬT THÀNH CÔNG");

trả về true; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Nâng cấp Không thành công");

}}} trả về false; }

Bước 7: Cuối cùng, bắt đầu cập nhật

Tại thời điểm khởi động, hoặc có thể để phản hồi thông báo MQTT (như tôi làm), hãy chạy mã sau:

if (_actualUpdate (true)) ESP.restart ();

// hoặc cho SPIFFS…

if (_actualUpdate (false)) ESP.restart ();

Thiết bị sẽ tự cập nhật và khởi động lại chạy mã mới nhất từ máy chủ. Đối với tôi, nó đơn giản hơn rất nhiều so với việc cập nhật 33 thiết bị theo cách thủ công!

Bạn có thể tìm thấy nhiều thông tin hữu ích hơn về Tự động hóa gia đình, IOT và lập trình ESP8266 trên Blog của tôi

Đề xuất: