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

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

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

ฉันมีความฝันในวัยเด็ก - ที่จะออกตั๋วเครือข่ายให้กับอุปกรณ์ "ที่ไม่มี WiFi" ทุกครัวเรือน เช่น ที่อยู่ IP และพอร์ต หลังจากนั้นไม่นานฉันก็ตระหนักว่าไม่มีประโยชน์ที่จะเลื่อนออกไป เราต้องรับมันและทำมัน

งานด้านเทคนิค

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

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

1 ตาราง

ด้านข้าง
ทิศทางและข้อมูล
ด้านข้าง
การประชุม

[ ลูกค้า ]
<— สัญญาณบีคอน —
[เกตเวย์]
0xA1

[ ลูกค้า ]
— พอร์ตที่เลือก —>
[เกตเวย์]
0xB1

[ ลูกค้า ]
<— การยินยอมหรือการปฏิเสธ —
[เกตเวย์]
0xA2

[ ลูกค้า ]
— แพ็คเกจ UPD —>
[เกตเวย์]
0xB2

[ ลูกค้า ]
<— แพ็คเกจ UPD —
[เกตเวย์]
0xA3

[ สุทธิ ]
<— แพ็คเกจ UPD —
[เกตเวย์]
0xC1

มีโมดูลทุกประเภทสำหรับ M5Stack ที่วางอยู่บนโต๊ะตรงหน้าฉันและพวกมันน่าเบื่อ มาใช้ LoR และสนุกไปกับมันกันเถอะ แนวคิดของโมดูลนั้นยอดเยี่ยมมาก! ฉันจะพูดอะไรได้บ้าง? แต่ฉันมีโมดูลการแก้ไขครั้งแรกซึ่งมีเสาอากาศในตัวที่แย่ที่สุด สร้างขึ้นบนแผงวงจรพิมพ์ที่ยืดหยุ่นและติดกาวไว้ที่ผนังด้านข้างของเคส ฉันเคยทำการทดสอบภาคสนามของโมดูลดังกล่าว (คุณสามารถรับชมได้ในช่องภาษารัสเซียบน YouTube):

เล่นวิดีโอ

โดยปกติแล้ว เราต้องลบสิ่งพื้นฐานเหล่านี้และบัดกรีในเสาอากาศแบบเกลียวมาตรฐานที่มาพร้อมกับ Ra-01 หลังจากการปรับแต่งดังกล่าว ช่วงการสื่อสารดีขึ้นอย่างเห็นได้ชัด แต่มีปัญหาด้านข้างเกิดขึ้น - เสาอากาศมีเส้นผ่านศูนย์กลางใหญ่กว่าระยะห่างที่อนุญาตระหว่างโมดูล ฉันต้องละทิ้งโมดูลสุดท้ายตลอดระยะเวลาของโปรเจ็กต์

ปัญหาแรกจากความรัดกุมแบบซิงโครนัส

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

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

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

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster