সুচিপত্র:

একটি ESP8266 স্বয়ংক্রিয় আপডেট সার্ভার সেট আপ করুন: 7 টি ধাপ
একটি ESP8266 স্বয়ংক্রিয় আপডেট সার্ভার সেট আপ করুন: 7 টি ধাপ

ভিডিও: একটি ESP8266 স্বয়ংক্রিয় আপডেট সার্ভার সেট আপ করুন: 7 টি ধাপ

ভিডিও: একটি ESP8266 স্বয়ংক্রিয় আপডেট সার্ভার সেট আপ করুন: 7 টি ধাপ
ভিডিও: PCA9685 এবং আরডুইনো: ভি 3 ব্যবহার করে 32 সার্ভো মোটর নিয়ন্ত্রণ করছে 2024, নভেম্বর
Anonim
একটি ESP8266 স্বয়ংক্রিয় আপডেট সার্ভার সেট আপ করুন
একটি ESP8266 স্বয়ংক্রিয় আপডেট সার্ভার সেট আপ করুন

অনেক মানুষ এখন ESP8266 এর অনেক ছদ্মবেশে (ESP-01S, Wemos D1, NodeMCU, Sonoff ইত্যাদি) হোম অটোমেশন সিস্টেমের জন্য ব্যবহার করছে। যদি আপনি আপনার নিজের কোড লিখেন (যেমন আমি করি) এইগুলির প্রত্যেকটি আলাদাভাবে আপডেট করে এমনকি ওটিএ (বায়ুতে) এর মাধ্যমে কিছুটা ক্লান্তিকর হয়ে ওঠে।

আমার নিজের সিস্টেমে, উদাহরণস্বরূপ 8x ESP-01S, 6x Wemos D1, 4x Sonoff বেসিক 12x Sonoff S20, 2x Sonoff SV এবং একটি NodeMCU যা একটি সাধারণ কোড বেস শেয়ার করে, তাই 33 টি ডিভাইস আপডেট করার জন্য যখন আমি একটি সাধারণ কোড তৈরি করি পরিবর্তন.

কিন্তু একটি সহজ উপায় আছে: একটি "আপডেট সার্ভার"। চমৎকার Arduino IDE + ESP8266 কোরটিতে বেশিরভাগ কাজ করার জন্য একটি লাইব্রেরি রয়েছে (ESP8266httpUpdate), কিন্তু আপনার কাজটি করার জন্য আপনার নিজের সার্ভার কিভাবে সেট আপ করবেন তা জানতে হবে।

এই নির্দেশযোগ্য আপনাকে দেখায় কিভাবে একটি NODE-RED সার্ভার ব্যবহার করে, কিন্তু একই যুক্তি আপনার পছন্দের যে কোন সার্ভার প্রযুক্তির ক্ষেত্রে প্রযোজ্য। Apache + PHP ইত্যাদি

ধাপ 1: আপনার যা প্রয়োজন

  1. Arduino IDE
  2. ESP8266 কোর
  3. 1M বা তার বেশি ফ্ল্যাশ র‍্যাম সহ যেকোন ESP8266 dev বোর্ড
  4. একটি ওয়েব সার্ভার (এমনকি একটি নম্র রাস্পবেরি পাই করবে - এটি আমি ব্যবহার করি)
  5. (alচ্ছিক) mkspiffs টুল যদি আপনি একটি SPIFFS ফাইল সিস্টেম ইমেজ স্বয়ংক্রিয়ভাবে আপডেট করতে চান

ধাপ 2: বাইনারি ফার্মওয়্যার রাখার জন্য একটি সংগ্রহস্থল তৈরি করুন

বাইনারি ফার্মওয়্যার রাখার জন্য একটি সংগ্রহস্থল তৈরি করুন
বাইনারি ফার্মওয়্যার রাখার জন্য একটি সংগ্রহস্থল তৈরি করুন

আমার সার্ভারে, আমার/home/pi/trucFirmware নামে একটি ফোল্ডার আছে যা বিভিন্ন ডিভাইস ফার্মওয়্যার এবং SPIFFS ইমেজ ধারণ করে

আমি প্রতিটি হার্ডওয়্যার প্রকারের জন্য একটি পৃথক বাইনারি বজায় রাখি (কয়েকটি #সংজ্ঞা সহ একটি একক উৎস ফাইল থেকে) এবং যখন একটি নতুন রিলিজ প্রস্তুত হয় তখন আমি প্রতিটি টার্গেট ডিভাইসের জন্য Arduino IDE "স্কেচ/এক্সপোর্ট কম্পাইল্ড বাইনারি" মেনু কমান্ড ব্যবহার করি। যদিও 5 টি ভিন্ন ধরনের হার্ডওয়্যার আছে, সেখানে শুধুমাত্র দুটি SPIFFS বাইনারি আছে: 1M এবং 4M সংস্করণ - mkspiffs টুল দিয়ে নির্মিত - যেহেতু সব ডিভাইসে 1M বা 4M ফ্ল্যাশ আছে।

ধাপ 3: বাইনারি তৈরি করুন

Arduino IDE মেনু বিকল্প স্কেচ/রপ্তানি সংকলিত বাইনারি ব্যবহার করে, ফার্মওয়্যার তৈরি করুন যা ডিভাইসটিতে আপলোড করা হবে যখন এটি আপডেট সার্ভার থেকে অনুরোধ করবে।

যদি আপনার একটি 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

আমি তারপর সমস্ত সংকলিত বাইনারি এবং SPIFFS। বাইনারি ফাইলগুলিকে রিপোজিটরিতে অনুলিপি করি

ধাপ 4: সার্ভার ফ্লো তৈরি করুন

সার্ভার ফ্লো তৈরি করুন
সার্ভার ফ্লো তৈরি করুন

আমি NODE-RED ব্যবহার করছি, কিন্তু সহজ লজিক যে কোন সার্ভার প্রযুক্তি / ভাষাতে একই হবে।

একটি) একটি url সংজ্ঞায়িত করুন যা ESP8266httpUpdate অনুরোধের জন্য শুনবে। আমার রাস্পবেরি পিআই সেরিভার 192.168.1.4 এ রয়েছে এবং হার্ডওয়্যারের প্রকারের সাথে /আপডেটের জন্য 1880 পোর্টে শোনে। তাই যদি আমি একটি Wemos D1 মিনি জন্য একটি বাইনারি অনুরোধ করতে যাচ্ছি, url শেষ হয়:

192.168.1.4:1880/update/d1_mini

খ) নিম্নলিখিত যুক্তিটি পরিচালনা করার জন্য কোড তৈরি করুন:

ESP8266: "হাই, আমি ফার্মওয়্যার ভার্সন a.b.c চালাচ্ছি, আপনার কি নতুন সংস্করণ আছে?" সার্ভার: "আমাকে দেখতে দাও … আহ হ্যাঁ আমার কাছে a.b.d আছে - এখানে এসেছে …"

যদি একটি নতুন সংস্করণ বিদ্যমান থাকে তবে সার্ভারটি এটি http উত্তরে বাইনারি ডেটা লোড হিসাবে পাঠায়। ESP8266httpUpdate ক্লাসটি বাইনারি মেমরিতে অনুলিপি করার কঠিন অংশ, নতুন কোড চালানোর জন্য ডিভাইস রিবুট করার পরিবর্তে (যদি অনুরোধ করা হয়) নতুন কোডে ফার্মওয়্যার বুট ঠিকানা পরিবর্তন করে।

অন্যদিকে যদি কোন উচ্চতর সংস্করণ না থাকে, এটি একটি http 304 ত্রুটির সাথে উত্তর দেয় যা কার্যকরভাবে বলে: "আমার কাছে আপনার জন্য কিছুই নেই" এবং আপনার কোড স্বাভাবিক হিসাবে চলতে থাকে।

ধাপ 5: সার্ভার লজিক যুক্ত করুন

প্রবাহের প্রথম নোডটি https://192.168.1.4:1880/ আপডেট করার জন্য একটি 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 ফাংশনের জন্য ওয়াইল্ডকার্ড সহ যথাযথ পথ সেট করে যা অনুসরণ করে, যা কেবল চালায়

ls - আর

আউটপুট তারপর "তুলনা সংস্করণ" ফাংশন নোড খাওয়ানো হয়:

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/, ""); }

যদি (msg.version <f) {

node.warn ("আপগ্রেড প্রয়োজন");

node.warn ("ফিরে আসবে"+msg.filename); ফেরত বার্তা; } node.warn ("কোন আপগ্রেড নেই"); msg.statusCode = 304; msg.payload = ;

ফেরত বার্তা;

সুইচ নোড তখন নিশ্চিত করে যে 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; // এটি আমার রাস্পবেরি পাই সার্ভার, 1880 হল ডিফল্ট NODE-RED পোর্ট // /আপডেট হল ইউআরএল যা আমি সার্ভারের জন্য "শোনার" জন্য বেছে নিয়েছি, এর পরে ডিভাইসের ধরন … bool actualUpdate {স্ট্রিং বার্তা; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (মিথ্যা); যদি (স্কেচ) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** এই লাইনটি "ব্যবসা করে"} অন্য {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } যদি (ret! = HTTP_UPDATE_NO_UPDATES) {যদি (ret == HTTP_UPDATE_OK) {

Serial.printf ("আপডেট সফল");

সত্য ফিরে; } অন্য {যদি (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("আপগ্রেড ব্যর্থ");

}}} মিথ্যা প্রত্যাবর্তন; }

ধাপ 7: অবশেষে, আপডেট শুরু করুন

বুট করার সময়, অথবা সম্ভবত একটি MQTT বার্তার জবাবে (যেমন আমি করি) নিম্নলিখিত কোডটি চালান:

যদি (_actualUpdate (সত্য)) ESP.restart ();

// অথবা SPIFFS এর জন্য…

যদি (_actualUpdate (মিথ্যা)) ESP.restart ();

ডিভাইসটি নিজেই আপডেট হবে এবং সার্ভার থেকে লেটেস্ট কোড চালু করে রিবুট করবে। ম্যানুয়ালি 33 ডিভাইস আপডেট করার চেয়ে এটি আমার জন্য অনেক সহজ!

হোম অটোমেশন, IOT এবং ESP8266 প্রোগ্রামিং সম্পর্কে অনেক বেশি দরকারী তথ্য আমার ব্লগে পাওয়া যাবে

প্রস্তাবিত: