สารบัญ:

ตั้งค่าเซิร์ฟเวอร์อัปเดตอัตโนมัติ ESP8266: 7 ขั้นตอน
ตั้งค่าเซิร์ฟเวอร์อัปเดตอัตโนมัติ ESP8266: 7 ขั้นตอน

วีดีโอ: ตั้งค่าเซิร์ฟเวอร์อัปเดตอัตโนมัติ ESP8266: 7 ขั้นตอน

วีดีโอ: ตั้งค่าเซิร์ฟเวอร์อัปเดตอัตโนมัติ ESP8266: 7 ขั้นตอน
วีดีโอ: วิธีแก้ปัญหา Arduino ไม่เจอคอมพอร์ต COM Port ลงโปรแกรมไม่ได้ ใช้กับ ESP8266 ESP32 ได้ Arduino IDE 2 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 ใดๆ ที่มีแฟลชแรม 1M ขึ้นไป
  4. เว็บเซิร์ฟเวอร์ (แม้แต่ราสเบอร์รี่ Pi ที่อ่อนน้อมถ่อมตนก็ทำได้ - เป็นสิ่งที่ฉันใช้)
  5. (ทางเลือก) เครื่องมือ mkspiffs หากคุณต้องการอัปเดตอิมเมจระบบไฟล์ SPIFFS โดยอัตโนมัติ

ขั้นตอนที่ 2: สร้างพื้นที่เก็บข้อมูลเพื่อเก็บเฟิร์มแวร์ไบนารี

สร้างพื้นที่เก็บข้อมูลเพื่อเก็บเฟิร์มแวร์ไบนารี
สร้างพื้นที่เก็บข้อมูลเพื่อเก็บเฟิร์มแวร์ไบนารี

บนเซิร์ฟเวอร์ของฉัน ฉันมีโฟลเดอร์ชื่อ /home/pi/trucFirmware ซึ่งเก็บเฟิร์มแวร์ของอุปกรณ์ต่างๆ และอิมเมจ SPIFFS

ฉันรักษาไบนารีแยกต่างหากสำหรับฮาร์ดแวร์แต่ละประเภท (จากไฟล์ต้นฉบับไฟล์เดียวที่มี #defines สองสามตัว) และเมื่อรุ่นใหม่พร้อม ฉันใช้คำสั่งเมนู "sketch/Export compiled Binary" ของ 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.binary ไปยังที่เก็บ

ขั้นตอนที่ 4: สร้างกระแสเซิร์ฟเวอร์

สร้างกระแสเซิร์ฟเวอร์
สร้างกระแสเซิร์ฟเวอร์

ฉันใช้ NODE-RED แต่ตรรกะง่ายๆ จะเหมือนกันในทุกเทคโนโลยี/ภาษาของเซิร์ฟเวอร์

ก) กำหนด URL ที่จะรับฟังคำขอ ESP8266httpUpdate raspberryPi serevr ของฉันอยู่ที่ 192.168.1.4 และฟังบนพอร์ต 1880 สำหรับ /update โดยต่อท้ายประเภทฮาร์ดแวร์ ดังนั้นหากฉันจะขอไบนารีสำหรับ Wemos D1 Mini URL จะกลายเป็น:

192.168.1.4:1880/update/d1_mini

b) สร้างรหัสเพื่อจัดการกับตรรกะต่อไปนี้:

ESP8266: "สวัสดี ฉันกำลังใช้เฟิร์มแวร์เวอร์ชัน a.b.c คุณมีเวอร์ชันที่ใหม่กว่าหรือไม่" เซิร์ฟเวอร์: "ขอดูหน่อย…อ่า ใช่ ฉันมี a.b.d - มาแล้ว…"

หากมีเวอร์ชันที่ใหม่กว่าเซิร์ฟเวอร์เพียงแค่ส่งเป็นโหลดของข้อมูลไบนารีในการตอบกลับ http คลาส ESP8266httpUpdate ทำส่วนที่ยุ่งยากในการคัดลอกไบนารีลงในหน่วยความจำ โดยเปลี่ยนที่อยู่สำหรับบูตเฟิร์มแวร์เป็นโค้ดใหม่ (หากได้รับการร้องขอ) การรีบูตอุปกรณ์เพื่อเรียกใช้โค้ดใหม่

หากไม่มีเวอร์ชันที่สูงกว่า ระบบจะตอบกลับด้วยข้อผิดพลาด http 304 ซึ่งระบุว่า "ฉันไม่มีอะไรจะให้คุณ" และโค้ดของคุณยังคงทำงานตามปกติ

ขั้นตอนที่ 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"; } อื่น ๆ { var sz=h['x-esp8266-chip-size']; msg.payload="/home/pi/trucFirmware/spiffs_*_"+(sz/1048576)+"M.bin"; } ส่งคืน msg;

นี่เป็นเพียงการตั้งค่าพาธที่เหมาะสมด้วยไวด์การ์ดสำหรับฟังก์ชัน sys ที่ตามมา ซึ่งเพียงแค่รัน

ls - r

ผลลัพธ์จะถูกป้อนไปยังโหนดฟังก์ชัน "เปรียบเทียบเวอร์ชัน":

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

if(msg.mode=="sketch"){

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

if(msg.version < f){

node.warn("จำเป็นต้องอัพเกรด");

node.warn("จะส่งคืน "+msg.filename); กลับผงชูรส; } node.warn("ไม่มีการอัปเกรด"); msg.statusCode=304; msg.payload=;

กลับผงชูรส;

จากนั้นโหนดสวิตช์จะตรวจสอบให้แน่ใจว่าข้อความ "ไม่จำเป็นต้องอัปเดต" 304 ถูกส่งหรือไบนารีใหม่จริงจะถูกส่งคืนและส่งกลับไปยังอุปกรณ์

ขั้นตอนที่ 6: เพิ่มโค้ดใน Sketch เพื่อขออัปเดต

สเก็ตช์ต้องมีโค้ดต่อไปนี้เพื่อให้อัปเดตโดยอัตโนมัติในครั้งต่อไปที่คุณเพิ่มหมายเลขเวอร์ชัน:

#รวม

#กำหนด TRUC_VERSION "0_4_99"

#define 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; // นี่คือเซิร์ฟเวอร์ Raspberry Pi ของฉัน 1880 เป็นพอร์ต NODE-RED เริ่มต้น // /update คือ url ที่ฉันเลือกให้เซิร์ฟเวอร์ "ฟัง" ตามด้วยประเภทอุปกรณ์ … bool actualUpdate(bool sketch=false) { ข้อความข้อความสตริง; t_httpUpdate_return ย้อนกลับ; ESPhttpUpdate.rebootOnUpdate (เท็จ); ถ้า(ร่าง){ 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("การอัพเกรดล้มเหลว");

} } } คืนค่าเท็จ }

ขั้นตอนที่ 7: สุดท้าย เริ่มการอัปเดต

เมื่อบูตหรืออาจตอบสนองต่อข้อความ MQTT (เหมือนที่ฉันทำ) ให้เรียกใช้รหัสต่อไปนี้:

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

// หรือสำหรับ SPIFFS…

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

อุปกรณ์จะอัปเดตตัวเองและรีบูตโดยใช้รหัสล่าสุดจากเซิร์ฟเวอร์ สำหรับฉันมันง่ายกว่าการอัปเดตอุปกรณ์ 33 เครื่องด้วยตนเองมาก!

ข้อมูลที่เป็นประโยชน์อีกมากมายเกี่ยวกับ Home Automation, IOT และการเขียนโปรแกรม ESP8266 สามารถพบได้ใน My Blog

แนะนำ: