تقریبا میتوان که همه ما با گوشی های هوشمند از جمله سامسونگ و اپل و … کار کردهایم اگر دقت کنید گاهی از اوقات شرکت سازنده یک Notification با مضمون Software Update را برای ارسال کرده است که اگر روی آن کلیک کنید شما را به بخش تنظیمات هدایت میکند و در نهایت از شما جهت آپدیت دستگاه اجازه میخواهد که اگر این اجازه داده شود سیستم به طور خودکار ورژن جدید اندروید را برای گوشیهای سامسونگ و ورژن جدید IOS را برای گوشیهای اپل و بقیه سیستمعامل ها را برای گوشی خاص خود آن سیستم عامل، نصب میکند. حال سوالاتی که ممکن است برای علاقهمندان در این حوزه پیش بیاید به احتمال قریب به یقین شامل موارد زیر هستند.
- OTA چیست؟
- پروتکل ارتباطی چیست؟
- آیا بودن اینترنت ضروری است؟
- آیا میتوان از این تکنولوژی در سیستمهای الکترونیک خود استفاده کنیم؟ اگر میتوان به چه صورتی باید این کار را انجام دهیم؟
.
.
.
در این مقاله میخواهیم به این سوالات پاسخ دهیم و در نهایت یک مثال کاملا عملی بعنوان یکی از پروژه های آردوینو NodeMcu برای درک بهتر مبحث پیاده سازی کنیم.
OTA چیست؟
OTA مخفف Over-The-Air است.
تمام عمليات بي سيمي که در شبکه بدون استفاده از کابل انجام شود را OTA میگويند. اگر اين امکان براي بروز رساني نرم افزار پايه اي گوشي استفاده شود ، (FOTA (Firmware Over-The-Air نيز خوانده مي شود.
در اینجا پاسخ افراد به دو دسته تقسیم میشود.
دسته اول: امکان ندارد چون محصولات دست مشتری است.
دسته دوم: این کار امکانپذیر است راهحلی که بیان میکنند استفاده از OTA است که به راحتی میتوانند این کار را انجام دهند.
خب تا اینجا تقریبا میتوان گفت که با مفهوم کلی OTA آشنا شدیم.
پروتکل ارتباطی چیست؟
پروتکلی که در این سری از ارتباطات استفاده میشود پروتکل سریال است که به صورت یک پکتهای دیتایی که تعیین میکنیم و در نهایت توسط IP موردنظر دیتا را ارسال میکنیم و در صورتی که دیتا موردنظر به درستی ارسال شود و هیچ مشکلی در روند ارسال وجود نداشته باشد سیستم نیز به شما اصطلاحا ACK ارسال میکند به این معنی که دیتا به درستی تحویل داده شده است.
آیا بودن اینترنت ضروری است؟
بله در حال حاضر این تکنولوژی با وجود اینترنت کار میکند البته اگر هدف پوشش سراسری باشد اما اگر هدف پیاده سازی سیستم در یک مجموعه خاص باشد میتوان از حالت شبکه محلی هم استفاده کرد و همینطور که گفتیم در این حالت شما محدودیت دارید که البته بسته به نوع پروژه باید شبکه محلی یا سراسری آن را مشخص کرد.
آیا میتوان از این تکنولوژی در سیستمهای الکترونیکی خود استفاده کنیم؟ اگر میتوان به چه صورتی باید این کار را انجام دهیم؟
بله این کار کاملا شدنی است و میخواهیم در ادامه به راهاندازی این سیستم با NodeMcu بپردازیم.
راهاندازی OTA با NodeMcue
خب پس از اینکه یک آشنایی نسبی با این تکنولوژی پیدا کردیم نیاز است که برای درک بهتر آن را راهاندازی کنیم. برای راهاندازی این سیستم نیاز است که ابتدا مراحل زیر را انجام دهیم.
تهیه NodeMcu
نصب کتابخانه NodeMcu
برنامه نویسی NodeMcu در محیط آردوینو
نصب کتابخانه NodeMcu
برای نصب کتابخانه NodeMcu ابتدا عبارت ” nodemcu arduino library ” را سرچ میکنیم و اولین لینکی که وجود دارد را باز میکنیم که مربوط به سایت Github میباشد.
سپس وارد سایت میشویم دقت کنید که از این صفحه چیزی را که نیاز داریم شامل آدرس زیر است که این آدرس را باید کپی کنیم و در نهایت وارد محیط IDE خود شویم و طبق تصاویر زیر عمل میکنیم.
1 | https://arduino.esp8266.com/stable/package_esp8266com_index.json |
حال باید به صورت شکل زیر عمل کنیم.
خب حالا نوبت به چک کردن این موضوع رسیده است که آیا کتابخانه هایی که مدنظر ما بوده است نصب شدهاند یا خیر؟
بله همانطوری که مشاهد کردید کتابخانههایی که مدنظر ما بوده است نصب شده اند.
خب حالا نوبت به بخش برنامهنویسی ماژول رسیده است.
برنامه نویسی NodeMcu در محیط آردوینو
برای این کار ابتدا باید به شکل زیر عمل کنیم.
پس از اینکه طبق تصاویر بالا کارهایی که گفته شد را انجام دادید نوبت به آپلود کد زیر میرسد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> // Replace with your network credentials const char* ssid = "YOUR_SSID"; اسم وای فای خود را بنویسید const char* password = "YOUR_PASSWORD"; پسورد وای فای خود را وارد کنید. تا سیستم بتواند به IP محلی متصل شود void setup() { Serial.begin(115200); Serial.println("Booting"); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); } // Port defaults to 8266 // ArduinoOTA.setPort(8266); // Hostname defaults to esp8266-[ChipID] // ArduinoOTA.setHostname("myesp8266"); // No authentication by default // ArduinoOTA.setPassword((const char *)"123"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { ArduinoOTA.handle(); } |
اما نکتهای که است به احتمال زیاد در هنگام آپلود کد روی NodeMcu با خطایی تحت عنوان اینکه کتابخانه ها تعریف نشدهاند برخورد کنید که هیچ جای نگرانی نیست و به راحتی با استفاده از روندی که کتابخانه OTA را نصب کردیم برای بقیه کتابخانهها هم همین روند را انجام دهید به طور مثال اگر کتابخانه esp8266 را روی سیستم خود نصب نکرده بودید فقط کافی است که اسم آن را در قسمتی که نام OTA را سرچ کردیم قرار دهیم تا و در نهایت کتابخانه موردنظر را نصب کنیم. و همین روند را برای بقیه کتابخانهها میتوانید پیش بگیرید.
خب پس از اینکه موفق شدید برنامه را درون NodeMcu موردنظر آپلود کنید باید در سریال مانیتور خود یک IP محلی مشاهد کنید مطابق تصویری که در ادامه قرار میدهیم.
اگر به این مرحله رسیدیم یعنی اینکه تا الان ما یک IP محلی را برای دستگاه خود اختصاص دادیم و از این به بعد برای اینکه بتوانیم با این دیوایس صحبت کنیم نیاز است که فقط با این IP اتصال برقرار کنیم تا این قسمت کار ما تمام شده است.
حال میخواهیم برنامه چشمک زن را روی دیوایس مربوطه آپلود کنیم البته بدون سیم و در نهایت ببینیم که آیا دیوایس موردنظر کار میکند یا خیر؟ نظر شما چیست؟
برای این کار ابتدا NodeMcu خود را به یک پاور مجزای دیگر متصل میکنیم و در نهایت کد چشمک زن زیر را در IDE آردوینو مینویسیم و سپس برای آپلود کد به صورت تصویر زیر عمل میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> // Replace with your network credentials const char* ssid = "YOUR_SSID"; وارد کردن اسم وای فای const char* password = "YOUR_PASSWORD"; وارد کردن رمز عبور const int ESP_BUILTIN_LED = 2; void setup() { Serial.begin(115200); Serial.println("Booting"); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); } // Port defaults to 8266 // ArduinoOTA.setPort(8266); // Hostname defaults to esp8266-[ChipID] // ArduinoOTA.setHostname("myesp8266"); // No authentication by default // ArduinoOTA.setPassword((const char *)"123"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); pinMode(ESP_BUILTIN_LED, OUTPUT); } void loop() { ArduinoOTA.handle(); digitalWrite(ESP_BUILTIN_LED, LOW); delay(1000); digitalWrite(ESP_BUILTIN_LED, HIGH); delay(1000); } |
برای آپلود کردن کد هم باید به صورت زیر عمل کنیم.
دقت کنید که حتما آیپی موردنظر باید حتما و حتما یکی باشند در صورتیکه یکی نباشند این عمل به درستی صورت نخواهد گرفت و در نهایت برنامه آپلود نخواهد شد.
اگر مراحلی را که گفتیم به درستی اجام داده باشید الان برد NodeMcu شما باید چراغ تست آن به صورت چشمک زن عمل کند.
خب خسته نباشید شما موفق شدید که به راحتی اولین پروژه OTA خود را انجام دهید فقط این نکته را هم بگوییم که با کمی خلاقیت در پروژههای بسیار زیادی میتوانید از این تکنولوژی استفاده کنید یا به عبارت دیگر پروژهها همگی دارند سمت و سوی OTA محور میگیرند که توصیه میکنیم این مبحث را به طور جدی دنبال و سعی کنید که آن را در پروژههای خود حتی چشمک زدن یک LED ساده به کار گیرید.
امیدوارم که این آموزش هم برای شما مخاطبین سیسوگی مفید واقع شده باشد.
سلام ایا این برنامه میتواند دوربین و صدا را کنترل کند
لطفا سریع پاسخ دهید ممنون
سلام خب ما الان دستگاه رو ip داشتیم حالا اگه تو فضای محصول انبوه و فرش چی میشه ؟
ممنون از مطلب خوبتون…
جناب Zeus کتابخانه ای برای stm32 در این رابطه موجود نیست؟
لطفا اگر امکان داره منبعی برای آموزش ota در میکروهای arm معرفی کنید.
سلام
والا برای آپدیت از راه دور کتایبخانه دیدم ولی پولی بودن
خودم حدود ۷ سال پیش پیاده سازی کردم این مورد رو باید تایم بذارم و منتشر کنم فقط
مساله واقعا زمانه
سلام ، تشکر از اموزش خوبتان
من همه مراحل را اجرا کردم و برنامه به خوبی روی ESP32 ریخته میشود ولی مشکلی که هست اسم میکرو توی منوی PORT نمیاید و توی منوی SERIAL PORT فقط COM5 رو میتونم ببینم
مشکل از کجاست ؟
سلام آیا nodemcu در کدویژن کتابخانه دارد؟ آیا می شود OTA رو در سیستم های مبتنی بر AVR پیاده کرد و اینکه من با کدویژن کار میکنم آیا سوئیچ کنم روی آردینو ؟
سوالتون گنگه !
اگر منظورتون اینه که برای esp میشه با کدویژن برنامه نوشت – باید بگم خیر نمیشه
اگر میخواید بدونید که میتونید با avr بوت لودری بنویسید که با استفاده از nodemcu بتونید ای وی آر رو آپدیت کنید بله میشه
سلام من یه دستگاه دیجیتال دارم که از ota پشتیبانی میکنه . آیا میشه با لپتاپ از طریق ota به روزرسانیش کنم ؟
بروزرسانی
ممنون از مقاله خوبتان . مثال جهت رفع مشکل : آپدیت سیستمی miui 12 برای من آمد ولی توسط دیتا همراه آپلود نشد . سپس توسط هات اسپات گوشی دیگر آپلود کردم و انجام شد . اما : در بخش آپلود پک بصورت کامل آپلود نشده بود و برنامه های جدید اینترفیس یا نرم افزاری کمپانی را رد کرده بود . موفقیت آمیز نبود . دلیل چه میتواند باشد .؟
با سلام.
آموزش جالبی بود.!
فقط ی چیزی که میمونه اینه که ما میخواهیم این پروتکل رو توی ی محصولی بزاریم.
حالا ی سوال:
این محصول ما توی سراسر ایران پخش شده.
حالا ما چجوری همه اینارو بدون نیاز به اینکه به ی وایفای وصل باشم(ینی وسیله ای که ما میخواهیم با اون محصول رو آپدیت کنیم و خود محصول به ی اینترنت محلی وصل باشد) آپدیت کنیم؟
مثلا میتونید از گوشی و نرم افزار اندریدی استفاده کنید – حالا سناریو های مختلفی میشه تعریف کرد – مثلا وقتی نرم افزار آپدیتر رو باز میکنید گوشی رو هات اسپات کنه با یه اسم خاص و دستگاها همیشه سعی کنند به اون اسم کانکت بشن اگه بود و آپدیت بشن
و یا هر سناریوی دیگری
با سلام ممنون بابت آموزش خوبتان
یک سوال تخصص داشتم من تطبیق مراحل پیش رفت: ip اختصاص یافته هم دقیقا همانی است که روی پورت سریال نمایش داده شده
برای آپلود برنامه جدید به صورت ota پسورد هم در ابتدای اپلود پرسیده می شود اتفاقا و سپس مرحله اپلود شروع می شود اما هنگام استارت ابتدا. PROGRESS:0% توی سریال مانیتور روی پورت خود ESP نمایش می دهد ولی چند ثانیه ERROR]2[: CONNECT FAILED
ERROR[4]:END FAILED ظاهر می گردد و مجددا از من پسورد می خواهد در نهایت برنامه اپلود. نمی گردد
دو تا حالت کلی وجود داره اول این که نوع ماژول esp درست انتخاب نشده باشه و دوم استیبل نبودن لینک wifi یا ضعیف بودن اون لینکه
البته همیشه قبل از هر اقدامی از صحت تغزبه مدار مطمپن بشید.
نه تمام این مواردی که فرمودید اوکی اوکی بود ولی تستی که کردم مجددا با رزبین بدون مشکل موفق شدم اپلود کنم ولی با pc خیر
سلام خوب اگر با رزبین موفق شدید یعنی هم برنامه و هم سخت افزار داره به درستی کار میکنه و مشکل برمیگرده به یه چیزی تو ویندوز
فایروالی چیزی !
بله (حالا مهندس بازنشسته هستم ولی دیگه…) 🙂
دقیق مطابق عکس های آموزش بالا کتابخانه ها و برد رو تنظیم کردم. فقط چیزی که هست ممکنه برد بنده با برد استفاده شما متفاوت باشه! (حالا این قسمت اخر رو بذارید رو بازنشستگی بنده)
سلام – نفرمایید الکترونیک که بازنشستگی نداره 🙂
من خودم نرم افزار آردوینو رو روی سیستم ندارم که چک کنم اما مشکل رو جستجو کردم به فروم آردوینو رسیدم و راه حلی که برای حلش داده بودند
fatal error: ESP8266WiFi.h
البته اجازه بدید خودم هم ادیتور آردوینو رو نصب میکنم و چک میکنم ببینم مشکل حل میشه یا نه
ممنون از صبوری شما
درود بر شما
سپاس از وقتی که برای جواب بنده گذاشتید.
با سلام و عرض ادب
آیا امکان اجرای این پروژه با برد آردوینو WeMos D1 WiFi هست؟
با سپاس
بله امکانش هست 🙂
چندین مرتبه کتابخانه رو به روز کردم ولی همچنان پیغام ESP8266WiFi.h: No such file or directory باقی مونده! :-/
خوب دارید با ادیتور آردوینو کار میکنید دیگه
از کدوم ورژن sdk استفاده میکنید ؟