विषयसूची:

ESP8266 स्वचालित अद्यतन सर्वर सेट करें: 7 चरण
ESP8266 स्वचालित अद्यतन सर्वर सेट करें: 7 चरण

वीडियो: ESP8266 स्वचालित अद्यतन सर्वर सेट करें: 7 चरण

वीडियो: ESP8266 स्वचालित अद्यतन सर्वर सेट करें: 7 चरण
वीडियो: Send DHT11 Data to MySQL Server over internet Using NodeMCU with working Code 2024, जुलाई
Anonim
ESP8266 स्वचालित अद्यतन सर्वर सेट करें
ESP8266 स्वचालित अद्यतन सर्वर सेट करें

होम ऑटोमेशन सिस्टम के लिए कई लोग अब ESP8266 का उपयोग इसके कई रूपों (ESP-01S, Wemos D1, NodeMCU, Sonoff आदि) में कर रहे हैं। यदि आप अपना खुद का कोड लिखते हैं (जैसा कि मैं करता हूं) इनमें से प्रत्येक को ओटीए (ओवर द एयर) के माध्यम से भी अलग से अपडेट करना थोड़ा थकाऊ हो जाता है।

उदाहरण के लिए, मेरे अपने सिस्टम में 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV और एक NodeMCU है जो एक सामान्य कोड आधार साझा करता है, इसलिए जब मैं एक साधारण कोड बनाता हूं तो सभी में 33 डिवाइस अपडेट होते हैं। परिवर्तन।

लेकिन एक आसान तरीका है: एक "अपडेट सर्वर"। उत्कृष्ट Arduino IDE + ESP8266 कोर में अधिकांश काम करने के लिए एक पुस्तकालय है (ESP8266httpUpdate), लेकिन आपको यह जानने की जरूरत है कि इसे काम करने के लिए अपना खुद का सर्वर कैसे सेट करें।

यह निर्देशयोग्य आपको दिखाता है कि NODE-RED सर्वर का उपयोग कैसे किया जाता है, लेकिन यही तर्क आपकी पसंद की किसी भी सर्वर तकनीक पर लागू होता है। अपाचे + पीएचपी आदि

चरण 1: आपको क्या चाहिए

  1. अरुडिनो आईडीई
  2. ईएसपी8266 कोर
  3. 1M या अधिक फ्लैश RAM वाला कोई भी ESP8266 देव बोर्ड
  4. एक वेब सर्वर (यहां तक कि एक विनम्र रास्पबेरी पाई भी करेगा - यह वही है जो मैं उपयोग करता हूं)
  5. (वैकल्पिक) mkspiffs उपकरण यदि आप SPIFFS फ़ाइल सिस्टम छवि को स्वतः अद्यतन करना चाहते हैं

चरण 2: बाइनरी फ़र्मवेयर को होल्ड करने के लिए एक रिपॉजिटरी बनाएँ

बाइनरी फ़र्मवेयर रखने के लिए एक रिपॉजिटरी बनाएँ
बाइनरी फ़र्मवेयर रखने के लिए एक रिपॉजिटरी बनाएँ

मेरे सर्वर पर, मेरे पास /home/pi/trucFirmware नामक एक फ़ोल्डर है जिसमें विभिन्न डिवाइस फ़र्मवेयर और SPIFFS चित्र हैं

मैं प्रत्येक हार्डवेयर प्रकार (कुछ #defines के साथ एक एकल स्रोत फ़ाइल से) के लिए एक अलग बाइनरी बनाए रखता हूं और जब एक नई रिलीज तैयार होती है तो मैं प्रत्येक लक्ष्य डिवाइस के लिए Arduino IDE "स्केच/निर्यात संकलित बाइनरी" मेनू कमांड का उपयोग करता हूं। ध्यान दें कि यहां तक कि हालांकि 5 अलग-अलग हार्डवेयर प्रकार हैं, केवल दो SPIFFS बायनेरिज़ हैं: एक 1M और एक 4M संस्करण - जिसे mkspiffs टूल के साथ बनाया गया है - क्योंकि सभी उपकरणों में या तो 1M या 4M फ्लैश होता है।

चरण 3: बायनेरिज़ बनाएँ

Arduino IDE मेनू विकल्प स्केच/निर्यात संकलित बाइनरी का उपयोग करके, फर्मवेयर बनाएं जो डिवाइस पर अपलोड किया जाएगा जब यह अपडेट सर्वर से अनुरोध करेगा।

यदि आपको 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.binary फ़ाइलों को रिपॉजिटरी में कॉपी करता हूँ

चरण 4: सर्वर फ़्लो बनाएँ

सर्वर फ्लो बनाएं
सर्वर फ्लो बनाएं

मैं नोड-रेड का उपयोग कर रहा हूं, लेकिन किसी भी सर्वर तकनीक/भाषा पर सरल तर्क समान होगा।

a) एक url परिभाषित करें जो ESP8266httpUpdate अनुरोध को सुनेगा। मेरा रास्पबेरीपी सेरेव 192.168.1.4 पर है और हार्डवेयर प्रकार के साथ/अपडेट के लिए पोर्ट 1880 पर सुनता है। तो अगर मैं Wemos D1 Mini के लिए बाइनरी का अनुरोध करने जा रहा हूं, तो यूआरएल इस प्रकार समाप्त होता है:

192.168.1.4:1880/update/d1_mini

बी) निम्नलिखित तर्क को संभालने के लिए कोड बनाएं:

ESP8266: "हाय, मैं फर्मवेयर संस्करण a.b.c चला रहा हूं, क्या आपके पास एक नया संस्करण है?" सर्वर: "मुझे देखने दो … आह हाँ मेरे पास a.b.d है - यहाँ यह आता है …"

यदि कोई नया संस्करण मौजूद है तो सर्वर इसे http उत्तर में बाइनरी डेटा के भार के रूप में भेजता है। ESP8266httpUpdate वर्ग नए कोड को चलाने के लिए डिवाइस को रिबूट करने की तुलना में (यदि अनुरोध किया गया है) फर्मवेयर बूट पते को नए कोड में बदलकर मेमोरी में बाइनरी को कॉपी करने का मुश्किल हिस्सा करता है।

यदि दूसरी ओर कोई उच्च संस्करण नहीं है, तो यह एक http 304 त्रुटि के साथ उत्तर देता है जो प्रभावी रूप से कहती है: "मेरे पास आपके लिए कुछ भी नहीं है" और आपका कोड सामान्य रूप से चलता रहता है।

चरण 5: सर्वर तर्क जोड़ें

प्रवाह में पहला नोड url https://192.168.1.4:1880/update के साथ संलग्न डिवाइस प्रकार के साथ http अनुरोध के लिए "सुनता है"। यह इसे "खोज पथ का निर्माण" फ़ंक्शन नोड में भेजता है जिसमें निम्नलिखित जावास्क्रिप्ट कोड है:

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"; } और {var sz=h['x-esp8266-chip-size']; msg.payload="/home/pi/trucFirmware/spiffs_*_"+(sz/1048576)+"M.bin"; } वापसी संदेश;

यह sys फ़ंक्शन के लिए वाइल्डकार्ड के साथ उपयुक्त पथ सेट करता है, जो कि बस चलता है

एलएस - आर

आउटपुट को तब "संस्करणों की तुलना करें" फ़ंक्शन नोड में फीड किया जाता है:

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", ""); } और {f=f.replace("/home/pi/trucFirmware/spiffs_", ""); f=f.replace(/_\dM\.bin/, ""); }

अगर (संदेश संस्करण <एफ) {

node.warn ("अपग्रेड आवश्यक");

node.warn ("वापस आएगा" + msg.filename); वापसी संदेश; } node.warn ("कोई अपग्रेड नहीं"); msg.statusCode=304; संदेश पेलोड = ;

वापसी संदेश;

स्विच नोड तब सुनिश्चित करता है कि या तो 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 डिफ़ॉल्ट नोड-रेड पोर्ट है // / अपडेट वह यूआरएल है जिसे मैंने सर्वर के लिए "सुनने" के लिए चुना है, इसके बाद डिवाइस प्रकार … बूल वास्तविक अपडेट (बूल स्केच = झूठा) {स्ट्रिंग संदेश; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(false); अगर (स्केच) { ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** यह वह पंक्ति है जो "व्यवसाय करता है" } अन्य { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } अगर (रिट! = HTTP_UPDATE_NO_UPDATES) { अगर (रिट == HTTP_UPDATE_OK) {

Serial.printf ("अपडेट सफल हुआ");

सच लौटना; } और { अगर (रिट ==

Serial.printf ("अपग्रेड विफल");

} } } विवरण झूठा है; }

चरण 7: अंत में, अद्यतन आरंभ करें

बूट समय पर, या शायद एक एमक्यूटीटी संदेश के जवाब में (जैसा कि मैं करता हूं) निम्न कोड चलाएं:

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

// या SPIFFS के लिए…

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

डिवाइस अपने आप अपडेट हो जाएगा और सर्वर से नवीनतम कोड चलाकर रीबूट हो जाएगा। 33 उपकरणों को मैन्युअल रूप से अपडेट करने की तुलना में यह मेरे लिए बहुत आसान है!

होम ऑटोमेशन, IOT और ESP8266 प्रोग्रामिंग के बारे में बहुत अधिक उपयोगी जानकारी My Blog. पर मिल सकती है

सिफारिश की: