Połączenie Ethernet TCP z Arduino

Połączenie Ethernet TCP z Arduino

Połączenie Ethernet TCP z Arduino

Z punktu widzenia oprogramowania, nawiązanie połączenia Ethernet z Arduino To bardzo proste. Aby to zrobić, użyj Biblioteka Ethernetowa. Ta biblioteka jest przeznaczona dla Osłona Ethernet który opiera się na zintegrowanej W5100, ale istnieją inne różne płyty lub moduły i/lub które wykorzystują inne zintegrowane, takie jak ENC28J60. Aby uprościć jego użycie i zwiększyć kompatybilność, inne biblioteki używają (prawie) tego samego API że Biblioteka Ethernetowa, wystarczy zastąpić bibliotekę alternatywną oryginalną lub dołączyć ją (jeśli nazwa jest inna) w jej miejsce, nawet jeśli w kodzie zastosowano te same (lub bardzo podobne) funkcje. W moim przypadku używam tzw Biblioteka UIPEthernet de Norberta Truchsess postępując zgodnie z tym samym procesem, który opiszę w tym tekście.

Moduł ENC28J60 do użytku z biblioteką UIPEthernet

1. Zdefiniuj połączenie Ethernet

Niezależnie od tego, czy zamierzasz przyjąć rolę klient jak ten Serwer, przede wszystkim musisz zdefiniować połączenie z funkcją zaczynać () który można przekazać jako parametr tylko Adres MAC i poczekaj na serwer DHCP w sieci przypisz a adres IP i resztę konfiguracji lub można także wskazać (opcjonalnie) więcej parametrów aż do zdefiniowania pełnej konfiguracji:

  1. Dirección MAC (o czym już wspomniano)
  2. Adres IP osłony lub modułu
  3. Adres IP serwera DNS (tylko jeden serwer)
  4. Adres IP Przejście
  5. Maska sieciowa

Wskazane jest wskazanie wszystkich parametrów, chyba że ich odliczenie jest zwykłe, aby uniknąć nieprawidłowej konfiguracji (np. bramka nie jest pierwszym adresem sieci).

Z powyższego wynika, że ​​dane reprezentujące adresy IP muszą być wykorzystywane dość często, dlatego w bibliotece znajduje się klasa Adres IP z którego można utworzyć instancję obiektów adresów IP. Parametry, które to definiują, to cztery bajty adresu IPV4

La Adres MAC Jest ona zdefiniowana dla tej biblioteki jako tablica 6-bajtowa. Adres MAC jest (ma być) unikalnym identyfikatorem, w którym pierwsze bajty wskazują producenta i model, a ostatnie konkretne urządzenie. Zintegrowany ENC28J60 nie zawiera adresu MAC, chyba że zdecydujesz się na zakup również Zintegrowany adres MAC firmy Microchip (lub cały blok TAK adresów do IEEE jeśli liczba urządzeń jest na tyle duża, że ​​jest to opłacalne). Jeśli nie masz adresu MAC, możesz go wymyślić, uważając, aby nie kolidował z innymi adresami w sieci, w której znajduje się urządzenie.

Jeśli konfiguracja odbywa się za pomocą serwera DHCP, a nie „ręcznie”, funkcja lokalny adres IP() Warto sprawdzić adres, który serwer przypisał modułowi. Aby odnowić przydzielony adres (jeśli upłynął odpowiedni czas), należy kliknąć Biblioteka Ethernetowa zapewnia tę funkcję utrzymywać() który poinformuje również, zwracając kod odpowiadający statusowi odnowienia:

  1. Operacja nie przyniosła żadnego efektu
  2. Błąd podczas odnawiania adresu IP
    Nie można było przedłużyć wykorzystania przypisanego adresu IP na tym samym serwerze
  3. Adres IP został pomyślnie odnowiony
  4. Ponowne przypisanie adresu IP nie powiodło się
    Nie można było rozszerzyć wykorzystania przypisanego adresu IP na żadnym serwerze
  5. Adres IP został pomyślnie przypisany

Na podstawie dotychczasowych informacji można napisać przykład inicjowania połączenia Ethernet poprzez skonfigurowanie adresu IP za pośrednictwem serwera DHCP w sieci. Poniższy przykładowy kod próbuje odnawiać adres IP co określony czas i raportuje wynik.

Poniższy przykład przypisuje adres IP i resztę konfiguracji ręcznie za pomocą obiektów Adres IP aby uczynić go wygodniejszym do odczytania i (w przypadku bardziej złożonego kodu) aby uniknąć błędów, które mogłyby wystąpić w przypadku (błędnego) wpisania adresu przy każdym jego użyciu.

2. Uruchom połączenie w trybie klienta lub serwera

Podczas inicjowania połączenia w trybie serwera opracowywany jest mikrokontrolowany system, który nasłuchuje żądań z innych systemów. Aby rozpocząć połączenie jako serwer, użyj Serwer Ethernet() a port, na którym serwer będzie nasłuchiwał, jest wskazany jako parametr. Serwer Ethernet() jest konstruktorem klasy serwer, który obsługuje wszystkie operacje Ethernet jako serwer. Chociaż najbardziej ortodoksyjną rzeczą jest wykonanie połączenia z konstruktorem Serwer Ethernet(), nierzadko można znaleźć przykłady, które bezpośrednio korzystają z tej klasy serwer lub alternatywne biblioteki dla połączenia Ethernet, które korzystają z tego systemu instancji.

Połączenie jako klient to takie, które wysyła żądania do systemu serwera, który na nie czeka i odpowiednio na nie odpowiada. Aby nawiązać połączenie jako klient, użyj Klient Ethernet() jaki jest konstruktor klasy klientem początek wszystkich operacji Ethernet jako klient.

W przeciwieństwie do tego, co dzieje się w trybie serwera, który zakłada, że ​​działa od momentu utworzenia instancji klasy (chociaż będzie odpowiadać klientom tylko wtedy, gdy rzeczywiście tak jest), przed użyciem należy sprawdzić, czy połączenie klienta jest gotowe. Do obiektu klienta tworzonego po zainicjowaniu połączenia można wysłać zapytanie, czy jest dostępny. Na przykład operacje zapytań mogą być zawarte w strukturze if(Klient Ethernet) aby wykonać je tylko wtedy, gdy połączenie klienta jest dostępne.

3. Nawiąż połączenie jako klient

Jak już powiedziano, po utworzeniu połączenia to klient przejmuje inicjatywę w zakresie wysyłania zapytań. Serwer będzie czekał na tę inicjatywę i odpowiednio zareaguje. To zatem klient łączy się z serwerem, w tym celu korzystamy połączyć() wskazanie serwera jako parametrów (adres IP lub URL) A port w tym, który słucha.

Na podstawie wyniku operacji funkcja zwróci wartości

  1. (POWODZENIE) Połączenie nawiązane pomyślnie
  2. Nawiązywanie połączenia
  3. (PRZEKROCZONO LIMIT CZASU) Upłynął limit czasu i nie nawiązano połączenia
  4. (NIEPRAWIDŁOWY_SERWER) Serwer nie został znaleziony lub nie odpowiada poprawnie
  5. (KADŁUBOWY) Połączenie zostało zerwane, zanim zostało w pełni nawiązane
  6. (INVALID_RESPONSE) Odpowiedź serwera jest nieprawidłowa

Przed przystąpieniem do zadawania zapytań należy sprawdzić, czy połączenie z funkcją działa połączony() to powróci prawdziwy jeśli jest już dostępny lub fałszywy Inaczej.

Poniższy przykład ilustruje połączenie jako klient, sprawdzający co 10 sekund, czy istnieje połączenie z serwerem (nie ma to być nic produktywnego, tylko pokazanie składni funkcji) coś, co swoją drogą produkcyjny serwer WWW nie chciałby zbyt wiele.

4. Wyślij dane

Podobnie jak inne, bardziej znane klasy, takie jak Seryjnyi przy porównywalnym zastosowaniu, klasy klientem y serwer mieć funkcje

  • napisać(fakt) o napisać(bufor, długość)

    Wysyła informacje za pomocą obiektu klienta lub serwera, z którego są wywoływane. Parametr „data” jest pojedynczy bajt o zwęglać podczas gdy „bufor” jest tablicą bajt o zwęglać z czego wysyłana jest kwota równa „długości". Ta funkcja jest używana do operacji binarnych, w porównaniu do dwóch kolejnych, które są zwykle zarezerwowane do wysyłania tekstu.

  • (Baza danych)

    Wysyła jako klient lub serwer (w zależności od klasy z której jest używany) informację odpowiadającą „danym” w postaci tekstowej. Jeśli informacja nie jest wyrażona w formie tekstowej (np. jest to liczba całkowita), opcjonalny parametr „base” może zostać użyty do wybrania konwersji, którą może być jedna ze stałych BIN, OCT, DEC lub HEX wskazujących odpowiednio. podstawy odpowiadające binarnemu (podstawa 2), ósemkowemu (podstawa 8), dziesiętnemu (podstawa 10) i szesnastkowemu (podstawa 16)

  • drukuj(Baza danych)

    Operacja jest identyczna jak poprzednia, z wyjątkiem wysłania, po informacji wyraźnie wskazanej przez parametr „data”, powrotu karetki (kod 13, który można przedstawić jako \r) i końca linii (kod 10, który można reprezentowane przez \n) Kody te są często określane odpowiednio za pomocą akronimu CR (powrót przewozu) i LF (podawanie liniowe)

Trzy poprzednie funkcje zwracają liczbę wysłanych bajtów, podobnie jak równoważne funkcje tej klasy Seryjny; Jak powiedziano powyżej, działanie jest porównywalne.

5. Odbierz dane

Podobnie jak w przypadku operacji wysyłania danych, operacje odbioru są porównywalne z operacjami powszechnie stosowanymi Seryjny. Protokół odbioru jest również podobny: sprawdź, czy dostępnych jest (wystarczająca) ilość danych (dostępny) i w takim razie je przeczytaj


  • dostępny ()

    Zwraca liczbę bajtów dostępnych do odczytania. Funkcja ta występuje w obu klasach klientem jako serwer; W pierwszym przypadku raportuje liczbę bajtów, które serwer wysłał w odpowiedzi na żądanie i które są dostępne do odczytania przez klienta (czytać), a w drugim przypadku klient (obiekt), który wykonał operację lub false, jeśli jej nie ma.

  • czytać()

    Służy do odczytywania otrzymanych informacji. Ta funkcja jest dostępna tylko na zajęciach klientem. Jeżeli tworzona aplikacja pełni rolę serwera, aby odczytać otrzymaną informację należy utworzyć instancję obiektu klienta z odpowiedzią funkcji dostępny () omówione w poprzedniej sekcji.

Poniższy przykład to „serwer z dużymi literami”, który nasłuchuje na porcie 2000 i, jeśli to możliwe, odpowiada na żądania, przesyłając wszystko, co zostało wysłane, pisane wielkimi literami. Można to przetestować np PuTTY lub po prostu z telnet 2000 Z pewnością nie jest to zbyt praktyczne, ma na celu jedynie pokazanie, w jaki sposób można uzyskać z serwera dane przesyłane do niego przez klienta.

6. Zakończ połączenie

Chociaż zwykle aplikacja serwerowa działa w nieskończoność, połączenia klienckie są nawiązywane, nawiązywane i kończone, co pozwala na odzyskanie zasobów i wykorzystanie ich w innych połączeniach lub przeznaczenie ich do innych zastosowań programu. Funkcja zatrzymać() klasy klientem Służy do zakończenia połączenia klienta i zwolnienia wykorzystywanych przez niego zasobów.

W przypadku serwera fakt, że klient kończy połączenie po wysłaniu lub odebraniu obiektu informacyjnego zapytania, umożliwia mu także zwolnienie zasobów w celu przydzielenia ich do innych połączeń lub innych celów. Krótko mówiąc, choć wydaje się to drobnostką, wskazane jest zakończenie połączenia po zakończeniu operacji klienta.

Inną dobrą praktyką podczas kończenia połączenia klienta jest opróżnienie pliku z którego korzysta klasa. Aby to zrobić, dostępna jest funkcja spłukać() powinien zostać wywołany po zakończeniu połączenia klienta z zatrzymać()

Przykład zapytania HTTP GET

Aby lepiej wyjaśnić powyższe, poniżej znajduje się pełniejszy przykład żądań. TCP za pomocą żądań GET za pomocą Protokół HTTP. W przykładzie wartości uzyskane przez czujniki analogowe podłączone do płytki Arduino przesyłane są do serwera WWW, który przechowuje je w bazie danych.

Zamieść komentarz

Być może przegapiłeś