Სარჩევი:

დააყენეთ ESP8266 ავტომატური განახლების სერვერი: 7 ნაბიჯი
დააყენეთ ESP8266 ავტომატური განახლების სერვერი: 7 ნაბიჯი

ვიდეო: დააყენეთ ESP8266 ავტომატური განახლების სერვერი: 7 ნაბიჯი

ვიდეო: დააყენეთ ESP8266 ავტომატური განახლების სერვერი: 7 ნაბიჯი
ვიდეო: ESP8266 + DHT22 + Blynk ტენიანობის და ტემპერატურის სენსრორი ქლაუდზე და ტელეფონში. ჩუქდება მულტიმეტრი 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. Arduino IDE
  2. ESP8266 ბირთვი
  3. ნებისმიერი ESP8266 dev დაფა 1 მ ან მეტი ფლეშ ოპერატიული მეხსიერებით
  4. ვებ სერვერი (თუნდაც თავმდაბალი ჟოლოს Pi გააკეთებს - ეს არის ის, რასაც მე ვიყენებ)
  5. (სურვილისამებრ) mkspiffs ინსტრუმენტი თუ გსურთ SPIFFS ფაილური სისტემის გამოსახულების ავტომატური განახლება

ნაბიჯი 2: შექმენით საცავი ორობითი ფირმების შესანახად

შექმენით საცავი ორობითი ფირმების შესანახად
შექმენით საცავი ორობითი ფირმების შესანახად

ჩემს სერვერზე მაქვს საქაღალდე სახელწოდებით/home/pi/trucFirmware, რომელიც ინახავს სხვადასხვა მოწყობილობის ფირმებს და SPIFFS სურათებს

მე ვინახავ ცალკეულ ბინარულს თითოეული ტექნიკის ტიპისთვის (ერთი წყაროს ფაილიდან რამდენიმე #განსაზღვრებით) და როდესაც ახალი გამოშვება მზად იქნება ვიყენებ Arduino IDE "ესკიზის/ექსპორტის შედგენილი ორობითი" მენიუს ბრძანებას თითოეული სამიზნე მოწყობილობისათვის. გაითვალისწინეთ, რომ თუნდაც მიუხედავად იმისა, რომ არსებობს 5 განსხვავებული ტექნიკის ტიპი, არსებობს მხოლოდ ორი ორობითი SPIFFS: 1M და 4M ვერსია - შექმნილია mkspiffs ინსტრუმენტთან ერთად - ვინაიდან ყველა მოწყობილობას აქვს 1M ან 4M flash.

ნაბიჯი 3: შექმენით ორობითი

Arduino IDE მენიუს ვარიანტის ესკიზის/ექსპორტის შედგენილი ორობითი სისტემის გამოყენებით, შექმენით firmware, რომელიც აიტვირთება მოწყობილობაზე, როდესაც ის ამას მოითხოვს განახლების სერვერიდან.

თუ გჭირდებათ 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: "გამარჯობა, მე ვუშვებ firmware ვერსიას a.b.c, გაქვთ თუ არა უფრო ახალი ვერსია?" სერვერი: "ნება მომეცით ვნახო … აჰ დიახ მე მაქვს a.b.d - აქ მოდის …"

თუ ახალი ვერსია არსებობს, სერვერი მას უბრალოდ აგზავნის როგორც ორობითი მონაცემების დატვირთვას http პასუხში. ESP8266httpUpdate კლასი ასრულებს ორობითი მეხსიერების კოპირების რთულ ნაწილს, იცვლის firmware ჩატვირთვის მისამართს ახალ კოდზე, ვიდრე (მოთხოვნის შემთხვევაში) მოწყობილობის გადატვირთვას ახალი კოდის გასაშვებად.

თუ მეორეს მხრივ არ არსებობს უფრო მაღალი ვერსია, ის პასუხობს http 304 შეცდომას, რომელიც ეფექტურად ამბობს: "მე არაფერი მაქვს შენთვის" და შენი კოდი განაგრძობს ჩვეულ რეჟიმში მუშაობას.

ნაბიჯი 5: დაამატეთ სერვერის ლოგიკა

ნაკადის პირველი კვანძი "უსმენს" http მოთხოვნას url- ზე https://192.168.1.4:1880/ განახლება მოწყობილობის ტიპთან ერთად. ის გადასცემს "კონსტრუქციის საძიებო გზის" ფუნქციის კვანძს, რომელსაც აქვს შემდეგი javascript კოდი:

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 == "ესკიზი") {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"; } მესიჯის დაბრუნება;

ეს უბრალოდ ადგენს შესაბამის გზას wildcard– ით sys ფუნქციისთვის, რომელიც შემდეგნაირად მუშაობს, რომელიც უბრალოდ მუშაობს

ls - r

შემდეგ გამომავალი იკვებება "შეადარეთ ვერსიები" ფუნქციის კვანძს:

var f = msg.payload.split ("\ n") [0]; msg.filename = f;

თუ (msg.mode == "ესკიზი") {

f = f. შეცვლა ("/home/pi/trucFirmware/truc_", ""); f = f. ჩანაცვლება (". ino."+msg.type+". bin", ""); } else {f = f.replace ("/home/pi/trucFirmware/spiffs_", ""); f = f. შეცვლა (/_ / dM \.bin/, ""); }

if (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 პორტი // /განახლება არის url, რომელიც ავირჩიე სერვერისთვის "მოსასმენად", რასაც მოყვება მოწყობილობის ტიპი … bool actualUpdate (bool sketch = false) {სიმებიანი შეტყობინება; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (ყალბი); 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 ("განახლება წარმატებულია");

ჭეშმარიტი დაბრუნება; } სხვა {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("განახლება ვერ მოხერხდა");

}}} დაბრუნება false; }

ნაბიჯი 7: დაბოლოს, დაიწყეთ განახლება

ჩატვირთვის დროს, ან შესაძლოა MQTT შეტყობინების საპასუხოდ (როგორც მე ვაკეთებ) გაუშვით შემდეგი კოდი:

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

// ან SPIFFS– ისთვის…

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

მოწყობილობა განახლდება და გადატვირთულია სერვერის უახლესი კოდი. ჩემთვის ბევრად უფრო ადვილია, ვიდრე 33 მოწყობილობის ხელით განახლება!

კიდევ ბევრი სასარგებლო ინფორმაცია სახლის ავტომატიზაციის, IOT და ESP8266 პროგრამირების შესახებ შეგიძლიათ იხილოთ ჩემს ბლოგზე

გირჩევთ: