Gateway für UDP zwischen Wi-Fi und LoRa

Wir stellen das Gateway zwischen Wi-Fi und LoRa für UDP her



Ich hatte einen Kindheitstraum - jedem „Wi-Fi-freien“ Haushaltsgerät ein Netzwerkticket zu geben, das heißt eine IP-Adresse und einen Port. Nach einiger Zeit wurde mir klar, dass ich es nicht aufschieben sollte. Wir müssen nehmen und tun.


Technische Aufgabe


Machen Sie es zu einem M5Stack-Gateway mit installiertem LoRa-Modul (Abbildung 1). Das Gateway wird mit einem Wi-Fi-Netzwerk verbunden, in dem über DHCP eine lokale IP-Adresse abgerufen werden kann. Das Gateway sendet seinen Namen in LoRa-Ether mit einer bestimmten Frequenz (analog zu SSID für Wi-Fi) und dem Bereich akzeptabler Ports, damit andere Geräte wissen, dass es ein solches Netzwerk gibt, zu dem Sie eine Verbindung herstellen können, und in welchem ​​Bereich Sie einen freien Port auswählen können. Da dies ein Prototyp sein wird, findet diesmal keine Authentifizierung statt. Neue Client-Geräte finden ein verfügbares LoRa-Netzwerk und übertragen den ausgewählten Port an dieses. Nachdem das Gateway einen Port von einem neuen Client erhalten hat, prüft es, ob dieser frei ist. In diesem Fall registriert es einen neuen Client und beginnt, diesen Port auf seinem eigenen asynchronen UDP-Server abzuhören. Nach der Registrierung erhält der Kunde eine Einwilligung oder Verweigerung der Nutzung des angegebenen Hafens. Die Arbeitsweise ist in Tabelle 1 dargestellt.



Abbildung 1


Tabelle 1


SeiteRichtung und DatenSeitedie Sitzung
[Kunde]<- Bakensignal -[gateway]0xA1
[Kunde]- ausgewählter Hafen ->[gateway]0xB1
[Kunde]<- Zustimmung oder Ablehnung -[gateway]0xA2
[Kunde]- UPD-Paket ->[gateway]0xB2
[Kunde]<- UPD-Paket -[gateway]0xA3
[Netzwerk]<- UPD-Paket -[gateway]0xC1

Vor mir auf dem Tisch liegen alle möglichen Module für den M5Stack und langweilen sich. Nehmen wir LoR und viel spaß mit ihr . Das Modulkonzept selbst ist wunderschön! Was soll ich sagen Aber die Module meiner ersten Revision, in denen eine schreckliche Antenne verbaut ist, wurden auf eine flexible Leiterplatte geklebt und an die Seitenwand des Gehäuses geklebt. Ich habe einmal Feldversuche mit solchen Modulen durchgeführt (Sie können sie auf dem russischsprachigen Kanal auf YouTube ansehen):



Natürlich musste ich diese Rudimente entfernen und die Standard-Wendelantennen löten, die mit dem Ra-01 geliefert wurden. Nach einer solchen Anpassung verbesserte sich die Kommunikationsreichweite merklich, es trat jedoch ein Seitenpunkt auf - die Antenne hat einen Durchmesser, der größer ist als der zulässige Abstand zwischen den Modulen. Ich musste das Final-Modul für die Dauer des Projekts aufgeben.


Erste Schwierigkeiten von der synchronen Dichtheit


Es scheint, dass die WiFiUdp.h- Bibliothek, in der alles für die komfortable Existenz eines UDP-Servers steht, nein. Die Bibliothek dient zum Aufheben eines synchronen Servers, der leider nicht mehrere Verbindungen gleichzeitig bedienen kann. Eine solche Bibliothek ist für die aktuelle Aufgabe nicht geeignet. Ich musste eine Menge Tee trinken und nach einer Bibliothek suchen, mit der wir einen asynchronen UDP-Server aufbauen konnten, der viele Verbindungen gleichzeitig unterstützen konnte. Eine solche Bibliothek wurde gefunden - AsyncUDP.h . Was ist der Unterschied zwischen einem synchronen und einem asynchronen Server? Werfen wir einen Blick auf sechs Folgen in Abbildung 2, in denen die Optionen für den Socket-Betrieb trivial angezeigt werden.



Abbildung 2


Darsteller:


Ein Mann in der Rolle einer Steckdose ;


Taube in der Rolle der Verbindung ;


Pismo als Daten .


Folge A. Synchroner Socket ohne Timeout


Eine Person wird stehen, bis die Taube ihm einen Brief bringt.


Folge B. Synchroner Socket mit Timeout


Ein Mann wartet auf die mit der Taube vereinbarte Zeit, und wenn er nicht rechtzeitig ankommt, wird der Mann gehen.


Folge C. Synchroner Multithreading-Socket


Ein Mann räkelt sich und beobachtet, wie die Tauben selbst Briefe ausliefern.


Episode D. Asynchroner Socket (wenn nichts anderes zu empfangen ist)


Ein Mann macht seine Lieblingssachen, vergisst aber nicht die Tauben.


Episode E. Asynchroner Socket (wenn etwas zu empfangen ist)


Der Mann ließ sich kurz von seinen Angelegenheiten ablenken, um einen Brief von der Taube zu erhalten.


Episode F. Asynchroner Multithreading-Socket


Ein Mann geht seinem Geschäft nach und sieht zu, wie die Tauben selbst Briefe ausliefern.


Wenn Sie vorsichtig waren, sollten Sie wahrscheinlich bemerkt haben, dass die Halsbänder der Tauben in jeder Episode eine bestimmte Farbe haben. Und das ist kein Zufall. In Folge A und B funktioniert nur ein Socket auf dem Server, und das war's. Episode C hat bereits zwei Steckdosen. Die Folgen D, E und F haben bereits drei Buchsen. "Warum gibt es zwei, aber hier sind drei?" - Du fragst. Dies ist bedingt 2 und 3, statt 2 können es 20 und statt drei 200 sein. Die Aufgabe besteht darin, zu zeigen, dass asynchrone Steckdosen nicht so viel Eisen verbrennen wie synchrone.


Wo passt was?


Schauen wir uns Tabelle 1 an, die die Struktur des UDP-Pakets zeigt, und überlegen, was Sie dagegen tun können.


Tabelle 1. UDP-Paketstruktur


Bits0 - 1516 - 31
0-31QuellportZielhafen
32-63DatagrammlängePrüfsumme
64 -...Daten

Fügen Sie ganz am Anfang dieser Tabelle ein weiteres Sitzungsfeld (1 Byte) hinzu. Das reicht für dieses Projekt. Basierend auf der Sitzung weiß das Gerät, was als nächstes mit dem Paket zu tun ist. Jetzt werden wir Codes für die Sitzungen ausarbeiten und diese in Tabelle 2 schreiben.


Tabelle 2. Sitzungsbeschreibung


CodeTitelErklärung
0xA1LeuchtturmDas Gateway sendet den Namen des LoRa-Netzwerks und den Bereich der zulässigen Ports mit einer bestimmten Frequenz. Dies ist erforderlich, damit neue Clients das verfügbare Netzwerk sehen und aktuelle Clients, wenn keine Übertragungen vorliegen, den Signalpegel bestimmen können.
0xB1BewerbungWenn der Client das Netzwerk findet, sendet er den bevorzugten Port.
0xA2Zustimmung oder AblehnungWenn der vom Client angeforderte Port frei ist, antwortet der Server mit Zustimmung und andernfalls mit einer Ablehnung.
0xB2Link nach obenWenn der Client das UDP-Paket an das Gateway sendet.
0xA3DownlinkWenn das Gateway das UDP-Paket an den Client sendet.
0xC1Fortsetzung Up-LinkWenn das Gateway ein UDP-Paket an das lokale Netzwerk sendet.

Gut Besprechen wir nun die Zusammensetzung der Sitzungen in Tabelle 3.


Tabelle 3. Sitzungen


SitzungsnameZusammensetzung
LeuchtturmSitzungscode (1 Byte) + LoRa-Netzwerkname (4 Byte) + Startport (2 Byte) + Endport (2 Byte)
BewerbungÜbertragungscode (1 Byte) + LoRa-Netzwerkname (4 Byte) + Bevorzugter Port (2 Byte)
Zustimmung oder AblehnungÜbertragungscode (1 Byte) + LoRa-Netzwerkname (4 Byte) + Bevorzugter Port (2 Byte) + Ergebnis (1 Byte)
Link nach obenÜbertragungscode (1 Byte) + LoRa-Netzwerkname (4 Byte) + Remote-IP-Adresse (4 Byte) + Remote-Port (2 Byte) + Lokale IP-Adresse (4 Byte) + Lokaler Port (2 Byte) + Datengröße (2 Bytes) + Daten
DownlinkÜbertragungscode (1 Byte) + LoRa-Netzwerkname (4 Byte) + Remote-IP-Adresse (4 Byte) + Remote-Port (2 Byte) + Lokale IP-Adresse (4 Byte) + Lokaler Port (2 Byte) + Datengröße (2 Bytes) + Daten
Fortsetzung Up-LinkRemote-IP-Adresse (4 Byte) + Remote-Port (2 Byte) + Datengröße (2 Byte) + Daten

Schrieb zwei Clients für Arduino und für M5Stack. Wie das geht, sehen Sie im Video . Es gibt keine Probleme in der Wohnung, ich habe noch keine Feldtests durchgeführt.


Der Quellcode ist auf GitHub unter verfügbar


Erfahren Sie mehr über die M5Stack Base Unit und kaufen Sie hier.


Hier können Sie LoRa-Funkmodule für die Basiseinheit auswählen


Ich freue mich, wenn dieses Projekt für Sie nützlich ist. Vielen Dank für Ihre Zeit!


Referenzen und (oder) Quellen:


Source: https://habr.com/ru/post/de482080/


All Articles