תוכן עניינים:

הגדרת שרת עדכונים אוטומטי ESP8266: 7 שלבים
הגדרת שרת עדכונים אוטומטי ESP8266: 7 שלבים

וִידֵאוֹ: הגדרת שרת עדכונים אוטומטי ESP8266: 7 שלבים

וִידֵאוֹ: הגדרת שרת עדכונים אוטומטי ESP8266: 7 שלבים
וִידֵאוֹ: עוזר בית - הגדרות ראשונות, עורך קבצים, Maria DB, HACS - אוקטובר 2023 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), אך עליך לדעת כיצד להגדיר שרת משלך בכדי לגרום לזה לעבוד.

הוראה זו מראה לך כיצד משתמשים בשרת NODE-RED, אך אותו היגיון חל על כל טכנולוגיית שרת שתבחר, למשל. Apache + PHP וכו '

שלב 1: מה שאתה צריך

  1. Arduino IDE
  2. ליבה ESP8266
  3. כל לוח ESP8266 עם זיכרון פלאש של 1M או יותר
  4. שרת אינטרנט (אפילו פי פטל צנוע יעשה - זה מה שאני משתמש בו)
  5. (אופציונלי) כלי mkspiffs אם ברצונך לעדכן אוטומטית תמונת מערכת קבצים של SPIFFS

שלב 2: צור מאגר כדי להחזיק תוכנות בינאריות

צור מאגר כדי להחזיק תוכנות בינאריות
צור מאגר כדי להחזיק תוכנות בינאריות

בשרת שלי, יש לי תיקייה בשם/home/pi/trucFirmware המכילה את תוכנות החומרה השונות של המכשיר ותמונות SPIFFS

אני שומר בינארי נפרד לכל סוג חומרה (מקובץ מקור אחד עם כמה #הגדרות) וכאשר מהדורה חדשה מוכנה אני משתמש בפקודת התפריט "sketch/Export compiled Binary" של Arduino IDE עבור כל מכשיר מטרה. שים לב שאפילו למרות שיש 5 סוגי חומרה שונים, ישנם רק שני קבצים בינאריים של SPIFFS: גרסה של 1M ו- 4M - שנבנתה עם הכלי mkspiffs - מכיוון שלכל המכשירים יש פלאש של 1M או 4M.

שלב 3: צור את הקבצים הבינאריים

השתמש באפשרות התפריט Arduino IDE sketch/Export Compiled Binary, צור את הקושחה שתעלה למכשיר כאשר היא מבקשת זאת משרת העדכונים.

אם אתה צריך בינארי SPIFFS יהיה עליך להתקין את הכלי mkspiffs.

ברגע שיש לך את זה, בניית בינארי SPIFFS היא פשוטה. יש לי קובץ אצווה של שורה אחת לגירסת 1M שלוקח את מספר הגרסה כפרמטר (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

ועוד לגרסת 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c נתונים/ spiffs_%1_4M.bin

לאחר מכן אני מעתיק את כל הקבצים הבינאריים המקובצים ואת קבצי ה- SPIFFS.binar אל המאגר

שלב 4: צור את זרימת השרת

צור את זרימת השרת
צור את זרימת השרת

אני משתמש ב- NODE-RED, אך ההיגיון הפשוט יהיה זהה בכל טכנולוגיית שפות / שפות.

א) הגדר כתובת אתר שתאזין לבקשת 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 לכתובת 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 == "סקיצה") {msg.payload = "/home/pi/trucFirmware/*. ino."+msg.type+". bin"; } אחר {var sz = h ['x-esp8266-chip-size']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } החזר הודעה;

זה רק מגדיר את הנתיב המתאים עם תו כללי לפונקציית sys הבאה, שפשוט פועלת

ls - r

הפלט מוזר אז לצומת הפונקציה "השווה גרסאות":

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

if (msg.mode == "סקיצה") {

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

if (msg.version <f) {

node.warn ("נדרש שדרוג");

node.warn ("יחזור"+שם קובץ); מסר החזרה; } node.warn ("ללא שדרוג"); msg.statusCode = 304; msg.payload = ;

מסר החזרה;

צומת המתג מבטיח שאז תישלח הודעת 304 "ללא צורך בעדכון" או שהבינארי החדש בפועל יוחזר ויוחזר למכשיר.

שלב 6: הוסף קוד לסקיצה לבקשת עדכון

על הסקיצה לכלול את הקוד הבא כך שהוא יתעדכן אוטומטית בפעם הבאה שתגדיל את מספר הגרסה:

#לִכלוֹל

#הגדר TRUC_VERSION "0_4_99"

#הגדר 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; // זהו שרת פטל הפטל שלי, 1880 הוא יציאת ברירת המחדל של NODE-RED // /עדכון הוא כתובת האתר שבחרתי לשרת "להקשיב", ואחריה סוג המכשיר … bool actualUpdate (bool sketch = false) {מחרוזת הודעה; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (שקר); אם (סקיצה) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** זהו השורה ש"עושה את העסק "} אחרת {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } אם (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("עדכון הצליח");

להחזיר נכון; } אחר {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("השדרוג נכשל");

}}} החזר שקר; }

שלב 7: לבסוף, התחל את העדכון

בזמן האתחול, או אולי כתגובה להודעת MQTT (כפי שאני עושה) הפעל את הקוד הבא:

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

// או ל- SPIFFS…

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

המכשיר יעדכן את עצמו ויפעיל מחדש את הקוד האחרון מהשרת. זה הרבה יותר פשוט בשבילי מאשר עדכון ידני של 33 מכשירים!

מידע רב יותר שימושי על אוטומציה ביתית, IOT ותכנות ה- ESP8266 ניתן למצוא בבלוג שלי

מוּמלָץ: