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
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
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
Gut Besprechen wir nun die Zusammensetzung der Sitzungen in Tabelle 3.
Tabelle 3. Sitzungen
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: