جدول المحتويات:

قم بإعداد خادم التحديث التلقائي ESP8266: 7 خطوات
قم بإعداد خادم التحديث التلقائي ESP8266: 7 خطوات

فيديو: قم بإعداد خادم التحديث التلقائي ESP8266: 7 خطوات

فيديو: قم بإعداد خادم التحديث التلقائي ESP8266: 7 خطوات
فيديو: إنترنت الأشياء: سرعة التحكم لمحرك DC مع وحدة NodeMCU ESP8266 و L298N 2024, ديسمبر
Anonim
قم بإعداد خادم التحديث التلقائي ESP8266
قم بإعداد خادم التحديث التلقائي ESP8266

يستخدم العديد من الأشخاص الآن ESP8266 بأشكاله المتعددة (ESP-01S ، Wemos D1 ، NodeMCU ، Sonoff إلخ) لأنظمة التشغيل الآلي للمنزل. إذا قمت بكتابة الكود الخاص بك (كما أفعل) ، فإن تحديث كل منها على حدة حتى عبر OTA (عبر الهواء) يصبح مملاً بعض الشيء.

على سبيل المثال ، يحتوي نظامي الخاص على 8x ESP-01S و 6 x Wemos D1 و 4x Sonoff Basic 12x Sonoff S20 و 2x Sonoff SV و NodeMCU التي تشترك في قاعدة رمز مشتركة ، لذلك هناك 33 جهازًا للتحديث عندما أقوم بإنشاء رمز بسيط يتغيرون.

ولكن هناك طريقة أسهل: "خادم تحديث". يحتوي نواة Arduino IDE + ESP8266 الممتازة على مكتبة للقيام بمعظم العمل (ESP8266httpUpdate) ، ولكنك تحتاج إلى معرفة كيفية إعداد الخادم الخاص بك لجعله يعمل.

يوضح لك هذا Instructable كيفية استخدام خادم NODE-RED ، ولكن نفس المنطق ينطبق على أي تقنية خادم من اختيارك ، على سبيل المثال Apache + PHP إلخ

الخطوة 1: ما تحتاجه

  1. اردوينو IDE
  2. ESP8266 الأساسية
  3. أي لوحة تطوير ESP8266 مع 1M أو أكثر من ذاكرة الوصول العشوائي
  4. خادم الويب (حتى لو كان Raspberry Pi المتواضع سيفعل - إنه ما أستخدمه)
  5. (اختياري) أداة mkspiffs إذا كنت تريد التحديث التلقائي لصورة نظام ملفات SPIFFS

الخطوة 2: إنشاء مستودع للاحتفاظ بالبرامج الثابتة الثنائية

قم بإنشاء مستودع للاحتفاظ بالبرامج الثابتة الثنائية
قم بإنشاء مستودع للاحتفاظ بالبرامج الثابتة الثنائية

على الخادم الخاص بي ، لدي مجلد يسمى / home / pi / trucFirmware والذي يحتوي على العديد من البرامج الثابتة للجهاز وصور SPIFFS

أحتفظ بثنائي منفصل لكل نوع من الأجهزة (من ملف مصدر واحد مع عدد قليل من التعريفات) وعندما يكون الإصدار الجديد جاهزًا ، أستخدم أمر القائمة Arduino IDE "رسم / تصدير ثنائي مترجم" لكل جهاز مستهدف. على الرغم من وجود 5 أنواع مختلفة من الأجهزة ، إلا أنه لا يوجد سوى اثنين من ثنائيات SPIFFS: إصدار 1M و 4 M - تم إنشاؤه باستخدام أداة mkspiffs - نظرًا لأن جميع الأجهزة بها إما 1M أو 4M فلاش.

الخطوة 3: إنشاء الثنائيات

باستخدام خيار قائمة Arduino IDE ، رسم / تصدير Compiled Binary ، أنشئ البرنامج الثابت الذي سيتم تحميله على الجهاز عندما يطلبه من خادم التحديث.

إذا كنت بحاجة إلى نظام SPIFFS الثنائي ، فستحتاج إلى تثبيت أداة mkspiffs.

بمجرد الحصول عليها ، يصبح إنشاء ملف SPIFFS الثنائي أمرًا بسيطًا. لدي ملف دفعي من سطر واحد للإصدار 1M والذي يأخذ رقم الإصدار كمعامل (٪ 1)

mkspiffs -c بيانات / spiffs_٪ 1_1M.bin

وآخر لنسخة 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c بيانات / 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: أضف Server Logic

العقدة الأولى في التدفق "تستمع" لطلب http إلى عنوان url https://192.168.1.4:1880/update مع نوع الجهاز الملحق. يمرر هذا إلى عقدة وظيفة "إنشاء مسار البحث" التي تحتوي على شفرة جافا سكريبت التالية:

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.replace (/ _ / dM \.bin / "") ؛ }

إذا (msg.version <f) {

node.warn ("الترقية مطلوبة") ؛

node.warn ("سيعود" + msg.filename) ؛ عودة الرسالة ؛ } node.warn ("بلا ترقية")؛ msg.statusCode = 304 ؛ msg.payload = ؛

عودة الرسالة ؛

ثم تضمن عقدة التبديل إما إرسال الرسالة 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؛ // هذا هو خادم raspberry Pi الخاص بي ، 1880 هو منفذ NODE-RED الافتراضي // / التحديث هو عنوان url الذي اخترته للخادم للاستماع إليه ، متبوعًا بنوع الجهاز … bool realUpdate (bool sketch = false) {سلسلة الرسائل ؛ t_httpUpdate_return تراجع ؛ ESPhttpUpdate.rebootOnUpdate (خطأ) ، إذا (رسم) {ret = ESPhttpUpdate.update (updateUrl، TRUC_VERSION) ؛ // **************** هذا هو السطر الذي "يقوم بالأعمال"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl ، SPIFFS_VERSION) ؛ } إذا (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("نجح التحديث") ؛

العودة صحيح } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("فشلت الترقية") ؛

} } } عودة كاذبة؛ }

الخطوة 7: أخيرًا ، ابدأ التحديث

في وقت التمهيد ، أو ربما استجابةً لرسالة MQTT (كما أفعل) ، قم بتشغيل الكود التالي:

إذا (_actualUpdate (صحيح)) ESP.restart () ؛

// أو لنظام SPIFFS …

إذا (_actualUpdate (false)) ESP.restart () ؛

سيقوم الجهاز بتحديث نفسه وإعادة التشغيل باستخدام أحدث رمز من الخادم. إنه أبسط بكثير بالنسبة لي من تحديث 33 جهازًا يدويًا!

يمكن العثور على الكثير من المعلومات المفيدة حول أتمتة المنزل وإنترنت الأشياء وبرمجة ESP8266 على مدونتي

موصى به: