TCP IP i mikrokontrolery, cz.3.pdf

(618 KB) Pobierz
tcp_cz3.indd
K U R S
Przykłady zastosowań TCP/IP
w mikrokontrolerach , część 3
W poprzednim odcinku kursu
dowiedzieliśmy się, jak można wy-
słać i odebrać wiadomość e–mail. To
jednak nie wszystko. Tematyka po-
ruszona w tym odcinku będzie nie
mniej frapująca, bo oto za chwilę
będziemy potrafili „wystawić” wła-
sny serwer internetowy.
Listingi do artykułu
są umieszczone na płycie
CD-EP6/2006B oraz na stronie
http://download.ep.com.pl
Aplikacja pracująca jako
prosty serwer zapytań
mogących obsłużyć do 4
klientów równocześnie
Serwerem można uznać aplikację,
która odpowiada na zapytania klien-
tów. Opisywany w artykule moduł
TCP/IP może pracować jako serwer
potrafiący obsłużyć jednocześnie do
4 klientów. Klienci mogą wysyłać
zapytania do serwera o czas, datę
oraz żądać rozłączenia. Do symula-
cji klientów zostanie wykorzystany
program easytcpip.exe, który umoż-
liwia dołączenie do 2 klientów. Na
list. 5 przedstawiono program reali-
zujący prosty serwer zapytań. Dzia-
ła on w nieskończonej pętli, przy
czym w wewnętrznej pętli instrukcją
socketstat sprawdzany jest status ko-
lejno każdego z 4 gniazd. Jeżeli sta-
tus informuje o zamknięciu danego
gniazda ( Sock_closed ), wykonywana
jest instrukcja getsocket , która otwie-
ra gniazdo o zadanym numerze na
porcie 5500. Kolejna instrukcja soc-
ketlisten , której parametrem jest nu-
mer gniazda, służy do otwarcia da-
nego gniazda w trybie serwera. Wy-
konanie tej instrukcji powoduje, że
wybrane gniazdo będzie nasłuchiwać
Jak mówi stare przysłowie: „co dwie głowy to nie jedna”. A gdy
głów tych będą tysiące, a nawet miliony? Aż strach pomyśleć.
Tymczasem taką globalną siłę intelektu mamy dziś w zasięgu
ręki, ba – nawet z niej korzystamy. Wszystko za pośrednictwem
terabajtów informacji, które w każdej sekundzie przesyłane są
olbrzymią siecią informatyczną oplatającą całą kulę ziemską.
portu wybranego wcześniej instruk-
cją getsocket . Jednocześnie można
otworzyć do 4 gniazd. W pierwszej
fazie działania programu zostają
otworzone 4 gniazda w trybie ser-
wera. Warto zauważyć że gniazda
są otwierane po sprawdzeniu czy
nie ma połączenia z danym gniaz-
dem. Po otwarciu danego gniazda
zerowana jest odpowiadająca mu
flaga Flags.idx . Po przyłączeniu się
klienta do serwera sprawdzany jest
stan tej flagi dla gniazda, do które-
go dołączył się klient. Jeśli jest wy-
zerowana, serwer wysyła do klienta
komunikat powitalny, po czym flaga
jest ustawiana, aby komunikat powi-
talny nie był już wysyłany. Serwer
reaguje na trzy polecenia otrzyma-
ne od klienta. Są to:
time , date i exit . Jeśli
dane zostały wysła-
ne od klienta z wyko-
rzystaniem instrukcji
getdstip , do zmien-
nej LONG zwracany
jest adres IP klienta.
Umożliwia to rozpo-
znanie klienta, od któ-
rego otrzymano dane.
Informacje o kliencie
zostają wysłane do
terminala przez RS232,
przy czym adres IP
klienta zostaje sforma-
Rys. 11. Postać informacji wysłanych
przez mikrokontroler do terminala
podczas pracy układu w roli serwera
towany do postaci tekstowej z wy-
korzystaniem funkcji Ip2str . W dal-
szej części programu rozpoznawane
jest polecenie otrzymane od klienta.
Jeśli jest to exit , wysyłany jest do
klienta komunikat rozłączenia, po
czym wykonywana jest instrukcja
closesocket zamykająca gniazdo, do
którego był dołączony klient. Jeśli
otrzymano polecenie time , wysyłany
jest do danego klienta przykładowy
czas, a jeśli było to polecenie data ,
wysyłana jest przykładowa data.
Skonfigurowanie modułu TCP/IP do
pracy jako serwer jest dosyć proste.
Na rys. 10 pokazano widok dzia-
łania programu easytcpip tworzące-
go 2 klientów. W programie należy
podać adres IP serwera oraz port,
na którym będą łączyć się klien-
ci. Przykładowo po połączeniu wi-
Rys. 10. Okno programu easytcpip tworzącego 2
klientów
104
Elektronika Praktyczna 6/2006
649299783.007.png 649299783.008.png 649299783.009.png 649299783.010.png 649299783.001.png
K U R S
Rys. 12. Okno programu easytcpip pracującego
w roli serwera na porcie 5500
Następuje także łączenie
otwartego gniazda (klien-
ta) do serwera o numerze
IP 192.168.1.2 i porcie
5500. Rezultat otwarcia
gniazda, jak i połączenia
są wysyłane do termina-
la przez interfejs RS232.
Po wykonaniu tej pętli
z serwerem połączonych
będzie 4 klientów. Je-
śli z terminala zostanie
odebrany znak o kodzie ASCII 013
(Enter), klient 0 i 1 wyślą polecenie
time , na które serwer zwróci czas.
Klient 2 wyśle polecenie exit , na
które serwer odłączy go od siebie.
Klient 3 wyśle polecenie who , na
które dostanie odpowiedź o tym, kto
jest dołączony do ser-
wera. W tym przypadku
dołączonych będzie 3
klientów, bo klient 2
wysłał polecenie roz-
łączenia. Do wysyła-
nia poleceń do serwera
wykorzystano instrukcję
tcpwritestr , która różni
się od instrukcji tcpw-
rite tym, że przesyła
dane tekstowe. Przy
ostatnim parametrze 255
instrukcja sama doda
do wysyłanych danych
znaki potwierdzenia
CR+LF. Przy ostatnim
parametrze 0 nie będą
dodawane znaki CR+LF.
Po wysłaniu zapytań
do serwera, w kolejnej
pętli For wykonywanej
dla każdego z klientów,
sprawdzany jest status
połączenia i jeśli serwer
wysłał do danego klienta dane, są
one odbierane i wysyłane do termi-
nala przez RS232 wraz z informa-
cją o numerze klienta. Połączenie
z klientami kończy się w podobny
sposób jak w poprzednich aplika-
cjach, z wykorzystaniem
instrukcji closesocket . Na
rys. 12 pokazano wi-
dok działania programu
easytcpip pracującego
w roli serwera na porcie
5500. Widać że przy-
łączyło się do niego 4
klientów, którzy wysłali
wcześniej opisane za-
pytania, przy czym po
wysłaniu zapytania exit
przez klienta 2 został on
rozłączony. Na rys. 13
przedstawiono informacje wysłane
przez mikrokontroler do terminala
podczas pracy układu w roli klienta.
Po podłączeniu klientów do serwe-
ra, serwer także wysłał do nich ko-
munikaty powitalne. Widać w nich
także jakie informacje dany klient
otrzymał od serwera po wysłaniu
zapytania. W przypadku zapytania
who serwer zwrócił do klienta 3
informację o połączonych z nim (ser-
werem) klientach. Tego typu aplika-
cja kliencka może służyć do odbio-
ru informacji od serwera, uzyskiwa-
nych na podstawie zapytań. Serwer
przykładowo może zbierać dane
o temperaturze w kilku miejscach,
którą mogą następnie odczytywać
klienci.
doczny jest komunikat powitalny od
serwera. Klient 1 wysłał zapytanie
o datę, a drugi klient o czas i żądał
rozłączenia. Na rys. 11 przedstawio-
no informacje wysłane przez mi-
krokontroler do terminala podczas
pracy układu w roli serwera. Widać
w nich adres IP dołączonych klien-
tów oraz wysyłane przez nich do
serwera zapytania. Tego typu apli-
kacja może służyć przykładowo do
zbierania danych, o które może py-
tać wielu klientów (jednocześnie 4).
Aplikacja pracująca jako
klient wysyłający zapytania do
serwera
Moduł TCP/IP może pracować
także jako klient, czyli pełnić funk-
cję aplikacji łączącej się do serwe-
ra. Klientem można uznać aplikację,
która wysyła zapytania do serwera.
W ramach tego przykładu zostanie
przedstawiony program, który two-
rzy 4 klientów wysyłających do ser-
wera zapytania takie jak: time , exit
lub who . Wysyłanie zapytań jest
możliwe przez RS232 z poziomu
terminala. Serwer, do którego łączyć
się będą klienci został utworzony
przy pomocy programu easytcpip .
Na list. 6 przedstawiono program
realizujący aplikację pracującą jako
klient. W pierwszej kolejności nastę-
puje otwarcie 4 gniazd kolejno na
portach 1001, 1002, 1003 i 1004.
Jest to zrealizowane w pętli For
wykonywanej dla każdego z gniazd.
Rys. 14. Okno programu easytcpip pracującego
z protokołem UDP
Aplikacja komunikująca
się przez protokół
bezpołączeniowy UDP (prosty
CHAT)
Protokół UDP umożliwia do-
starczanie danych bez gwarancji
odbioru. Obciążenie przesyłanych
danych informacjami dodatkowymi
jest niewielkie. Nie ma w tym pro-
tokole żadnego mechanizmu spraw-
dzającego czy aplikacja docelowa
otrzymała przesyłkę. UDP zapewnia
wyłącznie prostą sumę kontrolną.
Pomimo braku mechanizmu spraw-
dzającego protokół UDP ma pew-
ne zalety, których nie ma protokół
TCP. W sieciach, w których nie ma
problemów z dostarczaniem danych,
wykorzystanie protokołu UDP wy-
wołuje mniejszy ruch. Komunika-
Rys. 13. Postać informacji wysłanych przez mi-
krokontroler do terminala podczas pracy układu
w roli klient
Elektronika Praktyczna 6/2006
105
649299783.002.png 649299783.003.png 649299783.004.png 649299783.005.png
K U R S
Rys. 15. Postać informacji wysłanych
przez mikrokontroler do terminala
podczas pracy układu z protokołem
UDP
sprawdzane jest czy są jakieś dane
do odebrania. W przypadku wyko-
rzystania tej instrukcji w protoko-
le UDP zwracana wartość zawsze
będzie większa o 8 bajtów (o wiel-
kość nagłówka). Jeśli takowe dane
są, zostają odebrane za pomocą
instrukcji udpread , której pierwszy
parametr to numer gniazda, dru-
gim jest zmienna, do której mają
być zapisane odebrane dane. Ostat-
ni parametr określa liczbę odbiera-
nych danych. Odbierane są wszyst-
kie dane łącznie z nagłówkiem,
który składa się z 8 bajtów. Jeśli
odbierane dane są zapisywane do
zmiennej tekstowej, instrukcja bę-
dzie odbierać dane aż do napotka-
nia znaków potwierdzenia (CR+LF).
Instrukcja udpread także rozkodo-
wuje nagłówek i poszczególne jego
składowe umieszcza w zmiennych:
peersize (liczba danych), peerad-
dress (adres IP nadawcy) i Peerport
(port). W programie oprócz danych
otrzymanych, do terminala wysy-
łane są także dane o adresie IP
nadawcy pobranym ze zmiennej
peeraddress , który jest dodatkowo
formatowany za pomocą instrukcji
Ip2str oraz wykorzystywany port.
Podczas wysyłania samych danych
do terminala pomijany jest nagłó-
wek. Wysyłane są tylko dane za
nagłówkiem. Program działa w pę-
tli, na bieżąco sprawdzając czy są
dane do odebrania z terminala lub
nadawcy z wykorzystaniem UDP.
Na rys. 14 pokazano widok dzia-
łania programu easytcpip pracują-
cego z protokołem UDP. W progra-
mie należy wpisać adres odbiorcy
(zestawu Easy TCP/IP) i przycisnąć
przycisk Setup UDP . Na rys. 15
przedstawiono informacje wysłane
przez mikrokontroler do terminala
podczas pracy układu z protokołem
UDP. Na obu rysunkach widać, że
z poziomu programu easytcpip zo-
stał wysłany tekst test1 , a z pozio-
mu programu terminala tekst Test
OK . Wysłane w obu kierunkach
teksty zostały poprawnie odebrane.
Dodatkowo wyświetlana jest infor-
macja o adresie IP nadawcy i wy-
korzystywanym porcie. Prosty w re-
alizacji bezpołączeniowy protokół
UDP można wykorzystać w wielu
prostych aplikacjach. Przykładowo
może to być konwerter LAN<–>
RS232.
Marcin Wiązania, EP
marcin.wiazania@ep.com.pl
cja przy użyciu UDP nie wymaga
nawiązywania sesji. Aplikacja źró-
dłowa jest przygotowana do komu-
nikacji z odpowiednim portem apli-
kacji docelowej. Jeżeli potrzebuje
odpowiedzi, dołącza swój adres
i port do nagłówka UDP. Nagłówek
UDP składa się z 8 bajtów, w któ-
rych znajduje się port docelowy,
źródłowy, liczba danych i suma
kontrolna. Popularną aplikacją wy-
korzystującą UDP jest serwer DNS.
W opisywanym niżej przykładzie
protokół UDP posłuży do realizacji
prostego CHAT–a, w którym jedną
stroną będzie zestaw Easy TCP/IP,
a drugą stroną komputer z urucho-
mionym programem easytcpip . Ko-
munikacja z Easy TCP/IP będzie
się odbywać za pomocą interfejsu
RS232 i komputerowego terminala.
Na list. 7 przedstawiono program
realizujący komunikację z wykorzy-
staniem bezpołączeniowego proto-
kołu UDP. W pierwszej kolejności
w programie otwierane jest gniazdo
instrukcją getsocket wykorzystujące
port 5000. Gniazdo otwierane jest
w trybie Sock_dgrm wymaganym
przez protokół UDP. Po otwarciu
gniazda program przechodzi do
wykonywania nieskończonej pę-
tli, w której znajdują się instrukcje
wysyłające i odbierające dane za
pomocą protokołu UDP. Wysłanie
danych z poziomu zestawu Easy
TCP/IP jest możliwe za pomocą
interfejsu RS232 i komputerowego
terminala, a z poziomu komputera
za pomocą programu easytcpip . Po
otrzymaniu danych z komputerowe-
go terminala potwierdzonych ente-
rem, są one wysyłane przez UDP
za pomocą instrukcji udpwritestr .
Pierwszym parametrem jest ad-
res IP odbiorcy (w tym przypadku
192.168.1.2). Kolejnymi parametra-
mi są: port, numer gniazda, nazwa
zmiennej, z której dane są wysyła-
ne oraz liczba wysyłanych bajtów.
Przy liczbie bajtów równej 0, wy-
syłane są wszystkie dane zmiennej.
Za pomocą instrukcji socketstat ,
106
Elektronika Praktyczna 6/2006
649299783.006.png
Zgłoś jeśli naruszono regulamin