การสร้างเกตเวย์ระหว่าง Wi-Fi และ LoRa สำหรับ UDP

ฉันมีความฝันในวัยเด็ก - ที่จะออกตั๋วเครือข่ายให้กับอุปกรณ์ "ที่ไม่มี WiFi" ทุกครัวเรือน เช่น ที่อยู่ IP และพอร์ต หลังจากนั้นไม่นานฉันก็ตระหนักว่าไม่มีประโยชน์ที่จะเลื่อนออกไป เราต้องรับมันและทำมัน
งานด้านเทคนิค
ทำให้เป็นเกตเวย์ M5Stack ที่ติดตั้งโมดูล LoRa (รูปที่ 1) เกตเวย์จะเชื่อมต่อกับเครือข่าย Wi-Fi ซึ่งจะได้รับที่อยู่ IP ในเครื่องผ่าน DHCP เกตเวย์จะเผยแพร่ชื่อ (คล้ายกับ SSID สำหรับ Wi-Fi) และช่วงของพอร์ตที่ถูกต้องในการออกอากาศ LoRa ที่ความถี่ที่แน่นอน เพื่อให้อุปกรณ์อื่น ๆ รู้ว่ามีเครือข่ายที่พวกเขาสามารถเชื่อมต่อได้และอยู่ในช่วงใด พวกเขาสามารถเลือกพอร์ตฟรีได้ เนื่องจากนี่จะเป็นต้นแบบ จึงไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ในครั้งนี้ อุปกรณ์ไคลเอนต์ใหม่จะค้นหาเครือข่าย LoRa ที่พร้อมใช้งานและส่งพอร์ตที่เลือกไป หลังจากที่เกตเวย์ได้รับพอร์ตจากไคลเอนต์ใหม่ มันจะตรวจสอบว่าว่างหรือไม่ หากเป็นเช่นนั้น จะลงทะเบียนไคลเอนต์ใหม่และเริ่มฟังพอร์ตนี้บนเซิร์ฟเวอร์ UDP แบบอะซิงโครนัสของตัวเอง หลังจากการลงทะเบียน ลูกค้าจะได้รับความยินยอมหรือปฏิเสธที่จะใช้พอร์ตที่ประกาศไว้ ขั้นตอนการทำงานแสดงไว้ในตารางที่ 1

1 รูป
1 ตาราง
ด้านข้าง
ทิศทางและข้อมูล
ด้านข้าง
การประชุม
[ ลูกค้า ]
<— สัญญาณบีคอน —
[เกตเวย์]
0xA1
[ ลูกค้า ]
— พอร์ตที่เลือก —>
[เกตเวย์]
0xB1
[ ลูกค้า ]
<— การยินยอมหรือการปฏิเสธ —
[เกตเวย์]
0xA2
[ ลูกค้า ]
— แพ็คเกจ UPD —>
[เกตเวย์]
0xB2
[ ลูกค้า ]
<— แพ็คเกจ UPD —
[เกตเวย์]
0xA3
[ สุทธิ ]
<— แพ็คเกจ UPD —
[เกตเวย์]
0xC1
มีโมดูลทุกประเภทสำหรับ M5Stack ที่วางอยู่บนโต๊ะตรงหน้าฉันและพวกมันน่าเบื่อ มาใช้ LoR และสนุกไปกับมันกันเถอะ แนวคิดของโมดูลนั้นยอดเยี่ยมมาก! ฉันจะพูดอะไรได้บ้าง? แต่ฉันมีโมดูลการแก้ไขครั้งแรกซึ่งมีเสาอากาศในตัวที่แย่ที่สุด สร้างขึ้นบนแผงวงจรพิมพ์ที่ยืดหยุ่นและติดกาวไว้ที่ผนังด้านข้างของเคส ฉันเคยทำการทดสอบภาคสนามของโมดูลดังกล่าว (คุณสามารถรับชมได้ในช่องภาษารัสเซียบน YouTube):

โดยปกติแล้ว เราต้องลบสิ่งพื้นฐานเหล่านี้และบัดกรีในเสาอากาศแบบเกลียวมาตรฐานที่มาพร้อมกับ Ra-01 หลังจากการปรับแต่งดังกล่าว ช่วงการสื่อสารดีขึ้นอย่างเห็นได้ชัด แต่มีปัญหาด้านข้างเกิดขึ้น - เสาอากาศมีเส้นผ่านศูนย์กลางใหญ่กว่าระยะห่างที่อนุญาตระหว่างโมดูล ฉันต้องละทิ้งโมดูลสุดท้ายตลอดระยะเวลาของโปรเจ็กต์
ปัญหาแรกจากความรัดกุมแบบซิงโครนัส
ดูเหมือนว่าจะเข้าห้องสมุด WiFiUdp.hซึ่งทุกอย่างมีไว้เพื่อการดำรงอยู่อย่างสะดวกสบายของเซิร์ฟเวอร์ UDP แต่นี่ไม่ใช่กรณี ไลบรารีได้รับการออกแบบสำหรับการเพิ่มเซิร์ฟเวอร์ซิงโครนัส ซึ่งน่าเสียดายที่ไม่สามารถให้บริการการเชื่อมต่อหลายรายการพร้อมกันในเธรดเดียวได้ ห้องสมุดดังกล่าวไม่เหมาะกับงานปัจจุบัน ฉันต้องดื่มชาไปหลายแก้วและมองหาห้องสมุดที่ทำให้ฉันสามารถสร้างเซิร์ฟเวอร์ UDP แบบอะซิงโครนัสที่สามารถรองรับการเชื่อมต่อมากมายในเวลาเดียวกัน พบห้องสมุดดังกล่าว - AsyncUDP.h- อะไรคือความแตกต่างระหว่างเซิร์ฟเวอร์ซิงโครนัสและเซิร์ฟเวอร์อะซิงโครนัส? ลองดูหกตอนในรูปที่ 2 ที่แสดงวิธีการทำงานของซ็อกเก็ตเล็กน้อย

2 รูป
นำแสดงโดย:
คน ในบทบาท ซ็อกเก็ต;
นกพิราบ ในบทบาท สัมพันธ์;
พิสโม ในบทบาท Даных.
ตอนที่ A. ซ็อกเก็ตซิงโครนัสโดยไม่มีการหมดเวลา
ชายคนนั้นจะยืนจนกว่านกพิราบจะนำจดหมายมาให้เขา
ตอน B. ซ็อกเก็ตซิงโครนัสที่มีการหมดเวลา
ชายคนนั้นรอเวลาที่ตกลงไว้กับนกพิราบ และถ้ามาไม่ตรงเวลา ชายคนนั้นก็จะจากไป
ตอน C. ซ็อกเก็ตซิงโครนัสพร้อมมัลติเธรด
ชายคนนั้นนั่งมองดูนกพิราบส่งจดหมายด้วยตัวเอง
ตอน D. ซ็อกเก็ตอะซิงโครนัส (เมื่อไม่มีอะไรให้รับอีกแล้ว)
คนทำสิ่งที่เขาชอบ แต่ไม่ลืมเกี่ยวกับนกพิราบ
ตอนที่ E. ซ็อกเก็ตแบบอะซิงโครนัส (เมื่อมีสิ่งที่ได้รับ)
ชายคนนั้นหยุดพักจากเรื่องของเขาสักพักเพื่อรับจดหมายจากนกพิราบ
ตอนที่ F. ซ็อกเก็ตอะซิงโครนัสพร้อมมัลติเธรด
ชายคนนั้นดำเนินธุรกิจของเขาและเฝ้าดูขณะที่นกพิราบส่งจดหมายด้วยตัวเอง
หากคุณให้ความสนใจ คุณอาจสังเกตเห็นว่าปลอกคอของนกพิราบในแต่ละตอนมีสีที่แน่นอน และนี่ไม่ใช่โดยไม่มีเหตุผล ในตอน A และ B มีเพียงซ็อกเก็ตเดียวเท่านั้นที่ทำงานบนเซิร์ฟเวอร์ เท่านี้ก็เรียบร้อย ในตอนที่ C ซ็อกเก็ตสองตัวใช้งานได้แล้ว ตอน D, E และ F มีซ็อกเก็ตสามช่องอยู่แล้ว “เหตุใดจึงมีสองที่นั่นและสามที่นี่” - คุณถาม สิ่งเหล่านี้มีเงื่อนไข 2 และ 3 ในความเป็นจริงแทนที่จะเป็น 2 สามารถมี 20 และแทนที่จะเป็นสาม 200 เป้าหมายคือการแสดงให้เห็นว่าซ็อกเก็ตแบบอะซิงโครนัสไม่ให้ความร้อนกับเหล็กมากเท่ากับซ็อกเก็ตแบบซิงโครนัส
อะไรจะพอดีได้สักเท่าไร?
ลองดูที่ตารางที่ 1 ซึ่งแสดงโครงสร้างของแพ็กเก็ต UDP และคิดว่าเราสามารถทำอะไรกับมันได้บ้าง
ตารางที่ 1. โครงสร้างแพ็กเก็ต UDP
บิต
0 - 15
16 - 31
0-31
พอร์ตต้นทาง
พอร์ตปลายทาง
32-63
ความยาวเดตาแกรม (ความยาว)
เช็คซัม
64- …
ข้อมูล
มาเพิ่มฟิลด์อื่นที่จุดเริ่มต้นของตารางนี้กัน การประชุม (1 ไบต์) เพียงพอแล้วสำหรับโครงการนี้ ขึ้นอยู่กับเซสชัน อุปกรณ์จะรู้ว่าต้องทำอะไรต่อไปกับแพ็กเก็ต ตอนนี้ เรามาสร้างโค้ดสำหรับเซสชันต่างๆ แล้วจดไว้ในตารางที่ 2
ตารางที่ 2. คำอธิบายของเซสชัน
รหัส
ชื่อ
การอธิบาย
0xA1
ประภาคาร
เกตเวย์จะเผยแพร่ชื่อของเครือข่าย LoRa และช่วงของพอร์ตที่ถูกต้องที่ความถี่ที่กำหนด นี่เป็นสิ่งจำเป็นเพื่อให้ไคลเอนต์ใหม่เห็นเครือข่ายที่พร้อมใช้งาน และไคลเอนต์ปัจจุบันเมื่อไม่มีการส่งสัญญาณ สามารถกำหนดระดับสัญญาณได้
0xB1
แอปพลิเคชัน
เมื่อไคลเอนต์ค้นพบเครือข่ายแล้ว ก็จะส่งพอร์ตที่ต้องการ
0xA2
ความยินยอมหรือการปฏิเสธ
หากพอร์ตที่ลูกค้าร้องขอนั้นว่าง เซิร์ฟเวอร์จะตอบกลับด้วยความยินยอมหรือปฏิเสธ
0xB2
ลิงค์อัพครับ
เมื่อไคลเอนต์ส่งแพ็กเก็ต UDP ไปยังเกตเวย์
0xA3
ลิงค์ลง
เมื่อเกตเวย์ส่งแพ็กเก็ต UDP ไปยังไคลเอนต์
0xC1
ความต่อเนื่องของ Up-link
เมื่อเกตเวย์ส่งแพ็กเก็ต UDP ไปยังเครือข่ายท้องถิ่น
ดี. ตอนนี้เรามาหารือเกี่ยวกับองค์ประกอบของเซสชันในตารางที่ 3
ตารางที่ 3. เซสชัน
ชื่อเซสชัน
โครงสร้าง
ประภาคาร
รหัสเซสชัน (1 ไบต์) + ชื่อเครือข่าย LoRa (4 ไบต์) + พอร์ตเริ่มต้น (2 ไบต์) + พอร์ตสิ้นสุด (2 ไบต์)
แอปพลิเคชัน
รหัสการส่ง (1 ไบต์) + ชื่อเครือข่าย LoRa (4 ไบต์) + พอร์ตที่ต้องการ (2 ไบต์)
ความยินยอมหรือการปฏิเสธ
รหัสการส่ง (1 ไบต์) + ชื่อเครือข่าย LoRa (4 ไบต์) + พอร์ตที่ต้องการ (2 ไบต์) + ผลลัพธ์ (1 ไบต์)
ลิงค์อัพครับ
รหัสการส่ง (1 ไบต์) + ชื่อเครือข่าย LoRa (4 ไบต์) + ที่อยู่ IP ระยะไกล (4 ไบต์) + พอร์ตระยะไกล (2 ไบต์) + ที่อยู่ IP ภายใน (4 ไบต์) + พอร์ตภายในเครื่อง (2 ไบต์) + ขนาดข้อมูล (2 ไบต์) ) + ข้อมูล
ลงลิงค์
รหัสการส่ง (1 ไบต์) + ชื่อเครือข่าย LoRa (4 ไบต์) + ที่อยู่ IP ระยะไกล (4 ไบต์) + พอร์ตระยะไกล (2 ไบต์) + ที่อยู่ IP ภายใน (4 ไบต์) + พอร์ตภายในเครื่อง (2 ไบต์) + ขนาดข้อมูล (2 ไบต์) ) + ข้อมูล
ความต่อเนื่องของ Up-link
ที่อยู่ IP ระยะไกล (4 ไบต์) + พอร์ตระยะไกล (2 ไบต์) + ขนาดข้อมูล (2 ไบต์) + ข้อมูล
ฉันเขียนไคลเอนต์สองตัวสำหรับ Arduino และ M5Stack บน คุณสามารถดูวิธีการทำงาน ภายในอพาร์ตเมนต์ไม่มีปัญหาใดๆ ฉันยังไม่ได้ทำการทดสอบภาคสนามใดๆ
ซอร์สโค้ดมีอยู่ใน GitHub ที่
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับอุปกรณ์ฐาน M5Stack และซื้อได้
คุณสามารถเลือกโมดูลไร้สาย LoRa สำหรับอุปกรณ์ฐานได้
ฉันจะดีใจถ้าโครงการนี้มีประโยชน์กับคุณ ขอบคุณมากสำหรับเวลาของคุณ!
รายการข้อมูลอ้างอิงและ (หรือ) แหล่งที่มา:
ที่มา: will.com
