Η συσκευή βρίσκεται πίσω από έναν οικιακό δρομολογητή χωρίς προώθηση θύρας και χωρίς δημόσια διεύθυνση, και παρ' όλα αυτά πρέπει να λάβει ρυθμίσεις μέσα σε δευτερόλεπτα. Το κόλπο δεν είναι μια τρύπα στο firewall. Είναι μια σύνδεση που η συσκευή ανοίγει προς τα έξω προς έναν broker που μπορεί να φτάσει, και ο οποίος μετά επιστρέφει τα μηνύματα από την ίδια εδραιωμένη διαδρομή. Κάθε ιδιότητα που αρέσει σε αυτόν τον σχεδιασμό, και κάθε παγίδα μέσα του, προέρχεται από αυτή την αντιστροφή.

Τι περνά στην πραγματικότητα μέσα από το NAT

Όταν η συσκευή ανοίγει μια σύνδεση TCP προς τον broker, ο οικιακός δρομολογητής δημιουργεί μια αντιστοίχιση και τη διατηρεί ζωντανή για όλη τη διάρκεια της ροής. Οι απαντήσεις σε αυτή τη ροή επιστρέφουν στη συσκευή επειδή η αντιστοίχιση υπάρχει ήδη. Ο broker δεν ξεκινά ποτέ τίποτα προς το σπίτι, άρα δεν υπάρχει μη ζητηθέν εισερχόμενο πακέτο για να απορρίψει ο δρομολογητής. Αυτό είναι όλο το επιχείρημα δικτύωσης, και γι' αυτό η προσέγγιση λειτουργεί σε δίκτυα που δεν ελέγχετε.

Η συσκευή πρέπει να κρατά τη σύνδεση ζωντανή ή να την αποκαθιστά, κάτι που γίνεται το ζήτημα αξιοπιστίας μόλις σταθεροποιηθεί η αρχιτεκτονική.

Ο broker δρομολογεί θέματα, δεν κάνει proxy HTTP

Το MQTT ορίζει ανταλλαγές δημοσίευσης και συνδρομής: η συσκευή συνδρομεί σε ένα φίλτρο θεμάτων που επιτρέπεται να διαβάζει, και ένας εξουσιοδοτημένος ελεγκτής δημοσιεύει σε αντίστοιχο θέμα. Ο broker αντιστοιχίζει δημοσιεύσεις με συνδρομές και παραδίδει αντίγραφα. Δεν ξέρει τι είναι ένα αίτημα προγράμματος περιήγησης και δεν θα προωθήσει ένα HTTP GET στον διακομιστή ιστού της συσκευής. Αν το υπάρχον firmware μιλά μόνο HTTP, ο σχεδιασμός με broker χρειάζεται αλλαγή εφαρμογής ή μια σκόπιμη συνιστώσα μετάφρασης.

Τα ονόματα θεμάτων επίσης δεν είναι εξουσιοδότηση. Οι περισσότεροι brokers υποστηρίζουν λίστες ελέγχου πρόσβασης ανά πελάτη, και οι συσκευές θα πρέπει να περιορίζονται στα δικά τους δέντρα δημοσίευσης και συνδρομής αντί να μοιράζονται έναν παγκόσμιο χώρο ονομάτων.

Οι πόροι της συσκευής καθορίζουν τη μορφή του TLS

Το ESP8266 έχει περιορισμένη RAM, και η χειραψία TLS είναι το πιο ακριβό πράγμα που κάνει. Ο πυρήνας Arduino παρέχει το BearSSL ακριβώς γι' αυτόν τον περιορισμό, και η επιλογή ανάμεσα στην επαλήθευση ενός CA και στην καρφίτσωμα ενός αποτυπώματος αλλάζει και το αποτύπωμα μνήμης και το τι μπορεί να κάνει ένας επιτιθέμενος με έγκυρο πιστοποιητικό για άλλο όνομα. Η επαλήθευση του CA του broker είναι η ισχυρότερη επιλογή όταν το heap το επιτρέπει. Το μέγεθος του ωφέλιμου φορτίου έχει επίσης σημασία: ο πελάτης MQTT κρατά ένα buffer, και μηνύματα μεγαλύτερα από αυτό κόβονται σιωπηλά εκτός αν το buffer αυξηθεί σκόπιμα.

Το keepalive και τα timeouts του socket είναι μέρος του ίδιου προϋπολογισμού, γιατί ένας πελάτης που δεν αντιλαμβάνεται ποτέ μια νεκρή σύνδεση σταματά να λαμβάνει εντολές χωρίς να αναφέρει σφάλμα.

Η σημασιολογία μηνυμάτων που δαγκώνει

Ένα διατηρημένο μήνυμα αποθηκεύεται από τον broker και παραδίδεται σε μεταγενέστερους αντίστοιχους συνδρομητές, κάτι εξαιρετικό για την τρέχουσα κατάσταση και επικίνδυνο για εντολές μίας χρήσης: μια συσκευή που επανασυνδέεται μπορεί να λάβει την εντολή του χθες σαν να είναι νέα. Το QoS 1 εγγυάται παράδοση τουλάχιστον μία φορά, άρα τα διπλότυπα είναι φυσιολογικά και η εφαρμογή πρέπει να είναι ασφαλής σε επανάληψη, ιδανικά με ένα αναγνωριστικό ή μια χρονική σήμανση που μπορεί να απορρίψει. Η τελευταία θέληση σας δίνει σήμα κατάστασης όταν η συσκευή πέσει, αλλά μόνο αν η σύνδεση αποτύχει πραγματικά αντί να κολλήσει.

Η συμπεριφορά καθαρής συνεδρίας καθορίζει αν ο broker κρατά τις συνδρομές σας όσο λείπετε, και το να το κάνετε λάθος είναι ο λόγος που μερικές συσκευές χάνουν το πρώτο μήνυμα μετά από κάθε επανασύνδεση.

Το TLS προστατεύει το τμήμα μέχρι τον broker. Δεν είναι κρυπτογράφηση ωφέλιμου φορτίου από άκρο σε άκρο απέναντι στον διαχειριστή του broker, ο οποίος μπορεί να διαβάσει ό,τι δημοσιεύετε μέσα από αυτόν.

Περιορίστε τον κύκλο ζωής και δοκιμάστε τον με αβλαβή δεδομένα

Σχεδιάστε την επανασύνδεση με backoff αντί για έναν σφιχτό βρόχο επανάληψης, εγγραφείτε ξανά ρητά αν η συνεδρία δεν είναι επίμονη, και καταγράψτε το αποτέλεσμα της σύνδεσης ώστε μια σιωπηλή συσκευή εκτός σύνδεσης να αφήνει στοιχεία. Δοκιμάστε τη διαδρομή επανασύνδεσης με δείγματα ωφέλιμου φορτίου που δεν κάνουν τίποτα, γιατί η πρώτη δοκιμή παραγωγής ενός καναλιού εντολών δεν πρέπει να είναι πραγματική εντολή. Στη συνέχεια επιβεβαιώστε τι κάνει ένα παλιό διατηρημένο μήνυμα κατά την επανασύνδεση, και αποφασίστε αν αυτή η συμπεριφορά είναι αποδεκτή για κάθε θέμα.

Έτσι σχεδιασμένο, το σχέδιο αφαιρεί μία εισερχόμενη απαίτηση δικτύου και αφήνει το λογισμικό της συσκευής, την πολιτική του broker και τη σημασιολογία των μηνυμάτων ως ορατή εργασία αντί για κρυφές υποθέσεις.

Σχετικά άρθρα