Σύνδεση Ethernet TCP με Arduino

Σύνδεση Ethernet TCP με Arduino

Σύνδεση Ethernet TCP με Arduino

Από πλευράς λογισμικού, δημιουργία σύνδεσης Ethernet με Arduino Είναι πολύ απλό. Για να το κάνετε αυτό, χρησιμοποιήστε το Βιβλιοθήκη Ethernet. Αυτή η βιβλιοθήκη έχει σχεδιαστεί για α Ασπίδα Ethernet που βασίζεται στην ολοκληρωμένη W5100, αλλά υπάρχουν άλλες διαφορετικές πλακέτες ή μονάδες ή/και που χρησιμοποιούν άλλες ενσωματωμένες, όπως η ENC28J60. Για να απλοποιηθεί η χρήση του και να αυξηθεί η συμβατότητα, άλλες βιβλιοθήκες χρησιμοποιούν (σχεδόν) το ίδιο API ότι Βιβλιοθήκη Ethernet, θα πρέπει μόνο να αντικαταστήσετε την εναλλακτική βιβλιοθήκη με την αρχική ή να την συμπεριλάβετε (όταν το όνομα είναι διαφορετικό) στη θέση της, ακόμα κι αν χρησιμοποιούνται οι ίδιες (ή πολύ παρόμοιες) συναρτήσεις στον κώδικα. Στην περίπτωσή μου, χρησιμοποιώ το Βιβλιοθήκη UIPEthernet de Norbert Truchsess ακολουθώντας την ίδια διαδικασία που θα περιγράψω σε αυτό το κείμενο.

Μονάδα ENC28J60 για χρήση με τη βιβλιοθήκη UIPEthernet

1. Καθορίστε τη σύνδεση Ethernet

Είτε πρόκειται να υιοθετήσετε τον ρόλο του πελάτης όπως διακομιστής, πρώτα από όλα πρέπει να ορίσετε τη σύνδεση με τη συνάρτηση να αρχίσει() που μπορεί να περάσει ως παράμετρος μόνο το Διεύθυνση MAC και περιμένετε για διακομιστή DHCP στο δίκτυο αντιστοιχίστε α Διεύθυνση IP και την υπόλοιπη διαμόρφωση ή είναι επίσης δυνατή η ένδειξη (προαιρετικά) περισσότερων παραμέτρων μέχρι να οριστεί η πλήρης διαμόρφωση:

  1. Dirección MAC (που έχει ήδη αναφερθεί)
  2. Διεύθυνση IP της ασπίδας ή της μονάδας
  3. Διεύθυνση IP διακομιστή DNS (μόνο ένας διακομιστής)
  4. Διεύθυνση IP του πύλη
  5. Καθαρή μάσκα

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

Από τα παραπάνω φαίνεται ότι είναι σαφές ότι τα δεδομένα που αντιπροσωπεύουν διευθύνσεις IP πρέπει να χρησιμοποιούνται αρκετά συχνά, γι' αυτό η βιβλιοθήκη περιλαμβάνει την κλάση Διεύθυνση IP από το οποίο μπορείτε να δημιουργήσετε αντικείμενα διεύθυνσης IP. Οι παράμετροι που το καθορίζουν είναι τα τέσσερα byte μιας διεύθυνσης IPV4

La Διεύθυνση MAC Ορίζεται για αυτήν τη βιβλιοθήκη ως πίνακας 6 byte. Η διεύθυνση MAC είναι (υποτίθεται ότι είναι) ένα μοναδικό αναγνωριστικό στο οποίο τα πρώτα byte υποδεικνύουν τον κατασκευαστή και το μοντέλο και τα τελευταία τη συγκεκριμένη συσκευή. Το ολοκληρωμένο ENC28J60 δεν περιλαμβάνει διεύθυνση MAC εκτός εάν επιλέξετε να αγοράσετε επίσης ένα Ενσωματωμένη διεύθυνση MAC από το Microchip (ή ολόκληρο μπλοκ OUI των διευθύνσεων προς IEEE εάν η λειτουργία των συσκευών είναι αρκετά μεγάλη ώστε να αξίζει τον κόπο). Όταν δεν έχετε διεύθυνση MAC, μπορείτε να εφεύρετε μια, φροντίζοντας να μην έρχεται σε διένεξη με άλλες στο δίκτυο όπου βρίσκεται η συσκευή.

Εάν η διαμόρφωση γίνεται με διακομιστή DHCP αντί "με το χέρι", η λειτουργία localIP() Είναι χρήσιμο να συμβουλευτείτε τη διεύθυνση που έχει εκχωρήσει ο διακομιστής στη μονάδα. Για να ανανεώσετε την εκχωρημένη διεύθυνση (αν έχει λήξει ο αντίστοιχος χρόνος) το Βιβλιοθήκη Ethernet παρέχει τη λειτουργία διατηρούν() που θα ενημερώσει επίσης επιστρέφοντας έναν κωδικό που αντιστοιχεί στην κατάσταση της ανανέωσης:

  1. Η επέμβαση δεν είχε κανένα αποτέλεσμα
  2. Σφάλμα κατά την ανανέωση της διεύθυνσης IP
    Δεν ήταν δυνατή η επέκταση της χρήσης της εκχωρημένης διεύθυνσης IP στον ίδιο διακομιστή
  3. Η διεύθυνση IP ανανεώθηκε με επιτυχία
  4. Η επανασύνδεση διεύθυνσης IP απέτυχε
    Η χρήση της εκχωρημένης διεύθυνσης IP δεν μπορούσε να επεκταθεί σε κανένα διακομιστή
  5. Η διεύθυνση IP εκχωρήθηκε ξανά με επιτυχία

Με τις πληροφορίες που έχετε δει μέχρι τώρα, μπορείτε να γράψετε ένα παράδειγμα για το πώς θα εκκινούσε μια σύνδεση Ethernet διαμορφώνοντας τη διεύθυνση IP μέσω ενός διακομιστή DHCP στο δίκτυο. Το ακόλουθο παράδειγμα κώδικα προσπαθεί να ανανεώνει τη διεύθυνση IP κάθε συγκεκριμένη χρονική περίοδο και αναφέρει το αποτέλεσμα.

Το παρακάτω παράδειγμα εκχωρεί τη διεύθυνση IP και την υπόλοιπη διαμόρφωση με μη αυτόματο τρόπο χρησιμοποιώντας αντικείμενα Διεύθυνση IP για να γίνει πιο άνετο στην ανάγνωση και (στην περίπτωση πιο περίπλοκου κώδικα) για να αποφευχθούν σφάλματα που θα μπορούσαν να προκύψουν εάν η διεύθυνση ήταν (λανθασμένα) γραμμένη κάθε φορά που χρησιμοποιήθηκε.

2. Ξεκινήστε τη σύνδεση σε λειτουργία πελάτη ή διακομιστή

Κατά την εκκίνηση μιας σύνδεσης σε λειτουργία διακομιστή, το μικροελεγχόμενο σύστημα που αναπτύσσεται είναι αυτό που ακούει αιτήματα από άλλα συστήματα. Για να ξεκινήσετε τη σύνδεση ως διακομιστής, χρησιμοποιήστε το EthernetServer() και η θύρα στην οποία θα ακούσει ο διακομιστής υποδεικνύεται ως παράμετρος. EthernetServer() είναι ο κατασκευαστής της τάξης διακομιστή, το οποίο υποστηρίζει όλες τις λειτουργίες Ethernet ως διακομιστής. Αν και το πιο ορθόδοξο είναι να κάνεις μια κλήση στον κατασκευαστή EthernetServer(), δεν είναι ασυνήθιστο να βρείτε μερικά παραδείγματα που χρησιμοποιούν απευθείας την κλάση διακομιστή ή εναλλακτικές βιβλιοθήκες για σύνδεση Ethernet που επιλέγουν να χρησιμοποιήσουν αυτό το σύστημα παρουσίασης.

Η σύνδεση ως πελάτης είναι αυτή που κάνει αιτήματα στο σύστημα διακομιστή, το οποίο τα περιμένει και τα απαντά ανάλογα. Για να ξεκινήσετε μια σύνδεση ως πελάτης, χρησιμοποιήστε EthernetClient() ποιος είναι ο κατασκευαστής της τάξης Πελάτης προέλευση όλων των λειτουργιών Ethernet ως πελάτη.

Σε αντίθεση με ό,τι συμβαίνει με τη λειτουργία διακομιστή, η οποία υποτίθεται ότι λειτουργεί από τη στιγμή που δημιουργείται η κλάση (αν και θα ανταποκρίνεται στους πελάτες μόνο εάν είναι πραγματικά), πρέπει να επαληθεύσετε ότι η σύνδεση πελάτη είναι έτοιμη πριν τη χρησιμοποιήσετε. Το αντικείμενο πελάτη που δημιουργείται κατά την εκκίνηση της σύνδεσης μπορεί να ερωτηθεί για να διαπιστωθεί εάν είναι διαθέσιμο. Για παράδειγμα, οι λειτουργίες ερωτήματος μπορούν να συμπεριληφθούν σε μια δομή if (EthernetClient) για να τα εκτελέσετε μόνο όταν είναι διαθέσιμη η σύνδεση πελάτη.

3. Δημιουργήστε μια σύνδεση ως πελάτης

Όπως έχει ειπωθεί, μόλις δημιουργηθεί η σύνδεση, είναι ο πελάτης που αναλαμβάνει την πρωτοβουλία να κάνει τα ερωτήματα. Ο διακομιστής θα περιμένει αυτήν την πρωτοβουλία και θα απαντήσει ανάλογα. Επομένως, είναι ο πελάτης που συνδέεται με τον διακομιστή, για να το κάνει αυτό χρησιμοποιούμε connect () υποδεικνύοντας τον διακομιστή ως παραμέτρους (τη διεύθυνση IP ή το URL) και το λιμάνι σε αυτόν που ακούει.

Με βάση το αποτέλεσμα της λειτουργίας, η συνάρτηση θα επιστρέψει τις τιμές

  1. (ΕΠΙΤΥΧΙΑ) Η σύνδεση πραγματοποιήθηκε με επιτυχία
  2. Δημιουργία της σύνδεσης
  3. (ΕΛΗΞΕ Ο ΧΡΟΝΟΣ) Το χρονικό όριο έχει παρέλθει χωρίς να δημιουργηθεί σύνδεση
  4. (INVALID_SERVER) Ο διακομιστής δεν βρέθηκε ή δεν αποκρίνεται σωστά
  5. (ΚΟΛΟΒΟΣ) Η σύνδεση διακόπηκε πριν δημιουργηθεί πλήρως
  6. (INVALID_RESPONSE) Η απάντηση διακομιστή είναι εσφαλμένη

Πριν ξεκινήσετε να κάνετε ερωτήματα, είναι απαραίτητο να επαληθεύσετε ότι η σύνδεση είναι λειτουργική με τη λειτουργία συνδεδεμένος() που θα επιστρέψει αληθής εάν είναι ήδη διαθέσιμο ή ψευδής σε διαφορετική περίπτωση.

Το παρακάτω παράδειγμα δείχνει τη σύνδεση ως πελάτη, ελέγχοντας κάθε 10 δευτερόλεπτα εάν υπάρχει σύνδεση με τον διακομιστή (δεν προορίζεται καθόλου να είναι παραγωγική, απλώς για να δείξει τη σύνταξη των συναρτήσεων) κάτι που, παρεμπιπτόντως, ένα παραγωγή web server δεν θα ήθελε πολύ.

4. Αποστολή δεδομένων

Όπως και άλλες πιο γνωστές τάξεις, όπως π.χ Σειράς, και με συγκρίσιμη χρήση, οι κλάσεις Πελάτης y διακομιστή έχουν τις λειτουργίες

  • γράφω(γεγονός) o γράφω(buffer, μήκος)

    Στέλνει πληροφορίες χρησιμοποιώντας το αντικείμενο πελάτη ή διακομιστή από το οποίο γίνεται η κλήση. Η παράμετρος "δεδομένα" είναι μία byte o δεξαμενή ενώ το "buffer" είναι ένας πίνακας από byte o δεξαμενή εκ των οποίων αποστέλλεται ποσό ίσο με "μήκος" Αυτή η συνάρτηση είναι αυτή που χρησιμοποιείται για δυαδικές πράξεις, σε σύγκριση με τις επόμενες δύο που συνήθως δεσμεύονται για την αποστολή κειμένου.

  • αποτύπωμα(δεδομένα, βάση)

    Στέλνει ως πελάτης ή διακομιστής (ανάλογα με την κλάση από την οποία χρησιμοποιείται) τις πληροφορίες που αντιστοιχούν στα "δεδομένα" ως κείμενο. Εάν οι πληροφορίες δεν εκφράζονται ως κείμενο (για παράδειγμα είναι ακέραιος), η προαιρετική παράμετρος "βάση" μπορεί να χρησιμοποιηθεί για την επιλογή της μετατροπής, η οποία θα μπορούσε να είναι μία από τις σταθερές BIN, OCT, DEC ή HEX που υποδεικνύουν, αντίστοιχα. βάσεις που αντιστοιχούν σε δυαδικό (βάση 2), οκταδικό (βάση 8), δεκαδικό (βάση 10) και δεκαεξαδικό (βάση 16)

  • εκτύπωση(δεδομένα, βάση)

    Η λειτουργία είναι πανομοιότυπη με την προηγούμενη εκτός από την αποστολή, μετά τις πληροφορίες που υποδεικνύονται ρητά από την παράμετρο "δεδομένα", μια επιστροφή μεταφοράς (κωδικός 13 που μπορεί να αναπαρασταθεί ως \r) και ένα τέλος γραμμής (κωδικός 10, που μπορεί να είναι αντιπροσωπεύεται από \n) Αυτοί οι κωδικοί αναφέρονται συχνά, αντίστοιχα, με το ακρωνύμιο CR (Carriage Return) και LF (Ροή γραμμής)

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

5. Λήψη δεδομένων

Όπως και στην περίπτωση των πράξεων αποστολής δεδομένων, οι λειτουργίες λήψης είναι συγκρίσιμες με εκείνες των ευρέως χρησιμοποιούμενων Σειράς. Το πρωτόκολλο λήψης είναι επίσης παρόμοιο: ελέγξτε αν υπάρχουν (αρκετά) διαθέσιμα δεδομένα (διαθέσιμος) και σε αυτή την περίπτωση διαβάστε τα


  • διαθέσιμος ()

    Επιστρέφει τον αριθμό των byte που είναι διαθέσιμα για ανάγνωση. Αυτή η συνάρτηση υπάρχει και στις δύο κατηγορίες Πελάτης ως διακομιστή; Στην πρώτη περίπτωση, αναφέρει τον αριθμό των byte που έχει στείλει ο διακομιστής ως απάντηση σε ένα αίτημα και που είναι διαθέσιμος για ανάγνωση από τον πελάτη (ανάγνωση), και στη δεύτερη περίπτωση ο πελάτης (αντικείμενο) που έχει εκτελέσει μια πράξη ή false αν δεν υπάρχει.

  • ανάγνωση()

    Χρησιμοποιείται για την ανάγνωση των πληροφοριών που έχουν ληφθεί. Αυτή η δυνατότητα είναι διαθέσιμη μόνο στην τάξη Πελάτης. Εάν η εφαρμογή που αναπτύσσεται εκπληρώνει το ρόλο του διακομιστή, για να διαβάσετε τις πληροφορίες που έχουν φτάσει, ένα αντικείμενο πελάτη πρέπει να δημιουργηθεί με την απόκριση συνάρτησης διαθέσιμος () συζητήθηκε στην προηγούμενη ενότητα.

Το παρακάτω παράδειγμα είναι ένας "διακομιστής κεφαλαίων" που ακούει στη θύρα 2000 και απαντά σε αιτήματα με ό,τι στάλθηκε με όλα τα κεφαλαία, όταν είναι δυνατόν. Μπορεί να δοκιμαστεί, για παράδειγμα, με PuTTY ή απλά με telnet 2000 Σίγουρα δεν είναι πολύ πρακτικό, σκοπός του είναι μόνο να δείξει πώς να λαμβάνει τα δεδομένα που του στέλνει ένας πελάτης από τον διακομιστή.

6. Τερματίστε τη σύνδεση

Ενώ είναι σύνηθες για μια εφαρμογή διακομιστή να λειτουργεί επ' αόριστον, οι συνδέσεις πελάτη δημιουργούνται, πραγματοποιούνται συνδέσεις και τερματίζονται, επιτρέποντας την ανάκτηση και χρήση πόρων σε άλλες συνδέσεις ή την αφιέρωση σε άλλες χρήσεις του προγράμματος. Η λειτουργία να σταματήσει() της τάξης Πελάτης Χρησιμοποιείται για τον τερματισμό μιας σύνδεσης πελάτη και την απελευθέρωση τυχόν πόρων που χρησιμοποιεί.

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

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

Παράδειγμα ερωτήματος HTTP GET

Για να διευκρινιστούν καλύτερα όλα τα παραπάνω, ένα πιο πλήρες παράδειγμα αιτημάτων περιλαμβάνεται παρακάτω. TCP χρησιμοποιώντας τα αιτήματα GET χρησιμοποιώντας το Πρωτόκολλο HTTP. Στο παράδειγμα, οι τιμές που λαμβάνονται από αναλογικούς αισθητήρες που είναι συνδεδεμένοι σε μια πλακέτα Arduino αποστέλλονται σε έναν διακομιστή web που τις αποθηκεύει σε μια βάση δεδομένων.

Δημοσίευση σχολίου

Μπορεί να έχετε χάσει