فهرست مطالب:

راه اندازی سرور ESP8266 Automatic Update Automatic: 7 Step
راه اندازی سرور ESP8266 Automatic Update Automatic: 7 Step

تصویری: راه اندازی سرور ESP8266 Automatic Update Automatic: 7 Step

تصویری: راه اندازی سرور ESP8266 Automatic Update Automatic: 7 Step
تصویری: Programming ESP-01S ESP-01 with NodeMCU D1 mini ESP32 UNO NANO FTDI 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. آردوینو IDE
  2. هسته ESP8266
  3. هر برد ESP8266 dev با 1M یا بیشتر فلش RAM
  4. یک وب سرور (حتی یک تمشک پای متواضع هم انجام می دهد - این چیزی است که من استفاده می کنم)
  5. اگر می خواهید یک تصویر سیستم فایل SPIFFS را به طور خودکار به روز کنید ، ابزار mkspiffs (اختیاری) است

مرحله 2: یک مخزن برای نگهداری نرم افزارهای دودویی ایجاد کنید

یک مخزن برای نگهداری نرم افزارهای دودویی ایجاد کنید
یک مخزن برای نگهداری نرم افزارهای دودویی ایجاد کنید

در سرورم ، من یک پوشه به نام/home/pi/trucFirmware دارم که دارای firmware های مختلف دستگاه و تصاویر SPIFFS است

من یک باینری جداگانه برای هر نوع سخت افزار (از یک فایل منبع واحد با چند #تعریف) نگه می دارم و وقتی نسخه جدیدی آماده شد از دستور منو Arduino IDE "sketch/Export compiled Binary" برای هر دستگاه موردنظر استفاده می کنم. توجه داشته باشید که حتی اگرچه 5 نوع سخت افزار مختلف وجود دارد ، فقط دو باینری SPIFFS وجود دارد: نسخه 1M و 4M - ساخته شده با ابزار mkspiffs - زیرا همه دستگاه ها دارای فلش 1M یا 4M هستند.

مرحله 3: باینری ها را ایجاد کنید

با استفاده از طرح منوی Arduino IDE/Export Compiled Binary ، سیستم عامل را ایجاد کنید که در صورت درخواست دستگاه از سرور به روز رسانی بارگذاری می شود.

اگر به دودویی SPIFFS نیاز دارید ، باید ابزار mkspiffs را نصب کنید.

هنگامی که آن را دارید ، ساختن باینری SPIFFS ساده است. من یک فایل دسته ای یک خطی برای نسخه 1M دارم که شماره نسخه را به عنوان پارامتر در نظر می گیرد (٪ 1)

mkspiffs -c data/ spiffs_٪ 1_1M.bin

و دیگری برای نسخه 4M:

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

سپس تمام فایلهای باینری کامپایل شده و فایلهای.binary SPIFFS را به مخزن کپی می کنم

مرحله 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 پاسخ می دهد که به طور م saysثر می گوید: "من چیزی برای شما ندارم" و کد شما به حالت عادی ادامه می دهد.

مرحله 5: منطق سرور را اضافه کنید

اولین گره در جریان به درخواست 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؛

این فقط مسیر مناسب با wildcard را برای عملکرد 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"، "")؛ } else {f = f.replace ("/home/pi/trucFirmware/spiffs_"، "")؛ f = f.replace (/_ / dM \.bin/، "") ؛ }

if (msg.version <f) {

node.warn ("ارتقاء لازم است")؛

node.warn ("بازگشت"+msg.filename)؛ بازگشت msg؛ } node.warn ("بدون ارتقا")؛ msg.statusCode = 304؛ msg.payload = ؛

بازگشت msg؛

سپس گره سوئیچ اطمینان می دهد که پیام 304 "نیازی به به روز رسانی نیست" ارسال می شود یا باینری جدید واقعی بازگردانده و به دستگاه ارسال می شود.

مرحله 6: برای درخواست بروزرسانی ، کد را به طرح اضافه کنید

این طرح باید کد زیر را در خود داشته باشد تا دفعه بعد که شماره نسخه را افزایش دهید به طور خودکار به روز شود:

#عبارتند از

#تعریف TRUC_VERSION "0_4_99"

#تعریف SPIFFS_VERSION "0_5_0"

// THIS_DEVICE زودتر بسته به تعریف کامپایل زمان تعریف شده است // که در نهایت نوع hw را تعریف می کند ، به عنوان مثال #این THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE؛ // این سرور تمشک Pi من است ، 1880 پورت NODE-RED پیش فرض است // /بروزرسانی آدرس اینترنتی است که سرور برای "گوش دادن" انتخاب کرده است ، و به دنبال آن نوع دستگاه … 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 false؛ }

مرحله 7: در نهایت ، به روز رسانی را آغاز کنید

هنگام راه اندازی ، یا شاید در پاسخ به پیام MQTT (مانند من) کد زیر را اجرا کنید:

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

// یا برای SPIFFS…

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

دستگاه به روز می شود و آخرین کد را از سرور راه اندازی مجدد می کند. برای من بسیار ساده تر از به روزرسانی دستی 33 دستگاه است!

اطلاعات مفیدتر در مورد اتوماسیون خانگی ، IOT و برنامه نویسی ESP8266 را می توانید در وبلاگ من پیدا کنید

توصیه شده: