Ethernet i AVR–y, cz.7.pdf

(2032 KB) Pobierz
102-104_enut_cz7.indd
KURS
Ethernet i AVR–y
Ethernet od podstaw, część 7
Duża część systemów mikroprocesorowych musi mieć dostęp
do aktualnej daty i godziny. Niestety wiąże się to z okresowym
ustawianiem i korygowaniem wskazań zegara RTC. Jeśli połączymy
nasze urządzenie z Internetem, możemy zapomnieć o tej przykrej
konieczności. W ostatnim odcinku kursu zajmiemy się zatem
funkcjami związanymi z czasem w systemie Nut/OS.
Czas w systemie Nut/OS
Jednym z powodów stosowania
systemów operacyjnych na mikro-
kontrolerach jest uniezależnienie
(w pewnym stopniu) oprogramo-
wania od sprzętu. Oznacza to, że
niektóre peryferia programuje się
identycznie na wszystkich architek-
turach sprzętowych obsługiwanych
przez system. W Nut/OS przykła-
dem takiej niezależności są funk-
cje obsługujące zegar czasu rze-
czywistego. Ponadto są one zgodne
z ich „pecetowymi” odpowiednika-
mi znajdującymi się w standardo-
wej bibliotece języka C.
Zacznijmy od pobierania aktual-
nej daty i godziny – wykonuje się
to w następujący sposób:
rza czas jako liczbę 100–nanose-
kundowych cykli od początku roku
1601). Choć takie formaty wydają
się nieco dziwne, ułatwiają odmie-
rzanie zadanych odstępów czasu.
Druga linia kodu przekształca
wartość zwróconą przez funkcję
time() na postać bardziej zro-
zumiałą dla człowieka – struktu-
rę _ tm , której składowe opisane
są w ramce poniżej. Funkcja lo-
caltime() zwraca datę i godzinę
w lokalnej strefie czasowej. Ponie-
waż zegar przechowuje czas UTC,
konieczne jest ustawienie właści-
wej strefy czasowej. Do tego celu
służy zmienna globalna _timezo-
ne, zawierająca różnicę w sekun-
dach między lokalną strefą czaso-
wą a czasem uniwersalnym.
W Polsce jest to –1 godzina,
czyli –3600 sekund. Należy pamię-
tać o poprawnym zainicjowaniu _
timezone w swoim programie.
System Nut/OS obsługuje rów-
nież automatyczną zmianę czasu
letniego na zimowy i vice versa.
Sterują tym dwie kolejne zmienne
globalne:
_daylight – zapisanie nieze-
rowej wartości powoduje włączenie
automatycznej zmiany czasu,
_dstbias – różnica między
czasem letnim a zimowym w se-
kundach
D o m y ś l -
ne ustawie-
nia zmiennych
_daylight,
_dstbias
poprawne dla
obszaru Polski. Odczytywanie bie-
żącego czasu mamy opanowane,
pora na ustawianie zegara . Polega
to na:
– przekształceniu czasu lokal-
nego ze struktury czas_do_usta-
wienia na czas w formacie POSIX
Time za pomocą funkcji mkti-
me() :
struct _tm czas_do_
ustawienia; // struktura
z czasem, który ma być
ustawiony
time_t t_sec =
mktime(&czas_do_ustawienia);
– ustawieniu zegara za pomocą
funkcji stime()
stime(&t_sec);
time_t t_sec = time(NULL);
struct _tm czas = localtime(&t_sec);
Wywoływana w pierwszej linii
kodu funkcja time() zwraca aktu-
alny czas w postaci liczby sekund
od północy dnia 1 stycznia 1970
czasu uniwersalnego (UTC – Uni-
versal Coordinated Time ). Taka
reprezentacja daty i godziny jest
standardem w systemach unikso-
wych (POSIX Time), a sam sposób
zapisu czasu w postaci liczby cykli,
które upłynęły od określonej daty
początkowej jest wykorzystywa-
ny w niemal wszystkich systemach
operacyjnych (np. Windows odmie-
Protokół SNTP
i synchronizacja zegarów
Na wstępie wspomniałem, że
jeśli połączymy nasze urządzenie
z Internetem, możemy zapomnieć
o ręcznym ustawianiu zegara. Jest
to możliwe dzięki protokołom sie-
ciowym NTP ( Network Time Pro-
tocol ) i jego uproszczonej wersji
SNTP ( Simple Network Time Pro-
tocol ), którego obsługa jest wbu-
dowana w system Nut/OS. Serwery
SNTP nasłuchują na porcie 123
protokołu UDP. Pobranie aktualnej
Format struktury tm przechowującej datę i godzinę:
struct _tm {
int _tm_sec; – sekundy (0…59)
int _tm_min; – minuty (0…59)
int _tm_hours; – godziny (0…23)
int _tm_mday; – dzień miesiąca (1…31)
int _tm_mon; – miesiąc (0 – styczeń, 11 – grudzień)
int _tm_year; – rok (aktualna wartość jest równa 1900 + tm_year)
int _tm_wday; – dzień tygodnia (0 – niedziela)
int _tm_yday; – dzień roku
int _tm_isdst; – wartość niezerowa oznacza czas letni
};
102
Elektronika Praktyczna 6/2007
682288511.411.png 682288511.422.png 682288511.433.png 682288511.444.png
KURS
List. 1. Najistotniejsze fragmenty kodu programu zegara wykorzystującego protokół SNTP (SNTPDemo)
int main(void)
{
initialize();
init_network();
// ustawienie strefy czasowej w sekundach (–1 godzina od czasu GMT)
_timezone = (–1) * 60L * 60L;
LCD_clear();
u_long addr = NutDnsGetHostByName(SNTP_SERVER_ADDR);
NutSNTPStartThread(addr, 300000); // aktualizujemy zegar co 5 minut
for(;;)
{
char LCD_line1[16], LCD_line2[16];
time_t t_sec = time(NULL);
struct _tm *t = localtime(&t_sec);
sprintf(LCD_line1, „Data: %02u.%02u.%u”, t–>tm_mday, t–>tm_mon + 1, 1900 + t–>tm_year);
sprintf(LCD_line2, „Czas: %02u:%02u:%02u”, t–>tm_hour, t–>tm_min, t–>tm_sec);
LCD_clear();
LCD_setpos(0);
LCD_putstring(LCD_line1);
LCD_setpos(40);
LCD_putstring(LCD_line2);
NutSleep(500);
}
}
List. 2. Zmodyfikowany serwer WWW obsługujący uwierzytelnianie użytkowników (fragmenty kodu przykładu HTTPServer-
Auth)
main()
{
initialize();
init_network();
(...)
NutRegisterAsp();
NutRegisterAspCallback(ASP_callback);
NutRegisterCgi(„ledlcd.cgi”, CGI_callback);
// zabezpieczamy haslem katalog cgi–bin zawierający skrypt sterujacy diodami LED i wyswietlaczem.
NutRegisterAuth(„cgi–bin”, „user:haslo”);
// oraz drugi katalog ‘tajne’ zawierajacy strone ze scisle tajnymi informacjami :)
NutRegisterAuth(„tajne”, „user2:haslo2”);
NutThreadCreate(„lcds”, lcd_scrolling, NULL, 256);
for(i=0;i<5;i++)
{
sprintf(str,”httpd%d”,i);
NutThreadCreate(str, httpd_thread, NULL, NUT_THREAD_MAINSTACK);
}
NutThreadSetPriority(254);
for(;;) NutSleep(10000);
}
daty i godziny polega na wysłaniu
pakietu z odpowiednim zapytaniem
i odebraniu odpowiedzi zawierają-
cej aktualny czas UTC. Maksymal-
ne odchylenie odebranego czasu od
wzorca zależy od opóźnienia trans-
misji pakietu przez sieć i zwykle
nie przekracza kilkuset milisekund.
Aby uruchomić synchronizację cza-
su w systemie Nut/OS, wystarczy
wywołać funkcję:
int NutSNTPStartThread(u_
long server_addr, u_long
interval);
Tworzy ona osobny wątek okre-
sowo korygujący ustawienia zegara
czasu rzeczywistego. Czas jest po-
bierany z serwera SNTP o adresie
server_addr co interval milise-
kund.
Lista publicznych serwerów SNTP
znajduje się między innymi na stro-
nie http://ntp.isc.org/bin/view/Servers/
WebHome . Na list. 1 przedstawio-
no kod prostej aplikacji zegara nie
wymagającego ręcznego ustawiania.
Data i godzina jest pokazywana na
wyświetlaczu alfanumerycznym 2x16
znaków. Program korzysta z serwera
tempus1.gum.gov.pl znajdującego
się w Głównym Urzędzie Miar i syn-
chronizowanego zegarem atomowym.
ślonych katalogów strony interneto-
wej za pomocą hasła. Aby urucho-
mić mechanizm uwierzytelniania,
należy podczas inicjacji serwera
HTTP skorzystać z funkcji:
int NutRegisterAuth(CONST
char *dirname, CONST char
*login) .
Parametr dirname to nazwa
zabezpieczonego katalogu, lo-
gin – nazwa użytkownika i hasło
rozdzielone dwukropkiem. Hasła
są przesyłane przez przeglądarkę
do serwera w postaci jawnej i mo-
gą być podsłuchane. Serwer HTTP
wbudowany w Nut/OS nie obsluguje
polaczen szyfrowanych, dlatego nie
powinno się go stosować w aplika-
cjach wymagających wysokiego pozio-
mu bezpieczeństwa. Zmodyfikowany
Uzupełnienia
Jeden z Czytelników zwrócił
uwagę na pominięcie przeze mnie
jednej z ważnych funkcji ethernuto-
wego serwera HTTP – uwierzytel-
niania użytkowników. Pozwala ono
na zabezpieczenie dostępu do okre-
Elektronika Praktyczna 6/2007
103
682288511.001.png
KURS
kod serwera WWW z czwartej części
kursu, w którym zmiana stanu diod
LED i napisu na wyświetlaczu wyma-
ga uwierzytelnienia użytkownika (do-
myślnie – user: user , hasło: haslo )
znajduje się na list. 2 .
ZL9AVR+ZL1ETH, powstała w 2002
roku. Wówczas w Polsce niepodziel-
nie królowały układy z rodziny
AVR. Od tego czasu minęło 5 lat
(w elektronice to cała epoka, albo
i dwie...). Dziś 32–bitowe mikrokon-
trolery z rdzeniami ARM są łatwo
dostępne i bardzo tanie, a ich moc
obliczeniowa pozwala na realizowa-
nie znacznie ciekawszych aplikacji
niż przedstawione w ramach ni-
niejszego kursu. Przykładami mogą
być obiornik internetowych sta-
cji radiowych oraz radiowęzeł lub
system monitoringu wykorzystujący
do transmisji danych sieć Ethernet.
Niektóre z nich już niebawem zoba-
czycie na łamach EP.
Życzę powodzenia w realizowa-
niu własnych aplikacji dla systemu
Nut/OS!
Tomasz Włostowski, EP
tomasz.wlostowski@ep.com.pl
Podsumowanie – co po AVR–
ach?
Pierwsza wersja oryginalnego
zestawu Ethernut, której odpowied-
nikiem jest nasz kursowy zestaw
Prenumerata e-wydania
Elektronikę Praktyczną możesz czytać na monitorze swego komputera
w postaci identycznej z wydaniem papierowym!
wbudowane linki
klikasz i jesteś na odpowiedniej stronie WWW
hipertekstowy spis treści i wyszukiwarka
od razu znajdziesz to, czego szukasz
wygodne archiwum
czyli poprzednie wydania pod ręką
multimedia
animacje, dźwięk, wideo
E-prenumeratę można zamawiać (na www.ep.com.pl/eprenumerata
lub www.avt.pl/eprenumerata) na 6, 12 lub 24 wydania w cenie odpowiednio:
6,20 zł, 5,70 zł i 5,20 zł za wydanie (patrz str. 141)
2x gratis! Prenumeratorzy wydania papierowego otrzymują za darmo również e-prenumeratę
Jedno okazowe e-wydanie archiwalne można zamówić za darmo tytułem próby
Elektronika Praktyczna 6/2007
104
682288511.012.png 682288511.023.png 682288511.034.png 682288511.045.png 682288511.056.png 682288511.067.png 682288511.078.png 682288511.089.png 682288511.100.png 682288511.111.png 682288511.122.png 682288511.133.png 682288511.144.png 682288511.155.png 682288511.166.png 682288511.177.png 682288511.188.png 682288511.199.png 682288511.210.png 682288511.221.png 682288511.232.png 682288511.243.png 682288511.254.png 682288511.265.png 682288511.276.png 682288511.287.png 682288511.298.png 682288511.309.png 682288511.320.png 682288511.331.png 682288511.342.png 682288511.353.png 682288511.364.png 682288511.375.png 682288511.386.png 682288511.397.png 682288511.398.png 682288511.399.png 682288511.400.png 682288511.401.png 682288511.402.png 682288511.403.png 682288511.404.png 682288511.405.png 682288511.406.png 682288511.407.png 682288511.408.png 682288511.409.png 682288511.410.png 682288511.412.png 682288511.413.png 682288511.414.png 682288511.415.png 682288511.416.png 682288511.417.png 682288511.418.png 682288511.419.png 682288511.420.png 682288511.421.png 682288511.423.png 682288511.424.png 682288511.425.png 682288511.426.png 682288511.427.png 682288511.428.png 682288511.429.png 682288511.430.png 682288511.431.png 682288511.432.png 682288511.434.png 682288511.435.png 682288511.436.png 682288511.437.png 682288511.438.png 682288511.439.png 682288511.440.png 682288511.441.png 682288511.442.png 682288511.443.png 682288511.445.png 682288511.446.png 682288511.447.png 682288511.448.png 682288511.449.png 682288511.450.png 682288511.451.png 682288511.452.png 682288511.453.png 682288511.454.png 682288511.002.png 682288511.003.png 682288511.004.png 682288511.005.png 682288511.006.png 682288511.007.png 682288511.008.png 682288511.009.png 682288511.010.png 682288511.011.png 682288511.013.png 682288511.014.png 682288511.015.png 682288511.016.png 682288511.017.png 682288511.018.png 682288511.019.png 682288511.020.png 682288511.021.png 682288511.022.png 682288511.024.png 682288511.025.png 682288511.026.png 682288511.027.png 682288511.028.png 682288511.029.png 682288511.030.png 682288511.031.png 682288511.032.png 682288511.033.png 682288511.035.png 682288511.036.png 682288511.037.png 682288511.038.png 682288511.039.png 682288511.040.png 682288511.041.png 682288511.042.png 682288511.043.png 682288511.044.png 682288511.046.png 682288511.047.png 682288511.048.png 682288511.049.png 682288511.050.png 682288511.051.png 682288511.052.png 682288511.053.png 682288511.054.png 682288511.055.png 682288511.057.png 682288511.058.png 682288511.059.png 682288511.060.png 682288511.061.png 682288511.062.png 682288511.063.png 682288511.064.png 682288511.065.png 682288511.066.png 682288511.068.png 682288511.069.png 682288511.070.png 682288511.071.png 682288511.072.png 682288511.073.png 682288511.074.png 682288511.075.png 682288511.076.png 682288511.077.png 682288511.079.png 682288511.080.png 682288511.081.png 682288511.082.png 682288511.083.png 682288511.084.png 682288511.085.png 682288511.086.png 682288511.087.png 682288511.088.png 682288511.090.png 682288511.091.png 682288511.092.png 682288511.093.png 682288511.094.png 682288511.095.png 682288511.096.png 682288511.097.png 682288511.098.png 682288511.099.png 682288511.101.png 682288511.102.png 682288511.103.png 682288511.104.png 682288511.105.png 682288511.106.png 682288511.107.png 682288511.108.png 682288511.109.png 682288511.110.png 682288511.112.png 682288511.113.png 682288511.114.png 682288511.115.png 682288511.116.png 682288511.117.png 682288511.118.png 682288511.119.png 682288511.120.png 682288511.121.png 682288511.123.png 682288511.124.png 682288511.125.png 682288511.126.png 682288511.127.png 682288511.128.png 682288511.129.png 682288511.130.png 682288511.131.png 682288511.132.png 682288511.134.png 682288511.135.png 682288511.136.png 682288511.137.png 682288511.138.png 682288511.139.png 682288511.140.png 682288511.141.png 682288511.142.png 682288511.143.png 682288511.145.png 682288511.146.png 682288511.147.png 682288511.148.png 682288511.149.png 682288511.150.png 682288511.151.png 682288511.152.png 682288511.153.png 682288511.154.png 682288511.156.png 682288511.157.png 682288511.158.png 682288511.159.png 682288511.160.png 682288511.161.png 682288511.162.png 682288511.163.png 682288511.164.png 682288511.165.png 682288511.167.png 682288511.168.png 682288511.169.png 682288511.170.png 682288511.171.png 682288511.172.png 682288511.173.png 682288511.174.png 682288511.175.png 682288511.176.png 682288511.178.png 682288511.179.png 682288511.180.png 682288511.181.png 682288511.182.png 682288511.183.png 682288511.184.png 682288511.185.png 682288511.186.png 682288511.187.png 682288511.189.png 682288511.190.png 682288511.191.png 682288511.192.png 682288511.193.png 682288511.194.png 682288511.195.png 682288511.196.png 682288511.197.png 682288511.198.png 682288511.200.png 682288511.201.png 682288511.202.png 682288511.203.png 682288511.204.png 682288511.205.png 682288511.206.png 682288511.207.png 682288511.208.png 682288511.209.png 682288511.211.png 682288511.212.png 682288511.213.png 682288511.214.png 682288511.215.png 682288511.216.png 682288511.217.png 682288511.218.png 682288511.219.png 682288511.220.png 682288511.222.png 682288511.223.png 682288511.224.png 682288511.225.png 682288511.226.png 682288511.227.png 682288511.228.png 682288511.229.png 682288511.230.png 682288511.231.png 682288511.233.png 682288511.234.png 682288511.235.png 682288511.236.png 682288511.237.png 682288511.238.png 682288511.239.png 682288511.240.png 682288511.241.png 682288511.242.png 682288511.244.png 682288511.245.png 682288511.246.png 682288511.247.png 682288511.248.png 682288511.249.png 682288511.250.png 682288511.251.png 682288511.252.png 682288511.253.png 682288511.255.png 682288511.256.png 682288511.257.png 682288511.258.png 682288511.259.png 682288511.260.png 682288511.261.png 682288511.262.png 682288511.263.png 682288511.264.png 682288511.266.png 682288511.267.png 682288511.268.png 682288511.269.png 682288511.270.png 682288511.271.png 682288511.272.png 682288511.273.png 682288511.274.png 682288511.275.png 682288511.277.png 682288511.278.png 682288511.279.png 682288511.280.png 682288511.281.png 682288511.282.png 682288511.283.png 682288511.284.png 682288511.285.png 682288511.286.png 682288511.288.png 682288511.289.png 682288511.290.png 682288511.291.png 682288511.292.png 682288511.293.png 682288511.294.png 682288511.295.png 682288511.296.png 682288511.297.png 682288511.299.png 682288511.300.png 682288511.301.png 682288511.302.png 682288511.303.png 682288511.304.png 682288511.305.png 682288511.306.png 682288511.307.png 682288511.308.png 682288511.310.png 682288511.311.png 682288511.312.png 682288511.313.png 682288511.314.png 682288511.315.png 682288511.316.png 682288511.317.png 682288511.318.png 682288511.319.png 682288511.321.png 682288511.322.png 682288511.323.png 682288511.324.png 682288511.325.png 682288511.326.png 682288511.327.png 682288511.328.png 682288511.329.png 682288511.330.png 682288511.332.png 682288511.333.png 682288511.334.png 682288511.335.png 682288511.336.png 682288511.337.png 682288511.338.png 682288511.339.png 682288511.340.png 682288511.341.png 682288511.343.png 682288511.344.png 682288511.345.png 682288511.346.png 682288511.347.png 682288511.348.png 682288511.349.png 682288511.350.png 682288511.351.png 682288511.352.png 682288511.354.png 682288511.355.png 682288511.356.png 682288511.357.png 682288511.358.png 682288511.359.png 682288511.360.png 682288511.361.png 682288511.362.png 682288511.363.png 682288511.365.png 682288511.366.png 682288511.367.png 682288511.368.png 682288511.369.png 682288511.370.png 682288511.371.png 682288511.372.png 682288511.373.png 682288511.374.png 682288511.376.png 682288511.377.png 682288511.378.png 682288511.379.png 682288511.380.png 682288511.381.png 682288511.382.png 682288511.383.png 682288511.384.png 682288511.385.png 682288511.387.png 682288511.388.png 682288511.389.png 682288511.390.png 682288511.391.png 682288511.392.png 682288511.393.png 682288511.394.png 682288511.395.png 682288511.396.png
Zgłoś jeśli naruszono regulamin