Δημιουργία πύλης μεταξύ Wi-Fi και LoRa για UDP

Είχα ένα παιδικό όνειρο - να δώσω σε κάθε οικιακή συσκευή "μη Wi-Fi" ένα εισιτήριο για το δίκτυο, δηλαδή μια διεύθυνση 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
Πρωταγωνιστούν:
Άνθρωπος στον ρόλο Υποδοχή;
Περιστέρι στον ρόλο Συνδέσεις;
Το γράμμα στον ρόλο Δαν.
Επεισόδιο Α. Σύγχρονη υποδοχή χωρίς χρονικό όριο
Ο άντρας θα σταθεί όρθιος μέχρι το Περιστέρι να του φέρει ένα Γράμμα.
Επεισόδιο Β. Σύγχρονη υποδοχή με χρονικό όριο
Ο άντρας περιμένει την ώρα που έχει συμφωνηθεί με το Περιστέρι, και αν αυτή δεν φτάσει στην ώρα της, ο άντρας θα φύγει.
Επεισόδιο Γ. Σύγχρονη υποδοχή με πολλαπλά νήματα
Ο άντρας κάθεται αναπαυτικά και παρακολουθεί τα Περιστέρια να παραδίδουν τα Γράμματα μόνα τους.
Επεισόδιο Δ. Ασύγχρονη υποδοχή (όταν δεν υπάρχει τίποτα άλλο για λήψη)
Ο άντρας κάνει τα αγαπημένα του πράγματα, αλλά δεν ξεχνάει τα Περιστέρια.
Επεισόδιο Ε. Ασύγχρονη υποδοχή (όταν υπάρχει κάτι για λήψη)
Ο άντρας έκανε ένα διάλειμμα από τη δουλειά του για να λάβει ένα γράμμα από το Περιστέρι.
Επεισόδιο ΣΤ. Ασύγχρονη υποδοχή με πολλαπλά νήματα
Ένας άντρας ασχολείται με τις δουλειές του και παρακολουθεί τα Περιστέρια να παραδίδουν μόνα τους τις Επιστολές.
Αν προσέχατε, πιθανότατα θα παρατηρούσατε ότι τα κολάρα των Doves σε κάθε επεισόδιο έχουν ένα συγκεκριμένο χρώμα. Και αυτό δεν είναι χωρίς λόγο. Στα επεισόδια Α και Β, ο διακομιστής έχει μόνο μία υποδοχή σε λειτουργία και αυτό είναι όλο. Στο επεισόδιο Γ, δύο πρίζες λειτουργούν ήδη. Τα επεισόδια D, E και F έχουν ήδη τρεις υποδοχές. «Γιατί υπάρχουν δύο εκεί και τρία εδώ;» — ρωτάς. Αυτά είναι υπό όρους 2 και 3, στην πραγματικότητα αντί για 2 θα μπορούσαν να υπάρχουν 20, και αντί για τρία 200. Ο στόχος είναι να δείξουμε ότι οι ασύγχρονες πρίζες δεν θερμαίνουν το υλικό τόσο πολύ όσο οι σύγχρονες.
Πού χωράει πόσο από τι;
Ας δούμε τον Πίνακα 1, ο οποίος δείχνει τη δομή ενός πακέτου UDP, και ας σκεφτούμε τι μπορούμε να κάνουμε με αυτό.
Πίνακας 1. Δομή πακέτων UDP
κομμάτια
0 - 15
16 - 31
0-31
Θύρα πηγής
Λιμάνι προορισμού
32-63
Μήκος datagram (Μήκος)
Άθροισμα ελέγχου
64- ...
Δεδομένα
Ας προσθέσουμε ένα ακόμη πεδίο στην αρχή αυτού του πίνακα. Συνεδρίαση (1 Byte). Αυτό είναι αρκετό για αυτό το έργο. Με βάση την Συνεδρία, η συσκευή θα γνωρίζει τι να κάνει στη συνέχεια με το πακέτο. Τώρα ας βρούμε κωδικούς για τις συνεδρίες και ας τους καταγράψουμε στον πίνακα 2.
Πίνακας 2. Επεξήγηση των συνεδριών
Κώδικας
Όνομα
διευκρίνιση
0xA1
Φάρος
Η πύλη μεταδίδει το όνομα του δικτύου LoRa και το εύρος των αποδεκτών θυρών σε μια συγκεκριμένη συχνότητα. Αυτό είναι απαραίτητο ώστε οι νέοι πελάτες να μπορούν να δουν το διαθέσιμο δίκτυο και οι τρέχοντες πελάτες να μπορούν να προσδιορίσουν το επίπεδο σήματος όταν δεν υπάρχει μετάδοση.
0xB1
Αίτηση
Όταν ο πελάτης ανακαλύψει ένα δίκτυο, στέλνει την προτιμώμενη θύρα του.
0xA2
Συγκατάθεση ή άρνηση
Εάν η θύρα που ζητείται από τον πελάτη είναι ελεύθερη, ο διακομιστής απαντά με συγκατάθεση, διαφορετικά με άρνηση.
0xB2
Ανοδική σύνδεση
Όταν ένας πελάτης μεταδίδει ένα πακέτο UDP σε μια πύλη.
0xA3
Κάτω σύνδεσμος
Όταν η πύλη μεταδίδει ένα πακέτο UDP στον πελάτη.
0xC1
Συνέχιση της σύνδεσης προς τα πάνω
Όταν η πύλη στέλνει ένα πακέτο UDP στο τοπικό δίκτυο.
Πρόστιμο. Ας συζητήσουμε τώρα τη σύνθεση των συνεδριών στον Πίνακα 3.
Πίνακας 3. Συνεδρίες
Όνομα συνεδρίας
Δομή
Φάρος
Κωδικός συνεδρίας (1 Byte) + Όνομα δικτύου LoRa (4 Bytes) + Θύρα έναρξης (2 Bytes) + Θύρα λήξης (2 Bytes)
Αίτηση
Κωδικός μετάδοσης (1 Byte) + όνομα δικτύου LoRa (4 Bytes) + προτιμώμενη θύρα (2 Bytes)
Συγκατάθεση ή άρνηση
Κωδικός μετάδοσης (1 Byte) + Όνομα δικτύου LoRa (4 Byte) + Προτιμώμενη θύρα (2 Byte) + Αποτέλεσμα (1 Byte)
Ανοδική σύνδεση
Κωδικός μετάδοσης (1 Byte) + Όνομα δικτύου LoRa (4 Bytes) + Απομακρυσμένη διεύθυνση IP (4 Bytes) + Απομακρυσμένη θύρα (2 Bytes) + Τοπική διεύθυνση IP (4 Bytes) + Τοπική θύρα (2 Bytes) + Μέγεθος δεδομένων (2 Bytes) + Δεδομένα
Κάτω σύνδεσμος
Κωδικός μετάδοσης (1 Byte) + Όνομα δικτύου LoRa (4 Bytes) + Απομακρυσμένη διεύθυνση IP (4 Bytes) + Απομακρυσμένη θύρα (2 Bytes) + Τοπική διεύθυνση IP (4 Bytes) + Τοπική θύρα (2 Bytes) + Μέγεθος δεδομένων (2 Bytes) + Δεδομένα
Συνέχιση της σύνδεσης προς τα πάνω
Απομακρυσμένη διεύθυνση IP (4 Bytes) + Απομακρυσμένη θύρα (2 Bytes) + Μέγεθος δεδομένων (2 Bytes) + Δεδομένα
Έγραψα δύο προγράμματα-πελάτες για το Arduino και για το M5Stack. Επί Μπορείτε να δείτε πώς λειτουργεί. Δεν υπάρχουν προβλήματα μέσα στο διαμέρισμα, δεν έχω κάνει ακόμα δοκιμές πεδίου.
Ο πηγαίος κώδικας είναι διαθέσιμος στο GitHub στη διεύθυνση
Μπορείτε να μάθετε περισσότερα για τη βασική συσκευή M5Stack και να την αγοράσετε εδώ
Μπορείτε να επιλέξετε ασύρματες μονάδες LoRa για τη βασική συσκευή
Θα χαρώ πολύ αν αυτό το έργο σας φανεί χρήσιμο. Σας ευχαριστώ πολύ για τον χρόνο σας!
Λίστα βιβλιογραφίας και (ή) πηγών:
Πηγή: www.habr.com
