Πίνακας περιεχομένων:

Ρύθμιση διακομιστή αυτόματης ενημέρωσης ESP8266: 7 βήματα
Ρύθμιση διακομιστή αυτόματης ενημέρωσης ESP8266: 7 βήματα

Βίντεο: Ρύθμιση διακομιστή αυτόματης ενημέρωσης ESP8266: 7 βήματα

Βίντεο: Ρύθμιση διακομιστή αυτόματης ενημέρωσης ESP8266: 7 βήματα
Βίντεο: MotionEye on Orange PI -CCTV Server for ESP32 CAM - Part2 ESP32-CAM (Subtittled) 2024, Νοέμβριος
Anonim
Ρύθμιση διακομιστή αυτόματης ενημέρωσης ESP8266
Ρύθμιση διακομιστή αυτόματης ενημέρωσης ESP8266

Πολλοί άνθρωποι χρησιμοποιούν τώρα το ESP8266 στις πολλές μορφές του (ESP-01S, Wemos D1, NodeMCU, Sonoff κ.λπ.) για συστήματα αυτοματισμού σπιτιού. Αν γράψετε τον δικό σας κωδικό (όπως και εγώ), η ενημέρωση καθενός από αυτούς ξεχωριστά ακόμη και μέσω OTA (μέσω του αέρα) γίνεται λίγο κουραστική.

Το δικό μου σύστημα, για παράδειγμα, έχει 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV και NodeMCU που μοιράζονται μια κοινή βάση κώδικα, οπότε συνολικά 33 συσκευές πρέπει να ενημερώνονται όταν φτιάχνω έναν απλό κωδικό αλλαγή.

Υπάρχει όμως ένας ευκολότερος τρόπος: Ένας "διακομιστής ενημέρωσης". Ο εξαιρετικός πυρήνας Arduino IDE + ESP8266 διαθέτει μια βιβλιοθήκη για να εκτελέσει το μεγαλύτερο μέρος της εργασίας (ESP8266httpUpdate), αλλά πρέπει να ξέρετε πώς να ρυθμίσετε τον δικό σας διακομιστή για να λειτουργήσει.

Αυτό το Instructable σας δείχνει τον τρόπο χρήσης ενός διακομιστή NODE-RED, αλλά η ίδια λογική ισχύει για οποιαδήποτε τεχνολογία διακομιστή της επιλογής σας π.χ. Apache + PHP κλπ

Βήμα 1: Αυτό που χρειάζεστε

  1. Arduino IDE
  2. ESP8266 πυρήνας
  3. Οποιοσδήποτε πίνακας ESP8266 dev με 1M ή περισσότερη μνήμη RAM flash
  4. Ένας διακομιστής Ιστού (ακόμη και ένα ταπεινό βατόμουρο Pi θα το κάνει - είναι αυτό που χρησιμοποιώ)
  5. (προαιρετικό) εργαλείο mkspiffs εάν θέλετε να ενημερώσετε αυτόματα μια εικόνα συστήματος αρχείων SPIFFS

Βήμα 2: Δημιουργήστε ένα αποθετήριο για να κρατάτε δυαδικά υλικολογισμικά

Δημιουργήστε ένα αποθετήριο για να κρατάτε δυαδικά υλικολογισμικά
Δημιουργήστε ένα αποθετήριο για να κρατάτε δυαδικά υλικολογισμικά

Στον διακομιστή μου, έχω έναν φάκελο που ονομάζεται/home/pi/trucFirmware που περιέχει τα διάφορα υλικολογισμικά συσκευών και εικόνες SPIFFS

Διατηρώ ένα ξεχωριστό δυαδικό αρχείο για κάθε τύπο υλικού (από ένα αρχείο προέλευσης με μερικούς #ορισμούς) και όταν μια νέα έκδοση είναι έτοιμη, χρησιμοποιώ την εντολή μενού Arduino IDE "σκίτσο/Εξαγωγή μεταγλωττισμένου δυαδικού" για κάθε συσκευή -στόχο. Σημειώστε ότι ακόμη και αν και υπάρχουν 5 διαφορετικοί τύποι υλικού, υπάρχουν μόνο δύο δυαδικά SPIFFS: έκδοση 1Μ και 4Μ - κατασκευασμένη με το εργαλείο mkspiffs - αφού όλες οι συσκευές διαθέτουν φλας 1Μ ή 4Μ.

Βήμα 3: Δημιουργήστε τα δυαδικά αρχεία

Χρησιμοποιώντας το σχέδιο του μενού Arduino IDE/Export Compiled Binary, δημιουργήστε το υλικολογισμικό που θα μεταφορτωθεί στη συσκευή όταν το ζητήσει από το διακομιστή ενημέρωσης.

Εάν χρειάζεστε ένα δυαδικό SPIFFS, θα χρειαστεί να εγκαταστήσετε το εργαλείο mkspiffs.

Μόλις το έχετε, η δημιουργία του δυαδικού SPIFFS είναι απλή. Έχω ένα αρχείο δέσμης μιας γραμμής για την έκδοση 1Μ που λαμβάνει ως παράμετρο τον αριθμό έκδοσης (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

και άλλο για την έκδοση 4Μ:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c data/ spiffs_%1_4M.bin

Στη συνέχεια, αντιγράφω όλα τα μεταγλωττισμένα δυαδικά αρχεία και τα δυαδικά αρχεία SPIFFS στο αποθετήριο

Βήμα 4: Δημιουργήστε τη ροή διακομιστή

Δημιουργήστε τη ροή διακομιστή
Δημιουργήστε τη ροή διακομιστή

Χρησιμοποιώ το NODE-RED, αλλά η απλή λογική θα είναι η ίδια σε οποιαδήποτε τεχνολογία / γλώσσα διακομιστή.

α) Ορίστε ένα url που θα ακούει το αίτημα ESP8266httpUpdate. Το raspberryPi serevr μου είναι 192.168.1.4 και ακούει στη θύρα 1880 για /ενημέρωση με τον τύπο υλικού προσαρτημένο. Έτσι, εάν πρόκειται να ζητήσω ένα δυαδικό αρχείο για ένα Wemos D1 Mini, το url καταλήγει ως:

192.168.1.4:1880/update/d1_mini

β) Δημιουργήστε κώδικα για να χειριστείτε την ακόλουθη λογική:

ESP8266: "Γεια, τρέχω την έκδοση υλικολογισμικού a.b.c, έχετε νεότερη έκδοση;" Διακομιστής: "Επιτρέψτε μου να δω … αχ ναι έχω a.b.d - εδώ έρχεται …"

Εάν υπάρχει νεότερη έκδοση, ο διακομιστής απλώς το στέλνει ως φορτίο δυαδικών δεδομένων στην απάντηση http. Η κλάση ESP8266httpUpdate κάνει το δύσκολο κομμάτι της αντιγραφής του δυαδικού στη μνήμη, αλλάζοντας τη διεύθυνση εκκίνησης υλικολογισμικού στο νέο κώδικα παρά (εάν ζητηθεί) επανεκκίνηση της συσκευής για εκτέλεση του νέου κώδικα.

Εάν από την άλλη πλευρά δεν υπάρχει υψηλότερη έκδοση, απαντά με ένα σφάλμα http 304 που λέει αποτελεσματικά: "Δεν έχω τίποτα για εσάς" και ο κωδικός σας συνεχίζει να λειτουργεί κανονικά.

Βήμα 5: Προσθέστε τη Λογική διακομιστή

Ο πρώτος κόμβος στη ροή "ακούει" ένα http αίτημα για url https://192.168.1.4:1880/update με συνημμένο τον τύπο συσκευής. Το περνάει στον κόμβο λειτουργίας "Κατασκευή διαδρομής αναζήτησης", ο οποίος έχει τον ακόλουθο κώδικα javascript:

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"; } επιστροφή msg;

Αυτό απλώς δημιουργεί την κατάλληλη διαδρομή με μπαλαντέρ για τη συνάρτηση sys που ακολουθεί, η οποία απλώς εκτελείται

ls - r

Στη συνέχεια, η έξοδος τροφοδοτείται στον κόμβο λειτουργίας "Σύγκριση εκδόσεων":

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

εάν (msg.mode == "σκίτσο") {

f = f.replace ("/home/pi/trucFirmware/truc_", ""); f = f.replace (". ino."+msg.type+". bin", ""); } else {f = f.replace ("/home/pi/trucFirmware/spiffs_", ""); f = f. αντικατάσταση (/_ / dM \.bin/, ""); }

αν (msg.version <f) {

node.warn ("απαιτείται αναβάθμιση");

node.warn ("θα επιστρέψει"+msg.filename); επιστροφή msg. } node.warn ("καμία αναβάθμιση"); msg.statusCode = 304; msg.payload = ;

επιστροφή msg.

Ο κόμβος διακόπτη διασφαλίζει ότι είτε αποστέλλεται το μήνυμα "δεν απαιτείται ενημέρωση" 304 ή ότι το πραγματικό νέο δυαδικό επιστρέφεται και αποστέλλεται πίσω στη συσκευή.

Βήμα 6: Προσθέστε κώδικα στο σκίτσο για να ζητήσετε ενημέρωση

Το σκίτσο πρέπει να περιλαμβάνει τον ακόλουθο κώδικα, ώστε να ενημερώνεται αυτόματα την επόμενη φορά που θα αυξήσετε τον αριθμό έκδοσης:

#περιλαμβάνω

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE έχει οριστεί νωρίτερα ανάλογα με διάφορους ορισμούς χρόνου μεταγλώττισης // οι οποίοι τελικά ορίζουν τον τύπο hw, π.χ. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // αυτός είναι ο διακομιστής μου βατόμουρου Pi, το 1880 είναι η προεπιλεγμένη θύρα NODE-RED // /η ενημέρωση είναι το url που επέλεξα για διακομιστή για "ακρόαση", ακολουθούμενο από τον τύπο συσκευής … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); if (σκίτσο) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Αυτή είναι η γραμμή που "κάνει την επιχείρηση"} αλλιώς {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

επιστροφή αληθινός? } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Αποτυχία αναβάθμισης");

}}} επιστροφή false; }

Βήμα 7: Τέλος, ξεκινήστε την ενημέρωση

Κατά την εκκίνηση ή ίσως ως απάντηση σε ένα μήνυμα MQTT (όπως κάνω) εκτελέστε τον ακόλουθο κώδικα:

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

// ή για SPIFFS…

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

Η συσκευή θα ενημερωθεί και θα επανεκκινήσει εκτελώντας τον πιο πρόσφατο κώδικα από το διακομιστή. Είναι πολύ πιο απλό για μένα από τη μη αυτόματη ενημέρωση 33 συσκευών!

Πολύ περισσότερες χρήσιμες πληροφορίες σχετικά με τον αυτοματισμό σπιτιού, το IOT και τον προγραμματισμό του ESP8266 μπορείτε να βρείτε στο My Blog

Συνιστάται: