ESP8266 โหนดเครือข่ายรูทตาข่าย


11

ฉันกำลังทำงานบนเครือข่ายตาข่ายเป็นไปตาม ESP8266 และมันทั้งหมดดูเหมือนว่าจะทำงานได้ดีโดยใช้โค้ดตัวอย่างจากEasyMesh โดย Coopdis ในตัวอย่างของเขา / เธอ 3 ESP8266 ลงทะเบียนในตาข่ายและให้บริการเว็บอินเตอร์เฟสที่เรียบง่าย มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันเช่นกัน

ในโซลูชันของฉันฉันต้องการหนึ่งในโหนดเหล่านี้เพื่อเชื่อมต่อกับอินเทอร์เน็ตเพื่อให้ทั้ง Mesh สามารถเข้าถึงได้ (หรืออย่างน้อยก็สามารถเข้าถึง mesh ได้) นอกจากนี้ยังเป็นที่กล่าวถึงในESP8266 ตาข่ายผู้ใช้ Guidเอกสาร (หน้า 4) จากEspressif ฉันยังพบเอกสารอีกสองสามฉบับที่พวกเขาเผยแพร่ทั้งหมดพูดถึงเรื่องนี้เนื่องจากเป็นเรื่องปกติ แต่ไม่มีรหัสตัวอย่างที่ฉันสามารถเข้าใจได้อย่างง่ายดาย

ฉันจะกำหนดค่าเครือข่ายเพื่อเชื่อมต่อกับเราเตอร์ได้อย่างไร มันง่ายเหมือนการใช้ SSID และรหัสผ่านเดียวกันสำหรับเครือข่ายตาข่ายที่ฉันใช้กับเราเตอร์ Wi-Fi หรือฉันต้องทำบางอย่างเช่น Raspberry Pi ส่วนหนึ่งของ Wi-Fi mesh ซึ่งสามารถเชื่อมต่อได้ ถึงเราเตอร์ของฉันผ่านการเชื่อมต่อ Ethernet ฉันไม่คิดว่าสิ่งหลังนี้ควรได้รับจากการวิจัยที่ฉันทำ

ฉันต้องการโค้ดตัวอย่าง Hello world สำหรับสิ่งนี้ ฉันคิดว่าคำสั่ง ATไม่ช่วยฉัน


1
เกี่ยวกับตัวอย่าง 3 โหนดคุณมีและใช้งานอินเทอร์เฟซบนเว็บเช่นกันบนโทรศัพท์ในวิดีโอนี้หรือไม่
Bence Kaulics

1
@BentKaulics ฉันไม่ได้ทดสอบโดยเฉพาะตั้งแต่ฉันทำมาก่อนและนี่ไม่ใช่ปัญหาสำหรับฉัน คุณถามทำไม? ฉันคิดว่านี่อาจเป็นตัวเลือกทางเลือกที่ "เซิร์ฟเวอร์" สามารถเข้าถึงเครือข่ายตาข่ายผ่านการเรียก REST ที่โฮสต์บนตาข่าย แต่ฉันรู้สึกทึ่งกับตัวเลือก ROOT NODE ซึ่งดูเหมือนสถาปัตยกรรมที่ถูกต้อง (IMHO)
Gineer

1
ฉันเห็น. ฉันคิดเช่นเดียวกันว่าอาจเป็นตัวเลือกอื่นในการเข้าถึงเครือข่ายของคุณ ไม่ได้แนะนำว่าเป็นวิธีแก้ปัญหา แต่เพียงแค่แสดงความคิดเห็นว่ามันคืออะไร ฉันไม่ได้รู้ว่าคุณได้คิดไปแล้ว ;)
Bence Kaulics

คำตอบ:


6

อีกทางเลือกที่ง่ายต่อการใช้งานตาข่ายคือการใช้ painlessMesh โดย BlackEdder และแนะนำสะพานสำหรับการส่งข้อมูลไปยังโลกภายนอก

มีปัญหาในการเชื่อมต่อกับเครือข่ายอื่นจากเครือข่ายใน painlessMesh gitlab ที่อธิบายวิธีแก้ไขปัญหาที่แตกต่างกันสี่แบบ วิธีแก้ปัญหาอาจใช้งานได้ใน easyMesh ด้วยเช่นกันเพราะปัญหานั้นเกิดขึ้นในตอนแรก แต่สำหรับ painlessMesh นั้นแน่นอน

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

คนแรกจะแนะนำ esp8266 ที่สี่สำหรับโครงการของคุณ มันจะเชื่อมต่อกับอินเทอร์เน็ตและสื่อสารกับหนึ่งในโหนดของคุณผ่านการเชื่อมต่อแบบอนุกรม

อีกอย่างหนึ่งคือการใช้อุปกรณ์ Raspberry PI เพื่อรวบรวมข้อมูลและเชื่อมต่อกับการ์ด wifi อีกตัวหนึ่งไปยังเครือข่ายอื่น

อีกสองคนไม่ดีคนหนึ่งถูกท้อใจโดยผู้เขียนและคนอื่นที่ซับซ้อนและ จำกัด ด้วย esp8266 ที่ฉันจะไม่ลอง

คู่มือทั้งในgitlab


5

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

โหนดใช้รายการการเชื่อมต่อสำหรับการกำหนดเส้นทางข้อความ / การส่งต่อ สิ่งที่คุณต้องการคือโหนดที่มีการบันทึกการเชื่อมต่อสำหรับเซิร์ฟเวอร์นี่คือสิ่งที่โหนดรูทเป็น

ตอนนี้เมื่อโหนดถูกเปิดใช้งานมันจะทำการสแกน AP (จุดเข้าใช้งาน), กรองสิ่งที่ไม่เริ่มต้นด้วยคำนำหน้าเครือข่ายและจากนั้นเชื่อมต่อกับ AP ด้วย RSSI ที่ดีที่สุด นอกจากนี้ทุกโหนดสร้าง AP ของตัวเองที่มีชื่อตาข่ายคำนำหน้า + โหนด ID

หากไม่มีโหนดอื่นให้ใช้ก็จะรอให้ผู้อื่นเชื่อมต่อ และนี่คือจุดแรกที่ควรใช้การเปลี่ยนแปลง คุณสามารถ hardcode หรือกำหนดค่า AP ที่ไม่เหมือนใครด้วยชื่ออย่างเช่นคำนำหน้า mesh + "เซิร์ฟเวอร์"และถ้าไม่มี EasyMesh AP อื่น ๆ อยู่โหนดควรเชื่อมต่อกับ AP นี้และควรเก็บmeshConnectionTypeวัตถุที่กำหนดไว้ล่วงหน้าในรายการการเชื่อมต่อ

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

struct meshConnectionType {
    espconn             *esp_conn;
    uint32_t            chipId = 0;
    String              subConnections;
    timeSync            time;
    uint32_t            lastRecieved = 0;
    bool                newConnection = true;

    (...)
};

chipIdจะเป็นที่อยู่ของเซิร์ฟเวอร์ในเครือข่ายของตาข่าย คุณควรเลือกหนึ่งค่าที่ไม่สามารถเป็นรหัสชิป ESP8266

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

โหนด "รูท" จะพบว่ามีการเชื่อมต่อโดยตรงกับเซิร์ฟเวอร์ (ไปยังเราเตอร์ / อินเทอร์เน็ต) และเนื่องจากเป็นข้อความไปยังเซิร์ฟเวอร์ว่าควรส่งต่อข้อความนี้ในวิธีอื่น (ไม่ใช่แบบตาข่าย) . ต้องการข้อมูลเพิ่มเติมที่ชัดเจนเช่นที่อยู่ IP ของเซิร์ฟเวอร์และพอร์ตที่ใช้ สิ่งเหล่านี้ควรถูกเก็บไว้เป็นโหนด (ในทุก ๆ โหนด) โดยค่าเริ่มต้นหรือโดยวิธีการกำหนดค่าบางอย่าง

ดังนั้นในที่สุด "รูท" โหนดจะส่งข้อความ IP ไปยังเซิร์ฟเวอร์สิ่งนี้ควรดำเนินการโดยคุณอีกครั้ง


TL; DR; สรุป:

  • ควรมีเซิร์ฟเวอร์ AP และโหนดแรก (เฉพาะโหนดแรกที่จะเปิดใช้งาน) ควรเชื่อมต่อกับโหนดนี้จะเป็นโหนดรูท
  • เซิร์ฟเวอร์ควรมีที่อยู่ ( destId) ที่จะใช้ในเครือข่ายเมชเมื่อส่งข้อความไปยังเซิร์ฟเวอร์ ข้อมูลนี้ควรพร้อมใช้งานสำหรับทุกโหนดโดยค่าเริ่มต้น
  • โหนดรูทควรรู้ว่าเชื่อมต่อ "โดยตรง" กับเซิร์ฟเวอร์ / อินเทอร์เน็ต สิ่งนี้สามารถทำได้โดยการเพิ่มบันทึกการเชื่อมต่อกับเซิร์ฟเวอร์ของdestIdรายการการเชื่อมต่อของรูตโหนด
  • โหนดรูทที่รู้ว่าเชื่อมต่อกับเซิร์ฟเวอร์สามารถส่งต่อข้อความได้อย่างเหมาะสมผ่านทางอินเทอร์เน็ต

นี่เป็นเพียงความคิดทางทฤษฎีที่ฉันคิดขึ้นมาโดยการอ่านผ่านการใช้งาน EasyMesh ฉันอาจพลาดความจริงที่สำคัญบางอย่างที่ทำให้สิ่งนี้ยากหรือเป็นไปไม่ได้ที่จะนำไปใช้ มันอาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการแก้ปัญหา ฉันไม่ได้เป็นผู้เชี่ยวชาญด้านเครือข่ายตาข่าย

การมีโหนดรูทในเครือข่ายถามว่า "จะเกิดอะไรขึ้นหากรูตถูกตัดการเชื่อมต่อรูทใหม่จะถูกเลือกอย่างไร"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.