Ethernet-TCP-Verbindung mit Arduino

Ethernet-TCP-Verbindung mit Arduino

Ethernet-TCP-Verbindung mit Arduino

Aus softwaretechnischer Sicht der Aufbau einer Verbindung Ethernet mit Arduino Es ist sehr einfach. Verwenden Sie dazu die Ethernet-Bibliothek. Diese Bibliothek ist für a konzipiert Ethernet-Abschirmung die auf dem Integrierten basiert W5100, aber es gibt auch andere Boards oder Module und/oder die andere integrierte Boards verwenden, wie zum Beispiel das ENC28J60. Um die Verwendung zu vereinfachen und die Kompatibilität zu erhöhen, verwenden andere Bibliotheken (fast) dasselbe API dass Ethernet-Bibliothek, müssen Sie lediglich die alternative Bibliothek durch die ursprüngliche ersetzen oder sie (wenn der Name anders ist) an ihrer Stelle einbinden, auch wenn im Code dieselben (oder sehr ähnliche) Funktionen verwendet werden. In meinem Fall verwende ich das UIPEthernet-Bibliothek de Norbert Truchsess Ich folge dem gleichen Prozess, den ich in diesem Text beschreiben werde.

ENC28J60-Modul zur Verwendung mit der UIPEthernet-Bibliothek

1. Definieren Sie die Ethernet-Verbindung

Ob Sie die Rolle übernehmen werden Kunde wie Server, müssen Sie zunächst den Zusammenhang mit der Funktion definieren begin () Das kann nur als Parameter übergeben werden MAC-Adresse und warte auf einen Server DHCP im Netzwerk eine zuweisen IP Adresse und der Rest der Konfiguration oder es ist auch möglich, (optional) weitere Parameter anzugeben, bis die vollständige Konfiguration definiert ist:

  1. MAC-Adresse (was bereits erwähnt wurde)
  2. IP-Adresse des Schirms oder Moduls
  3. Server-IP-Adresse DNS (nur ein Server)
  4. IP-Adresse des Tor
  5. Netzmaske

Es empfiehlt sich, alle Parameter anzugeben, sofern es sich nicht um die übliche Ableitung handelt, um zu vermeiden, dass die Konfiguration nicht korrekt ist (z. B. dass das Gateway nicht die erste Adresse des Netzwerks ist).

Aus dem oben Gesagten scheint klar zu sein, dass Daten, die IP-Adressen darstellen, recht häufig verwendet werden müssen, weshalb die Bibliothek die Klasse enthält IP Adresse von dem aus IP-Adressobjekte instanziiert werden sollen. Die ihn definierenden Parameter sind die vier Bytes einer Adresse IPV4

La MAC-Adresse Es ist für diese Bibliothek als 6-Byte-Array definiert. Die MAC-Adresse ist (soll) eine eindeutige Kennung, bei der die ersten Bytes den Hersteller und das Modell angeben und die letzten das spezifische Gerät angeben. Das Integrierte ENC28J60 beinhaltet keine MAC-Adresse, es sei denn, Sie entscheiden sich für den Kauf einer Integrierte MAC-Adresse von Microchip (oder ein ganzer Block Ja von Adressen an IEEE wenn die Anzahl der Geräte groß genug ist, dass es sich lohnt). Wenn Sie keine MAC-Adresse haben, können Sie eine erfinden und dabei darauf achten, dass es nicht zu Konflikten mit anderen im Netzwerk kommt, in dem sich das Gerät befindet.

Erfolgt die Konfiguration mit einem DHCP-Server statt „von Hand“, ist die Funktion localIP() Es ist hilfreich, die Adresse abzufragen, die der Server dem Modul zugewiesen hat. Zur Erneuerung der zugewiesenen Adresse (sofern die entsprechende Zeit abgelaufen ist) die Ethernet-Bibliothek stellt die Funktion bereit pflegen() Dies informiert Sie auch durch die Rückgabe eines Codes, der dem Status der Verlängerung entspricht:

  1. Die Operation hatte keine Wirkung
  2. Fehler beim Erneuern der IP-Adresse
    Die Nutzung der zugewiesenen IP-Adresse auf demselben Server konnte nicht verlängert werden
  3. IP-Adresse erfolgreich erneuert
  4. Die Neubindung der IP-Adresse ist fehlgeschlagen
    Die Nutzung der zugewiesenen IP-Adresse konnte auf keinem Server erweitert werden
  5. IP-Adresse erfolgreich neu zugewiesen

Mit den bisher angezeigten Informationen können Sie ein Beispiel dafür schreiben, wie eine Ethernet-Verbindung durch die Konfiguration der IP-Adresse über einen DHCP-Server im Netzwerk initiiert wird. Der folgende Beispielcode versucht, die IP-Adresse in jedem bestimmten Zeitraum zu erneuern und meldet das Ergebnis.

Das folgende Beispiel weist die IP-Adresse und die restliche Konfiguration manuell mithilfe von Objekten zu IP Adresse um die Lesbarkeit zu erhöhen und (bei komplexerem Code) Fehler zu vermeiden, die auftreten könnten, wenn die Adresse bei jeder Verwendung (falsch) geschrieben wird.

2. Starten Sie die Verbindung im Client- oder Servermodus

Beim Initiieren einer Verbindung im Servermodus ist es das mikrogesteuerte System, das entwickelt wird, das auf Anfragen von anderen Systemen lauscht. Um die Verbindung als Server zu starten, verwenden Sie EthernetServer() und der Port, an dem der Server lauscht, wird als Parameter angegeben. EthernetServer() ist der Konstruktor der Klasse Server, der als Server alle Ethernet-Operationen unterstützt. Obwohl es am orthodoxesten ist, den Konstruktor anzurufen EthernetServer(), ist es nicht ungewöhnlich, einige Beispiele zu finden, die die Klasse direkt verwenden Server oder alternative Bibliotheken für Ethernet-Verbindungen, die sich für die Verwendung dieses Instanziierungssystems entscheiden.

Die Verbindung als Client ist diejenige, die Anfragen an das Serversystem stellt, das auf diese wartet und sie entsprechend beantwortet. Um als Client eine Verbindung herzustellen, verwenden Sie EthernetClient() Was ist der Konstruktor der Klasse? Kunden Ursprung aller Ethernet-Operationen als Client.

Im Gegensatz zum Servermodus, von dem angenommen wird, dass er ab dem Moment der Instanziierung der Klasse funktioniert (obwohl er nur dann auf Clients antwortet, wenn dies tatsächlich der Fall ist), müssen Sie vor der Verwendung überprüfen, ob die Clientverbindung bereit ist. Das Client-Objekt, das beim Initiieren der Verbindung erstellt wird, kann abgefragt werden, um festzustellen, ob es verfügbar ist. Beispielsweise können Abfrageoperationen in eine Struktur eingebunden werden if(EthernetClient) um sie nur auszuführen, wenn die Client-Verbindung verfügbar ist.

3. Stellen Sie als Client eine Verbindung her

Sobald die Verbindung hergestellt ist, ist es, wie bereits erwähnt, der Kunde, der die Initiative ergreift und die Anfragen stellt. Der Server wartet auf diese Initiative und reagiert entsprechend. Es ist also der Client, der eine Verbindung zum Server herstellt, und dazu verwenden wir verbinden () Angabe des Servers als Parameter (die IP-Adresse oder die URL) Und der Port in dem, der zuhört.

Basierend auf dem Ergebnis der Operation gibt die Funktion die Werte zurück

  1. (ERFOLG) Verbindung erfolgreich aufgebaut
  2. Herstellen der Verbindung
  3. (TIMED_OUT) Timeout ist abgelaufen, ohne dass eine Verbindung hergestellt wurde
  4. (INVALID_SERVER) Der Server wurde nicht gefunden oder antwortet nicht richtig
  5. (GEKÜRZT) Die Verbindung wurde getrennt, bevor sie vollständig hergestellt wurde
  6. (UNGÜLTIGE ANTWORT) Die Serverantwort ist falsch

Bevor mit der Durchführung von Abfragen begonnen wird, muss überprüft werden, ob die Verbindung mit der Funktion funktionsfähig ist in Verbindung gebracht() das wird wiederkommen was immer dies auch sein sollte. ob es bereits verfügbar ist oder falsch Andernfalls.

Das folgende Beispiel veranschaulicht die Verbindung als Client, der alle 10 Sekunden überprüft, ob eine Verbindung zum Server besteht (es soll nichts Produktives sein, sondern nur die Syntax der Funktionen zeigen), etwas, das übrigens Ein Produktions-Webserver würde nicht sehr gefallen.

4. Daten senden

Wie andere bekanntere Klassen, wie z Seriellund bei vergleichbarer Verwendung die Klassen Kunden y Server die Funktionen haben

  • schreiben(Tatsache) o schreiben(Puffer, Länge)

    Sendet Informationen mithilfe des Client- oder Serverobjekts, von dem aus sie aufgerufen werden. Der Parameter „data“ ist ein einzelner Byte o verkohlen während „Puffer“ ein Array von ist Byte o verkohlen Davon wird ein Betrag entsprechend „Länge“ gesendet. Diese Funktion wird für binäre Operationen verwendet, im Vergleich zu den nächsten beiden, die normalerweise für das Senden von Text reserviert sind.

  • drucken(Daten, Basis)

    Sendet als Client oder Server (abhängig von der Klasse, aus der er verwendet wird) die zu „Daten“ gehörenden Informationen als Text. Wenn die Informationen nicht als Text ausgedrückt werden (z. B. handelt es sich um eine Ganzzahl), kann der optionale Parameter „base“ verwendet werden, mit dem die Konvertierung ausgewählt werden kann. Dabei kann es sich um eine der Konstanten BIN, OCT, DEC oder HEX handeln, die jeweils angeben . Die Basen entsprechen Binär (Basis 2), Oktal (Basis 8), Dezimal (Basis 10) und Hexadezimal (Basis 16).

  • System.out.println(Daten, Basis)

    Der Vorgang ist mit dem vorherigen identisch, außer dass nach den durch den Parameter „data“ ausdrücklich angegebenen Informationen ein Wagenrücklauf (Code 13, der als \r dargestellt werden kann) und ein Zeilenende (Code 10, der als „\r“ dargestellt werden kann) gesendet werden dargestellt durch \n) Diese Codes werden häufig jeweils mit dem Akronym bezeichnet CR (Carriage Return) und LF (Zeilenvorschub)

Die drei vorherigen Funktionen geben die Anzahl der gesendeten Bytes zurück, ebenso wie die entsprechenden Funktionen der Klasse Seriell; Wie oben erwähnt, ist die Bedienung vergleichbar.

5. Daten empfangen

Wie bei den Datensendevorgängen sind auch die Empfangsvorgänge mit denen der weit verbreiteten Daten vergleichbar Seriell. Auch das Empfangsprotokoll ist ähnlich: Prüfen Sie, ob (genügend) Daten verfügbar sind (verfügbar) und in diesem Fall lesen Sie sie


  • verfügbar ()

    Gibt die Anzahl der Bytes zurück, die zum Lesen verfügbar sind. Diese Funktion ist in beiden Klassen vorhanden Kunden als Server; Im ersten Fall wird die Anzahl der Bytes gemeldet, die der Server als Antwort auf eine Anfrage gesendet hat und die dem Client zum Lesen zur Verfügung stehen (lesen) und im zweiten Fall der Client (Objekt), der eine Operation ausgeführt hat, oder false, wenn keine vorhanden ist.

  • lesen()

    Es dient zum Auslesen der empfangenen Informationen. Diese Funktion ist nur im Unterricht verfügbar Kunden. Wenn die zu entwickelnde Anwendung die Rolle eines Servers erfüllt, muss zum Lesen der angekommenen Informationen ein Client-Objekt mit der Antwort der Funktion instanziiert werden verfügbar () im vorherigen Abschnitt besprochen.

Das folgende Beispiel ist ein „Caps-Server“, der Port 2000 überwacht und auf Anfragen mit dem gesendeten Text antwortet, wenn möglich in Großbuchstaben. Es kann zum Beispiel getestet werden mit PuTTY oder einfach mit telnet 2000 Es ist sicherlich nicht sehr praktisch, sein Zweck besteht lediglich darin, zu zeigen, wie man die von einem Client an ihn gesendeten Daten vom Server erhält.

6. Beenden Sie die Verbindung

Während es für eine Serveranwendung üblich ist, unbegrenzt zu funktionieren, werden Client-Verbindungen hergestellt, Verbindungen hergestellt und beendet, sodass Ressourcen wiederhergestellt und in anderen Verbindungen verwendet oder für andere Verwendungszwecke des Programms reserviert werden können. Die Funktion halt() der Klasse Kunden Es wird verwendet, um eine Clientverbindung zu beenden und alle verwendeten Ressourcen freizugeben.

Für den Server ermöglicht die Tatsache, dass der Client die Verbindung beendet, wenn das Informationsobjekt der Anfrage gesendet oder empfangen wurde, ihm auch, Ressourcen freizugeben, um sie anderen Verbindungen oder anderen Zwecken zuzuweisen. Kurz gesagt: Obwohl es unbedeutend erscheint, ist es ratsam, die Verbindung zu beenden, wenn der Betrieb des Clients endet.

Eine weitere gute Vorgehensweise beim Beenden einer Clientverbindung besteht darin, die zu leeren dass die Klasse verwendet. Hierzu steht die Funktion zur Verfügung Flush () sollte nach Beendigung der Client-Verbindung mit aufgerufen werden halt()

Beispiel für eine HTTP-GET-Abfrage

Um alle oben genannten Punkte besser zu verdeutlichen, finden Sie unten ein ausführlicheres Beispiel für Anfragen. TCP Verwenden der GET-Anfragen mithilfe der Protokoll HTTP. Im Beispiel werden die von an ein Arduino-Board angeschlossenen analogen Sensoren ermittelten Werte an einen Webserver gesendet, der sie in einer Datenbank speichert.

Geben Sie Anmerkung

Sie können vermisst haben