poniedziałek, 2 grudnia 2019

PIC32MM i moduł Ethernetowy Wiznet W5500 - serwer TCP/IP, zajęcia praktyczne cz.2

W części pierwszej zajęć praktycznych pokazałem działanie mini-serwera UDP. W tym wpisie zajmiemy  się kolejną dostępną opcją w module W5500 firmy Wiznet .Rozbudujemy nasz program z części 1 o funkcjonalność mini-serwera TCP. Nasz mini-serwer będzie na każde wysłane do niego zapytanie klienta z sieci lokalnej reagował wysłaniem kodu HTML. Do czego to może się przydać ? Mnie do głowy przychodzi pomysł np. realizacja ustawienia/konfiguracji jakiegoś urządzenia za pomocą przeglądarki www. Nie musimy wtedy angażować do tego celu wyświetlacza i interakcji z użytkownikiem do niego. W artykule pokażę jak zrealizować funkcję mini-serwera TCP przy pomocy modułu W5500 firmy Wiznet.




Baza sprzętowa , programowa i połączenia  identyczne jak w  artykule części 1. Program na GitHub-ie został już zaktualizowany do tego artykułu czyli części 2.
 
Moduł ethernetowy W5500 firmy Wiznet ze sprzętowym stosem TCP/IP jest unikalnym na rynku modułem tego typu. Inne popularne moduły ethernetowe takie jak np. ENC28J60 firmy Microchip czy nowszy ENC424J600 nie posiadają stosu TCP/IP a to oznacza , że musimy go implementować w MCU co jest zdecydowanie mniej wygodnym rozwiązaniem.  Jedyną zaletą stosu programowego jest możliwość obsługi większej ilości gniazd ale w typowych zastosowaniach IoT nie ma to aż tak dużego znaczenia. Warto też wspomnieć , że firma Wiznet ma w ofercie moduł obsługujący adresację IPv6. No dobrze wiemy , że nasz moduł W5500 jest wyjątkowy, zatem poczynimy kawałek kodu aby uzyskać w nim funkcjonalność serwera TCP/IP.

W tym przypadku nie robię oddzielnego projektu tylko do programu z części 1 dodaję funkcję TCP_Server() , która wywoływana w pętli głównej programu realizuje nam całą funkcjonalność serwera TCP/IP.


Ponieważ serwer będzie zwracał klientowi sieciowemu kod HTML dlatego musimy dodać do programu dwie tablice , jedna z nich reprezentuje odpowiedź do klienta jaką protokół sieciowy wymaga po wywołaniu przez klienta naszego serwera , druga tablica jest kodem HTML reprezentującym obraz strony www :


Nasz serwer TCP/IP będzie łączył się na porcie 5000 , jego adres to 192.168.8.220. Gniazdo jakiego będzie używał do połączenia ma numerek 0.
Postać wywołania naszego serwera z przeglądarki będzie wyglądać zatem tak 192.168.8.220:5000 .Przyjrzyjmy się jak skonstruowana jest funkcja TCP_Server().




Funkcja swoje działanie opiera na monitorowaniu stanu rejestru statusu gniazda Sn_SR (Socket n Status Register), w naszym przypadku gniazda nr 0.


W zależności od stanu w jakim jest gniazdo za pomocą konstrukcji języka C , switch/case wywoływany jest odpowiedni fragment kodu. Na początku mamy stan w którym gniazdo nie jest otwarte i wówczas działanie programu w funkcji TCP_Server() zostanie przekierowane do fragmentu kodu jak poniżej w którym otwieramy gniazdo nr 0 na porcie 5000 w trybie TCP:


Jeśli gniazdo zostanie otwarte, kolejnym fragmentem kodu w którym się znajdziemy będzie kod inicjalizujący nasłuch na porcie nr 0 :


Mamy otwarte gniazdo, moduł W5500 nasłuchuje na nim, czekamy aż  jakiś klient podłączy się swoją "wtyczką" do naszego gniazda jeśli to nastąpi, realizowany jest poniższy fragment kodu w którym następuje odczyt danych od klienta i wysłanie mu treści naszej strony www w postaci kodu HTML.


Jeśli połączenie zostanie zerwane i gniazdo zamknięte nastąpi od początku wykonanie całej procedury. Zerknijmy na efekt działania naszego serwera czyli wywołanie jego przez klienta sieciowego za pomocą przeglądarki :


Generalnie odpowiedź naszego serwera powinna nastąpić po zapytanie typu GET , pomijam ten aspekt bo to każdy "sieciomaniak" wie :). Poniżej dwa obrazki z Putty. Na pierwszym obrazku stan modułu sieciowego W5500 po inicjalizacji i otwarciu gniazd nr 0 i 1. Na drugim widzimy zapytanie jakie wysłał nam klient na nasz serwer TCP , w odpowiedzi na to wysłaliśmy klientowi najpierw zawartość tablicy HTTP_ok[] a potem HTTP_web[]





Serwer działa bez zająknięcia. W programie mamy równocześnie otwarty serwer UDP i TCP.

W linkach poniżej znajduje się projekt , który wgrałem na GitHub. Sciągamy go do MPLABX-IDE za pomocą Team --> Remote --> Clone lub w konsoli Linuxa :

git clone https://github.com/PICmajster/PIC32MM_W5500.git

Moduł i program działają doskonale. Miłej zabawy :)

W następnym wpisie będziemy się zajmować ciekawszymi rzeczami czyli komunikacją z wybraną chmurą. Nie wiem czy mi się uda ale narazie zakładam, że tak :)


Pozdrawiam
picmajster.blog@gmail.com



Linki :

Program na GitHub - mini TCP i UDP serwer



Brak komentarzy:

Prześlij komentarz