Redakcja: Dondu
W dzisiejszych czasach nikt z nas nie wyobraża sobie życia bez zamków i kluczy, a zakupów w supermarkecie bez kodów kreskowych. Co jednak łączy te dwa tematy? I gdzie ich powiązanie z elektroniką?
Odpowiedź na pierwsze pytanie będzie jednocześnie tematem całych naszych wspólnych rozważań, a mianowicie brzmi ona: RFID. Co jednak kryje się pod tymi czterema tajemniczymi literami? Z języka Angielskiego to skrót Radio Frequency IDentifiaction, czyli w wolnym tłumaczeniu „identyfikacja za pomocą fal radiowych”.
Już chyba teraz każdy przypomniał sobie o „białych magicznych kartach” otwierających drzwi po zbliżeniu do czytnika czy nowoczesnych zbliżeniowych kartach płatniczych, albo karnetach na stokach, basenach czy biletach okresowych w komunikacji miejskiej, chipach identyfikacyjnych dla zwierząt, czy tych wszczepianych ludziom jako „karty płatnicze”.
Niektórzy z Was może słusznie wskażą na systemy zabezpieczające przed kradzieżą jako kolejne przykłady wykorzystania systemów RFID, a dociekliwsi wspomną o eksperymentalnych „metkach”, które mogłyby być „kasowane” poprzez przejazd wózka przez odpowiednią bramkę.
W moim artykule postaram się więc przybliżyć tę z jednej strony nie najnowszą, ale z drugiej strony bardzo szybko rozwijającą się i przyszłościową technologię, opisać zasadę działania takich kart, a także przedstawić pokrótce szeroki wachlarz ich zastosowań.
W artykule przedstawiam także kompletny projekt oparty o mikrokontroler ATMega328P wraz z plikami źródłowymi programu.
Wszystkie przedstawione w niniejszym artykule informacje mają jedynie charakter informacyjny i powstały w celach naukowych na podstawie ogólnodostępnych informacji. Autor nie ponosi odpowiedzialności za ich wykorzystanie, a także przypomina, iż wykorzystanie niektórych przedstawionych tu informacji poza laboratorium może być niezgodne z prawem.
Szczypta historii i trochę teorii
Technologie RFID wywodzą się od bardzo prostego i dobrze znanego zagadnienia wykrywania metali, nad którym prace prowadzono od lat 40-stych XX w. Warto wspomnieć że jeden z pierwszych działających wykrywaczy metali został zbudowany w czasach II Wojny Światowej przez dwóch polskich poruczników.
Zasada działania takiego wykrywacza jest w gruncie rzeczy niezmiernie prosta – przepływ prądu zmiennego przez cewkę powoduje powstanie wokół niej zmiennego pola magnetycznego, to zaś z kolei, jak wiemy z lekcji fizyki, powoduje indukcję prądów wirowych w umieszczonych w polu metalowych przedmiotach.
Skoro w nich też zaczyna płynąć prąd, to także powoduje on powstanie wokół przedmiotu pola magnetycznego, które, zgodnie z regułami fizyki, osłabia pole w cewce i wpływa na przepływ prądu przez nią. Wykrywanie tych zmian pozwala nam w dużym uproszczeniu stwierdzić czy w polu magnetycznym wytwarzanym przez cewkę znajduje się jakiś kawałek metalu czy nie.
Prądy wirowe indukowane w elementach metalowych umieszczonych w zmiennym polu magnetycznym umożliwiają ich wykrycie za pomocą wykrywaczy metali. źródło: www.physics.sjsu.edu |
Stąd już niedaleka droga do znanych każdemu bramek antykradzieżowych obecnych w każdym supermarkecie. Jedyną różnicą zasady ich działania w stosunku do zwykłego wykrywacza metali jest to, iż częstotliwość z jaką zmienia się pole magnetyczne jest ściśle dopasowania do częstotliwości rezonansowej cewki (a dokładniej ujmując układu cewka-kondensator) umieszczonej w nalepce (czy ogólnie mówiąc dowolnym tagu), w taki sposób, że wykrywane są tylko zmiany pola powstałe w wyniku umieszczenia w nim (nie zdezaktywowanego w kasie) tagu – inne elementy metalowe nie są wykrywane.
Nalepka zabezpieczająca zawiera cewkę, która pozwala na jej wykrycie przy wykorzystaniu ściśle określonej częstotliwości zmian pola magnetycznego. Źródło: en.wikipedia.org |
A teraz wprowadźmy jeszcze jedną małą modyfikację – niech nasza „metka” nie emituje jedynie wtórnej „fali”, ale niech także, dzięki układowi scalonemu, odpowiednio moduluje (zmienia parametry) tą falę i w ten sposób (skoro już byliśmy wstanie odróżnić obecność metalu do jej braku, a potem wykryć tylko konkretną cewkę) przesłać z naszej metki informacje do anten. Tym sposobem doszliśmy do istoty działania bardziej zaawansowanych systemów RFID, więc pora na poznanie konkretów.
Czas na praktykę
Standardy RFID
O ile zasada działania kart i sposób transmisji informacji jest w przypadku wszystkich rozwiązań taki sam, o tyle metoda kodowania, a także same przesyłane dane i możliwości komunikacyjne poszczególnych standardów kart są bardzo różnorodne. Nie sposób wymienić tu wszystkich z nich, dlatego przedstawię kilka najpopularniejszych.
UNIQUE 125kHz
To najprostszy ze stosowanych standardów kart. Częstotliwością nośną jest częstotliwość 125kHz, a karta przechowuje jedynie swój 40-sto bitowy numer seryjny programowany podczas produkcji w fabryce. Teoretycznie numery kart nie powinny się powtarzać, ale na dzień dzisiejszy istnieją na świecie karty o dublujących się numerach.
Q5
Karty podobne do UNIQUE 125 kHz posiadające dodatkową pamięć EEPROM możliwą do wielokrotnego programowania przez użytkownika (także dzięki modulacji fal radiowych, tym razem przez antenę nadawczo-odbiorczą urządzenia), jednak rozwiązanie to jest stosunkowo rzadko spotykane. Pamięć w takich kartach jest chroniona hasłem – bez jego podania jej odczyt lub modyfikacja są niemożliwe.
Hitag
Standard także wykorzystujący częstotliwość nośną 125kHz i udostępniający pamięć EEPROM, jednak posiadający bardziej rozbudowane możliwości w stosunku do wcześniej wymienionych kart – np. możliwość szyfrowania danych i system antykolizyjny (w przypadku transponderów UNIQUE i Q5 jeśli w polu czytnika umieścimy 2 karty, to żadna informacja nie zostanie odczytana – dane z obu kart będą się zakłócać, tymczasem standard HITAG, dzięki systemowi antykolizyjnemu umożliwia odczyt wielu znaczników umieszczonych w polu czytnika i indywidualną komunikację z każdym z nich)
Mifare
Częstotliwość nośna to 13,56MHz, jednak w tym standardzie mamy już dostępny szeroki wachlarz możliwości „wewnętrznych” karty, który oferuje między innymi system uwierzytelniania połączenia, szyfrowanie przesyłanych danych i wykonywanie bardziej skomplikowanych operacji. Standard ten stosowany jest między innymi w zbliżeniowych kartach płatniczych, kartach (biletach okresowych) komunikacji miejskiej niektórych miast a także droższych systemach kontroli czasu pracy czy dostępu.
W moim artykule nie mógłbym opisać wszystkich standardów kart zbliżeniowych, gdyż prawdopodobnie wyczerpujący opis samego tylko standardu Mifare w wybranych jego odmianach stworzyłby książkę, dlatego zdecydowałem się na przybliżenie Wam najpopularniejszego, najprostszego i chyba najtańszego (choć nie pozbawionego wad, o czym w dalszej części artykułu) standardu – RFID UNIQUE 125kHz.
UNIQUE 125kHz
To najprostszy ze stosowanych standardów kart. Częstotliwością nośną jest częstotliwość 125kHz, a karta przechowuje jedynie swój 40-sto bitowy numer seryjny programowany podczas produkcji w fabryce. Teoretycznie numery kart nie powinny się powtarzać, ale na dzień dzisiejszy istnieją na świecie karty o dublujących się numerach.
Q5
Karty podobne do UNIQUE 125 kHz posiadające dodatkową pamięć EEPROM możliwą do wielokrotnego programowania przez użytkownika (także dzięki modulacji fal radiowych, tym razem przez antenę nadawczo-odbiorczą urządzenia), jednak rozwiązanie to jest stosunkowo rzadko spotykane. Pamięć w takich kartach jest chroniona hasłem – bez jego podania jej odczyt lub modyfikacja są niemożliwe.
Hitag
Standard także wykorzystujący częstotliwość nośną 125kHz i udostępniający pamięć EEPROM, jednak posiadający bardziej rozbudowane możliwości w stosunku do wcześniej wymienionych kart – np. możliwość szyfrowania danych i system antykolizyjny (w przypadku transponderów UNIQUE i Q5 jeśli w polu czytnika umieścimy 2 karty, to żadna informacja nie zostanie odczytana – dane z obu kart będą się zakłócać, tymczasem standard HITAG, dzięki systemowi antykolizyjnemu umożliwia odczyt wielu znaczników umieszczonych w polu czytnika i indywidualną komunikację z każdym z nich)
Mifare
Częstotliwość nośna to 13,56MHz, jednak w tym standardzie mamy już dostępny szeroki wachlarz możliwości „wewnętrznych” karty, który oferuje między innymi system uwierzytelniania połączenia, szyfrowanie przesyłanych danych i wykonywanie bardziej skomplikowanych operacji. Standard ten stosowany jest między innymi w zbliżeniowych kartach płatniczych, kartach (biletach okresowych) komunikacji miejskiej niektórych miast a także droższych systemach kontroli czasu pracy czy dostępu.
W moim artykule nie mógłbym opisać wszystkich standardów kart zbliżeniowych, gdyż prawdopodobnie wyczerpujący opis samego tylko standardu Mifare w wybranych jego odmianach stworzyłby książkę, dlatego zdecydowałem się na przybliżenie Wam najpopularniejszego, najprostszego i chyba najtańszego (choć nie pozbawionego wad, o czym w dalszej części artykułu) standardu – RFID UNIQUE 125kHz.
Budowa karty RFID
Karta, czy dowolny inny tag RFID składa się, z punktu widzenia laika, z 2 ważnych elementów: cewki (pełniącej jednocześnie rolę elementu zasilającego układ oraz nadawczo-odbiorczego) oraz układu scalonego odpowiedzialnego za funkcjonowanie karty. Przyglądając się całemu systemowi można by narysować następujący uproszczony schemat blokowy naszej karty (odtąd dla jasności będę już używał tego określenia dla wszystkich tagów RFID):
Uproszczony schemat ideowy karty RFID. |
Zasada działania układu jest prosta i zgodna z tym co wcześniej stwierdziliśmy:
1. Zmienne pole magnetyczne indukuje w cewce prąd, który jest wykorzystywany do naładowania małych kondensatorów na tyle, by energii starczyło do wykonania niezbędnych operacji, czyli mówiąc ogólnie do zasilania układu w karcie, która nie posiada żadnego źródła zasilania typu akumulator czy bateria.
2. Poprawnie zasilony układ sterujący może komunikować się z pamięcią, i jednocześnie badać sygnał pochodzący z cewki (np. na jego podstawie generować sygnał zegarowy taktujący wykonywanie kolejnych operacji i nadawanie kolejnych bitów, czy odbierać dane z czytnika/programatora) oraz wpływać na parametry całego obwodu w celu odpowiedniego zaburzenia pola magnetycznego i nadania danych.
W omawianych przez nas szczegółowo kartach UNIQUE układ sterujący na podstawie sygnału częstotliwości nośnej generuje sygnał taktujący nadawanie, a poprzez załączanie lub odłączanie od obwodu cewki dodatkowej rezystancji zmienia natężenie prądu przez nią płynącego, a co za tym idzie zmienia natężenie pola magnetycznego przez nią generowanego (im większy płynie prąd tym pole jest większe). Z kolei silniejsze pole generowane przez cewkę karty powoduje osłabienie pola czytnika i w efekcie sadek amplitudy sygnału elektrycznego w jego cewce – taki stan jest odczytywany jako logiczna 1. Z kolei jeśli pole generowane przez kartę jest słabsze, nie następuje wyraźny spadek amplitudy sygnału nadajnika i odbieramy logiczne 0.
W rzeczywistości karta RFID wygląda tak (na przykładzie karty RFID UNIQUE 125kHz w obudowie ClamShell):
Karta RFID. |
Karta ze zdemontowaną tylną częścią obudowy. Widoczna cewka i układ scalony. |
Układ scalony w powiększeniu – (widok od góry) widoczna kropla tworzywa sztucznego chroniąca delikatną strukturę układu scalonego od strony jego montażu. |
Czytnik kart
Obecnie większość czytników kart RFID udostępnia nam dane odczytane ze zbliżonego tagu za pomocą interfejsu RS232/UART. Rozwiązanie takie jest bardzo proste w obsłudze i nie sprawia prawie żadnych trudności programistycznych – wystarczy tylko podpiąć czytnik do komputera lub procesora, ustawić odpowiednio parametry komunikacji szeregowej i odbierać zdekodowane dane.
Ja jednak chciałbym Wam przedstawić odczyt danych z karty na nieco niższym poziomie. Użyjemy jedynie układu generującego częstotliwość nośną i demodulującego sygnał (zmiany amplitudy, o których pisałem) do postaci cyfrowej. W tej kategorii „czytników”, a raczej demodulatorów RFID UNIQUE bardzo prostym rozwiązaniem jest zastosowanie układu scalonego EM4095 w następującej aplikacji:
Schemat prostego układu demodulatora RFID w oparciu o układ EM4095 |
Opis wyprowadzeń:
ANT – złącza anteny. Podłączamy do nich cewkę o indukcyjności ok. 736 μH lub posiadającą 32 zwoje i średnicę 8 cm
RDY/CLK – złącze na którym dostępny jest w standardzie TTL sygnał nadawany przez antenę (jest to przebieg prostokątny) – do naszych celów pozostawiamy niepodłączony, choć możemy go wykorzystać jako generator odniesienia czasowego przy dekodowaniu sygnału (jak pamiętacie może nadanie jednego bitu zajmuje 64 cykle, których trwanie możemy zliczać z wykorzystaniem tego wyjścia)
DEMOD_OUT – zdemodulowany sygnał odebrany z karty – to wyjście będziemy wykorzystywać do dekodowania jej numeru
MOD – wejście układu EM4095, które umożliwia modulację sygnału nadawanego przez antenę w celu zapisu specjalnych kart. Jako że nie będziemy wykorzystywać tej funkcji podłączamy na stałe to wejście z masą (GND).
SHD – złącze pozwalające na włączenie lub wyłączenie układu i jego reset. Aby zresetować układ należy na tym złączu wygenerować zbocze opadające i utrzymać stan niski.
Możemy także nabyć gotowy i przetestowany moduł z tym układem i anteną wykonaną jako ścieżka na płytce PCB:
Demodulator RFID 125kHz w oparciu o układ EM4095. |
Odczyt i dekodowanie
Kiedy nasz hardware uzupełnimy o niemalże dowolny procesor AVR (ja do testów stosowałem procesor ATMega328p) możemy przystąpić do sedna sprawy – odczytu i dekodowania informacji odebranych z karty. Ale nie od razu Kraków zbudowano, dlatego musimy do sprawy podejść krok po kroku, zdobywając za każdym krokiem nieco więcej informacji.
Na początek przyjrzyjmy się przebiegom z wyjść CLK i DEMOD_OUT:
Wynik próbkowania linii CLK i DEMOD_OUT za pomocą analizatora stanów logicznych. |
Na początku jedyne co możemy stwierdzić to to, że sygnał zegarowy jest przebiegiem prostokątnym o częstotliwości zbliżonej do 125kHz, a długość impulsów wynosi 32 lub 64 cykle zegarowe (jeśli nie wierzycie na słowo – policzcie). Teraz należy sięgnąć do noty katalogowej naszej karty (a konkretnie zawartego w niej układu EM4100), gdzie czytamy (po angielsku rzecz jasna), że dane są kodowane za pomocą kodu Manchester…
Kod Manchester
Kod Manchester jest w rzeczywistości bardzo prostym kodem. Otóż, jeśli rozważymy nadawanie jednego bitu to dla nadawania 1 w połowie cyklu występuje zbocze opadające, a dla nadawania 0 – zbocze narastające. Ilustrują to poniższe rysunki:
Kodowanie Manchester znaków 1 i 0. źródło: en.wikipedia.org |
Jeżeli teraz spojrzymy na większy fragment danych nadawanych z wykorzystaniem tego kodu to zauważymy jego bardzo ciekawą właściwość, pomagającą w jego zdekodowaniu:
Kodowanie Manchester - przebieg 10100111001. źródło: en.wikipedia.org |
Otóż jeśli nadawane są ciągi takich samych bitów (jedynki lub zera) to czas między kolejnymi zboczami zawsze jest równy połowie okresu (w naszym przypadku będą to 32 cykle zegarowe).
Kodowanie Manchester - przebiegi 11111111 i 00000000. źródło: en.wikipedia.org |
Z kolei tylko i wyłącznie w momencie zmiany nadawanego bitu (z 0 na 1 lub z 1 na 0) czas między kolejnymi zboczami jest równy pełnemu okresowi (czyli 64 cykom zegara):
Dekodowanie takiego sygnału będzie zatem dziecinnie proste. Na początku przyjmiemy jakąś wartość nadawanego bitu, np. B=1 (niestety karty, w przeciwieństwie do np. pilotów RC5, nadają dane ciągle, „w kółko”, nie stosując żadnej zależności czasowej dla wskazania początku nadawania pakietu danych) i postępujmy według algorytmu:
Kodowanie Manchester - przebieg 10101010. źródło: en.wikipedia.org |
Dekodowanie takiego sygnału będzie zatem dziecinnie proste. Na początku przyjmiemy jakąś wartość nadawanego bitu, np. B=1 (niestety karty, w przeciwieństwie do np. pilotów RC5, nadają dane ciągle, „w kółko”, nie stosując żadnej zależności czasowej dla wskazania początku nadawania pakietu danych) i postępujmy według algorytmu:
1. Jeśli czas między zboczami wynosi 32 cykle to:
1.a. zwiększ licznik zboczy o 1
1.b. jeśli to parzyste zbocze to zapisz odebrany bit o wartości B
2. Jeśli czas między zboczami wynosi 64 cykle to:
2.a. zwiększ licznik zboczy o 2
2.b. zmień wartość B na przeciwną
2.c. zapisz odebrany bit o wartości B
W taki oto sposób bardzo szybko (na razie ręcznie na ekranie komputera) możemy zdekodować całą ramkę… Ale właśnie… gdzie właściwie zaczyna się i kończy ta ramka, oraz co oznacza ten bezładny ciąg zer i jedynek?
Ramka RFID
Teraz przyszła kolej na poznanie struktury danych przesyłanych przez naszą kartę. Najprościej, podążając za autorem oryginalnych dokumentacji najprościej przedstawić ramkę w następującej formie:
Opis bitów ramki RFID UNIQUE 125kHz. |
Niestety, jak już wcześniej wspomniałem, karty nadają swoje dane w pętli nie stosując żadnego czasowego wyróżnika dla sygnalizowania rozpoczęcia transmisji danych (jak to ma miejsce np. w standardzie RC5). Z tego powodu jedyną możliwością odnalezienia początku naszych danych jest poszukiwanie wśród odebranych dowolnych 64 bitów pierwszego wystąpienia 9-ciu kolejnych bitów o wartości 1.
Dlaczego jednak taka kombinacja w 100% informuje o początku ramki? To bardzo proste. Dzięki bitom parzystości w żadnym innym miejscu nie może wystąpić pod rząd więcej niż 8 bitów o wartości 1 (jeśli nie wierzycie to sprawdźcie sami). Dalej przed bitami startu zawsze nadawany jest bit stopu poprzedniej ramki o wartości 0, a jeśli dane będziemy zawsze przeglądać podążając w prawo to pierwsze wystąpienie 9-ciu jedynek pod rząd daje nam 100% pewność, że natrafiliśmy na nagłówek ramki.
To jednak nie wszystko. Z powodu braku czasowego oznaczenia początku ramki nasze oprogramowanie (które za niedługo będziemy tworzyć) może nie tylko rozpocząć odbiór od dowolnego miejsca pakietu danych (co będzie się zdarzać w 99% przypadków), ale także może rozpocząć dekodowanie kodu Manchester od złego zbocza. W wyniku tego (co też możecie sprawdzić samodzielnie rysując przebieg powstały w wyniku zakodowania jakichś danych i potem rozpoczynając dekodowanie od 2-giego zbocza) otrzymany ciąg bitów będzie zanegowany.
Ponadto, żeby nie było nam zbyt łatwo, transmisja może przebiegać z błędami, o czym będzie nas informować wartość bitu parzystości (mamy błąd w transmisji, jeśli odczytana wartość bitu parzystości jest różna od wyliczonej na podstawie danych).
Zatem czas napisać prosty algorytm dekodowania danych:
- Przesuwaj dane dopóki nie natrafisz na bity startu. Jeśli nie znajdziesz bitów startu przejdź do kroku 4
- Sprawdzamy parzystość pionową i poziomą. Jeśli coś się nie zgadza to przejdź do kroku 4
- Odczytaj dane z ramki i złóż je w pełne bity. Prześlij dane gdzie trzeba i zakończ działanie programu.
- Zaneguj całe dane.
- Przesuwaj dane dopóki nie natrafisz na bity startu. Jeśli nie znajdziesz bitów startu przejdź do kroku 8
- Sprawdzamy parzystość pionową i poziomą. Jeśli coś się nie zgadza to przejdź do kroku 8
- Odczytaj dane z ramki i złóż je w pełne bity. Prześlij dane gdzie trzeba i zakończ działanie programu.
- Nie odebrano prawidłowych danych – spróbuj dokonać ponownie odbioru danych.
I tym oto sposobem… Na razie w teorii… Odczytaliśmy dane z karty i możemy je wykorzystać do identyfikacji osobnika jej używającego. Teraz czas na napisanie właściwego programu na procesor AVR (w przykładzie ATMega328P) wykonującego wszystkie te operacje w mgnieniu oka.
Program odczytujący karty
O ile zapisanie większości omówionych przez nas kroków w formie programu nie powinno stanowić większego problemu (w gruncie rzeczy wszystko sprowadza się do kilku pętli, przesunięć bitowych, paru instrukcji warunkowych i voila), o tyle ciekawe jest zagadnienie pomiaru czasu trwania impulsu. Rzecz jasna moglibyśmy zaangażować do tego cały czas pracy procesora i oczekiwać na kolejne impulsy w pętli i po ich wykryciu zapisywać różnice czasów odmierzone za pomocą timera, jednak całe te działania może za nas wykonać sam timer.
Jeśli ustawimy Timer1 w tryb ICR to wtedy jeśli na odpowiednim wejściu pojawi się zbocze wybrane za pomocą bitu ICES1(opadające lub narastające) wykonane zostanie przerwanie i dodatkowo natychmiast aktualna wartość timera zostanie zapisana do specjalnego rejestru ICR1. Teraz wystarczy tylko od tej wartości odjąć poprzednio zapamiętaną w jakiejś zmiennej, aby obliczyć szerokość impulsu i szybko zmienić wartość bitu ICES1, aby kolejne przerwanie zostało wywołane przez przeciwne zbocze. Tym sposobem, jeśli dodatkowo w przerwaniu będziemy wykrywać odebranie całej potencjalnej paczki 64 bitów i wtedy dokonywać jej dekodowania, cała praca dekodera będzie działała niezależnie od programu głównego i będzie praktycznie niezauważalna – po prostu jeśli ktoś zbliży kartę to w odpowiedniej zmiennej znajdzie się jej numer i zostanie dodatkowo ustawiona flaga informująca o tym, że odebrano jakieś ciekawe informacje.
Poniższy kod przedstawia implementację tego algorytmu w języku C dla procesora ATMega328P. Przerwanie jest wykonywane przy wykryciu każdego zbocza na sygnale wyjściowym DEMOD_OUT z układu EM4095.
Odbiór:
//dekodowanie w przerwaniu ICR1 ISR(TIMER1_CAPT_vect) { static uint16_t LastICR;//ostatnia wartość przechwycenia uint16_t PulseWidth;//szerokość impulsu między zboczami static uint8_t EdgeCt;//licznik zbocz static uint8_t BitCt;//licznik bitów odebranych static uint8_t BitVal;//wartość aktualnie przetwarzanego bitu uint8_t decode_ok;//zmienna tymczasowa pomagająca obsługiwać kontrolę //poprawności danych static uint64_t RFID_tmp;//tymczasowa zmienna do której zapisywane są kolejno odbierane bity PulseWidth = ICR1 - LastICR;//szerokość impulsu LastICR=ICR1;//zapisujemy dane tego zbocza TCCR1B ^= (1<<ICES1);//zmiana zbocza wyzwalającego na przeciwne if(EdgeCt == 0) { //jeśli system dekodowania został wyzerowany BitCt=0;//resetujemy wszystkie zmienne BitVal=1; RFID_tmp=0; } if(PulseWidth < MIN_HALF_BIT || PulseWidth > MAX_BIT) { //impuls za długi lub za krótki-reset dekodowania EdgeCt=0; } else if(PulseWidth >= MIN_HALF_BIT && PulseWidth <= MAX_HALF_BIT) { //impuls krótki (1/2 CLK) if(EdgeCt % 2 == 0) { //jeśli to parzyste zbocze RFID_tmp<<=1;//to zapisujemy bit RFID_tmp|=(uint64_t)BitVal; BitCt++;//i zwiększamy licznik odebranych bitów } EdgeCt++;//zwiększamy licznik zbocz } else { //przeciwny wypadek-(PulseWidth>MAX_HALF_BIT && PulseWidth<MAX_BIT) //czyli długi impuls (1 CLK) BitVal^=0x01;//zmieniamy wartość aktualnie przetwarzanego bitu RFID_tmp<<=1;//i zapisujemy bit RFID_tmp|=(uint64_t)BitVal; BitCt++;//i zwiększamy licznik odebranych bitów EdgeCt+=2;//i zwiększamy licznik zbocz o 2 (dla porządku) } if(BitCt>64) { //jeśli odebraliśmy całą ramkę EdgeCt=0;//resetujemy system do obdioru kolejnej if(RFID_decoded_flag == 0) { //i jeśli poprzednie dekodowanie zostało odebrane w programie RFID_data=RFID_tmp;//to zapisujemy ramkę w formacie niezdekodowanym decode_ok=header_align();//i dekodujemy ją if(decode_ok) { decode_ok=h_parity(); } if(decode_ok) { decode_ok=v_parity(); } if(!decode_ok) { //jeśli dekodowanie poszło nie tak jak trzeba RFID_data= ~RFID_data; //to negujemy ramkę (może zaczęliśmy dekodowanie //od niewłaściwego zbocza) decode_ok=header_align();//i ponawiamy próbę dekodowania if(decode_ok) { decode_ok=h_parity(); } if(decode_ok) { decode_ok=v_parity(); } } RFID_decoded_flag= decode_ok;//i przypisujemy fladze to czy zdekodowano poprawnie //ramkę, czy nie } } }
Kompletne rozwiązanie dla procesora ATMega328p dekodujące i wysyłające poprzez UART (9600bd) numer zbliżonej karty znajdziecie w załącznikach do tego artykułu.
Aaaaa….. Prawie bym zapomniał o schemacie połączeń do procesora (oczywiście należy uzupełnić takowy o odpowiednio odfiltrowane zasilanie, kondensatory 100nF przy każdej parze nóżek zasilających, konwerter UART<>USB/RS232, złącze programatora itd., jednak te elementy dla poprawy czytelności postanowiłem pominąć, a na blogu znajdziecie wiele innych schematów minimalnego podłączenia zasilania):
Uproszczony schemat podłączenia czytnika kart RFID. |
Bezpieczeństwo kart UNIQUE 125kHz
Bezpieczeństwo w teorii…
W teorii karty standardu UNIQUE są dosyć bezpieczne – numery powinny być niepowtarzalne, a karty równie bezpieczne jak klucze. Czy jednak rzeczywiście tak jest?
…i praktyce
Niestety nie. Po pierwsze unikalne numery kart skończyły się już jakiś czas temu (powstało więcej niż 240 kart) i powstają karty o dublujących się numerach. Jednak jeśli zastanowimy się dobrze ta wada tego systemu nie jest bardzo groźna – prawdopodobieństwo, że w danym rejonie świata znajdą się 2 karty o takich samych numerach jest znikomo małe.
Poważny problem stwarza jednak możliwość stosunkowo łatwego kopiowania takich kart. Jak się łatwo przekonamy szukając dłużej w sieci znajdziemy parę bardziej lub mniej skomplikowanych projektów budowy różnego rodzaju klonerów i emulatorów kart. Z powodu braku jakichkolwiek bardziej zaawansowanych metod zabezpieczenia w celu skopiowania karty wystarczy odczytać jej numer seryjny (co czasem można dokonać dysponując odpowiednim sprzętem z odległości paru metrów), a następnie zbudować układ wysyłający te dane do czytnika. Najciekawszy z odnalezionych przeze mnie projektów (http://scanlime.org/2008/09/using-an-avr-as-an-rfid-tag/) wykorzystuje jedynie odpowiednią cewkę i malutki mikrokontroler ATTiny85 – w wersji SMD takowym procesorem można nawet zastąpić oryginalny układ scalony w karcie i posiadać dzięki temu sklonowaną kartę wyglądającą zupełnie jak oryginalna.
Emulujemy kartę RFID.
Jeśli pamiętacie co mówiłem o zasadzie działania oryginalnych kart, to przypomnicie sobie szybko, ze modulacja sygnału polega na zmianie natężenia prądu płynącego przez cewkę w karcie. Najprościej możemy w praktyce tego dokonać po prostu zamykając i otwierając obwód za pomocą choćby tranzystora NPN. W związku z tym przykładowy schemat emulatora mógłby wyglądać tak (oczywiście także jest to, jak poprzednio, schemat uproszczony, nie zawierający koniecznych elementów układu zasilania):
Uproszczony schemat podłączenia emulatora kart RFID. |
Do złącz oznaczonych ANT podpinamy antenę. Może być to taka sama antena, jaką wykorzystywaliśmy do budowy odbiornika, choć równie dobrze możemy takową pozyskać z demontażu karty. W zależności od zastosowanej cewki montaż kondensatora C4 może okazać się zbędny, a ponadto w niektórych przypadkach może zmieniać na tyle parametry obwodu LC, że uniemożliwi poprawną pracę układu. Jeśli nie mamy czasu na obliczenia najlepiej sprawę tę rozstrzygnąć wykonując odpowiednie testy.
Oprogramowanie
Tym razem oprogramowanie na początku musi wykonać operacje odwrotne do tych wykonywanych podczas dekodowania numeru karty, a potem „w kółko” nadawać wygenerowany ciąg bitów. O ile kodowanie jest kwestią bardzo prostą – wystarczy tylko umieścić odpowiednie elementy stałe (bity startu i stopu), dane i wyliczone bity parzystości na odpowiednich miejscach – o tyle samo nadawanie tak wygenerowanego ciągu bitów jest warte omówienia. Algorytm ten wygląda następująco (jedyne co musimy w nim zapamiętywać to ostatnio nadawany bit i ilość nadanych zboczy):
- Jeśli nadaję parzyste zbocze to idź do kroku 2, w przeciwnym wypadku idź do kroku 6.
- Jeśli aktualnie nadawany bit jest taki sam jak poprzednio nadawany to zmień stan wyprowadzenia nadawczego na przeciwny, w przeciwnym wypadku nie rób nic.
- Zapamiętaj aktualnie nadawany bit jako ostatnio nadawany bit.
- Przygotuj do nadawania kolejny bit z wygenerowanej ramki.
- Idź do kroku 7.
- Zmień stan wyprowadzenia nadawczego na przeciwny.
- Zwiększ licznik zbocz.
- Jeśli licznik zbocz osiągnie wartość 127 to zresetuj go do wartości 0 (nadaliśmy całą ramkę).
- Wróć do kroku 1 po upływie odpowiedniego czasu (połowy jednego bitu – 32 cyklach częstotliwości nośnej).
Poniższy kod przedstawia implementację tego algorytmu w języku C dla procesora ATMega328P. Przerwanie jest skonfigurowane w taki sposób, aby kod wykonywany był dokładnie co 32 cykle zegara 125kHz.
Nadawanie:
//przerwanie OCR1A co 32 CLK - czyli minimalny czas trwania impulsu RFID ISR(TIMER1_COMPA_vect) { static uint8_t LastBit;//ostatnio nadawany bit static uint8_t EdgeCt;//licznik nadawanych zbocz uint8_t mbit;//zmienna tymczasowa if(EdgeCt % 2 == 0) { //jeśli nadajemy parzyste zbocze to if(RFID_send&MBIT_MASK) { mbit=1; } else { mbit=0; //sprawdzamy najwyższy bit } RFID_send=RFID_send<<1; //przesówamy ramkę o 1 bit w lewo if(mbit) { //dopisujemy wcześniejszy najwyższy bit na koniec ciągu RFID_send|=LBIT_MASK; } //jeśli bit, który chcemy nadać jest taki sam jak wcześniej nadawany if(mbit==LastBit) { //to musimy zmienić stan pinu modulujacego, aby zbocza występowały //co 32 cykle MOD_PORT^=(1<<MOD_PIN); } LastBit=mbit;//i zapisujemy aktualnie nadawany bit } else { //tak czy inaczej zmieniamy zbocze co 64 cykle - jeśli podczas nadawania // zbocza parzystego nie został zmieniony stan pinu modulującego, //to impuls ma długość 64 cykli "zegara RFID" MOD_PORT^=(1<<MOD_PIN); } EdgeCt++; //zawsze zliczamy ilość wszystkich hipotetycznych zbocz //i jeśli nadaliśmy całą ramkę to rozpoczynamy nadawanie od początku. if(EdgeCt>127) { EdgeCt=0; } }
I w tym wypadku najlepiej do odmierzania czasu posłużyć się odpowiednio skonfigurowanym timerem (w trybie CTC), dzięki czemu i w tym wypadku całe nadawanie odbywa się prawie niezauważalnie z punktu widzenia programu głównego.
Podsumowanie
Z artykułu dowiedzieliśmy się co-nieco o teorii działania kart zbliżeniowych, różnych ich modelach oraz w miarę szczegółowo poznaliśmy standard RFID Unique 125kHz. Umiemy za pomocą mikrokontrolera AVR i układu EM4095 zdekodować dane z karty, a nawet symulować jej działanie za pomocą drugiego procesora.
Mam nadzieję, że informacje tu przedstawione przydadzą się Wam w praktycznym zastosowaniu :-)
Załączniki:
Pobierz spakowany plik (czytaj załączoną w nim instrukcję pobierania):
W załączniku znajdują się:
- Oprogramowanie do czytnika i emulatora kart dla procesora ATMega328P
- Przykładowe schematy koniecznych połączeń układów czytnika i emulatora (czytaj uwagi pod schematami w artykule)
- Dane przesłane przez kartę RFID w formie przebiegu sygnałów z analizatora stanów logicznych (do odczytania danych konieczny jest darmowy program, do którego link podano w pliku README.txt przy pliku wynikowym)
- Karty katalogowe układu EM4095 oraz dostarczany przez producenta kalkulator elementów obwodu demodulatora.
Autor:
Piotr Rzeszut, http://piotr94.net21.pl/
Profil na forum: piotrva
Komentarz Dondu:
Dziękując Piotrowi za wykonaną pracę oraz podzielenie się wiedzą, schematami i programami dodam jedynie, że pierwszym człowiekiem, który wszczepił sobie w 1998 roku implant RFID był Kevin Warwick, a wygląda to tak:
... i drzwi zawsze otwierają się bez kluczy, a wszczepianie wygląda tak:
UWAGA! Film tylko dla ludzi o wystarczająco silnych nerwach :-)
Kto następny? Ja nie! :-)
Jak sądzicie - upowszechni się, gdy dokonana zostanie jeszcze większa miniaturyzacja?
W końcu zastosowań jest wiele, ale zagrożeń także ...
Gratuluję artykułu. Temat o dkilku miesięcy chodził mi po głowie. Piąteczka :)
OdpowiedzUsuńW sumie sądziłem, że to jest skomplikowany temat, a tu się okazuje, że nie.
OdpowiedzUsuńCóż, standard UNIQUE akurat jest najprostszy, sam za temat zabierałem się kilka razy, ale przełomowym momentem okazał się dostęp do analizatora stanów logicznych, dzięki któremu mogłem całą kwestię sprawdzić "na sucho" przed napisaniem i dopracowaniem algorytmu. Bez analizatora rozpracowanie całego zagadnienia na pewno zajęłoby dużo więcej czasu.
UsuńArtykuł naprawdę świetny, omówiona została tematyka, z którą chciałem się zaznajomić i dzięki autorowi uwierzyłem, że jest to takie proste ... ale załącznik Dondu niesmaczny :) ... co za paskudztwo te implanty ... jak karaluchy wyglądają :) .. wideo powinno zostać usunięte, bo dzieci i kobiety też to oglądają :)
OdpowiedzUsuń:D
UsuńNie oglądają, bo nie wchodzą tutaj (statystyki).
Ale dodam komentarz, że film zawiera sceny jak to ująłeś "paskudne".
Witam, czytając ten artykuł natknąłem się na słowo kluczowe RC5. Postanowiłem poczytać o tym na Wikipedii i zastanawia mnie pewna rzecz .. czy ja dobrze zrozumiałem artykuł na blogu i na Wikipedii i czy nie ma czasem gdzieś błędu ... ilustracja http://3.bp.blogspot.com/-ZjSCd2Oe9fk/Udil1MG_EBI/AAAAAAAAJug/SPhGM3ryO0g/s1600/kodowanie-Manchester-znakow-1-0.jpg pokazuje, że logiczne 1 następuje gdy w ciągu okresu podamy sekwencję "10" a logiczne 0 gdy podamy "01" .... zaś na Wikipedii jest napisane tak, cytuję: "Rozkazy są przesyłane wiązką podczerwieni modulowaną impulsowo o częstotliwości podnośnej 36 kHz za pomocą kodowania Manchester (przesłanie stanu "01" = logiczna "1", przesłanie stanu "10" = logiczne "0")." Czyli dobrze rozumiem, że gdzieś jest błąd w stanach logicznych kodowania Manchester ? (w artykule z blogu lub z Wikipedii).
UsuńPozdrawiam
Witam,
UsuńSłusznie, że to zauważyłeś, w sumie błędu nie ma nigdzie, a jest jedynie nieścisłość. Wyjaśnieniem tego zamieszania najlepiej niech będzie ten artykuł na angielskiej Wikipedii:
http://en.wikipedia.org/wiki/Manchester_code#Conventions_for_representation_of_data
Jak czytamy są 2 konwencje zapisu tego kodowania - jedna tak jak opisałem w artykule, druga taka jak w RC5.
Gdybym mówił o RC5, gdzie ponadto mamy ściśle określony początek ramki i zarazem właściwe zbocze do rozpoczęcia dekodowania, musiałbym ściśle trzymać się podanej przez Ciebie interpretacji, jednak w kontekście kart RFID Unique 125kHz jak wspomniałem i tak występuje problem rozpoczęcia odbioru od losowego zbocza i miejsca ramki, więc algorytm musi i tak dopasować się do warunków, co też czyni.
Nie mniej jednak dziękuję za spostrzegawczość i pretekst do rozwinięcia tej sprawy.
Pozdrawiam
Piotr Rzeszut
masakryczne to video o.O Nie dałam rady obejrzeć tego do końca... brrr, jeszcze mnie trzęsie
UsuńOstrzegałem na czerwono :-)
UsuńJa z chęcią bym sobie wszczepił, gdyby to miało długość max 2mm i średnicę max 1mm. Wtedy od razu wykorzystałbym to do sterowania domu w zakresie światła, alarmu i innych bajerów.
OdpowiedzUsuńOj ja bym nigdy się nie zgodził. Raz metal w ciele == problemy w razie konieczności badań - rezonansu Ci już nie zrobią w razie konieczności, a jak nie będą o tym wiedzieli to mogą krzywdę zrobić.
UsuńPonadto obawiałbym się śledzenia - skąd wiadomo co dokładnie Ci wszczepią i czy będzie tam standardowa karta Mifare, czy coś innego...
Trochę przesadzasz. W końcu wszczepiając znacznie bardziej skomplikowane urządzenie jak np. rozrusznik serca, także nie mamy pewności co w nim się znajduje. A teraźniejsze rozruszniki mają połączenie radiowe z bazowym urządzeniem stojącym przy łóżku, a te z kolei za pomocą internetu z lekarzem. Jakieś zaufanie trzeba mieć. Pewnie, że nie poszedłbym wszczepiać takiego RFID do byle punktu z tatuażami :)
UsuńA co do rezonansu, to wie ktoś jak to jest jeżeli ma się implant zęba oparty na metalowym wkręcie?
Dzięki za artykuł!
Nie do końca jest tak jak piszesz. Wymiana danych z rozrusnzikiem aktywowana jest po przyłożeniu głowicy programującej, która zawiera silny magnes, aktywujący tor radiowy rozrusznika. Bez tego rozrusznik jest niewrażliwy na polecenia z zewnątrz. Drugim zabezpieczeniem jest nikły zasięg transmisji. W praktyce głowica musi leżeć nad miejscem wszczepienia implantu. Trudno więc bez wiedzy pacjenta go przeprogramować, lub skopiować z niego dane :) Z implantem RFID sprawa wygląda nieco inaczej.
UsuńCo do implantów i NMR - zazwyczaj implanty stosowane w medycynie są wykonane w taki sposób, że nie stanowią problemu i u pacjentów z takimi implantami można badanie wykonać. Tak samo można je wykonać u pacjentów z rozrusznikami czy ICD, tu problemem są ewentualne zakłócenia łapane przez elektrody, stąd przed badaniem trzeba przeprogramować rozrusznik, np. na tryb VVI lub V00, czyli najprostszy możliwy.
Mój ojciec, ma wszczepiony rozrusznik (bądź stymulator serca - nie wiem dokładnie), i ma przy łóżku urządzenie odbiorcze podłączone do internetu, czyli tak jak napisał Anonimowy powyżej. Urządzenie to komunikuje się z tym wszczepionym, gdy pacjent jest w jego zasięgu (coś około 2-3m). Gdy coś jest nie tak, lekarz nadzorujący dzwoni do ojca i mówi: Proszę łyknąć tabletkę X.
UsuńOt taki Big Brother, ale w pożytecznym wydaniu :-)
Co do wielkości chipów RFID, to w 2005 Hitachi zaprezentował takie które miały znacznie poniżej 1mm3, a aktualnie są jeszcze mniejsze!
OdpowiedzUsuń"More than 22 million visitors attended the Expo 2005 World’s Fair in Aichi, Japan. Not one got in with a bogus ticket. The passes were practically impossible to forge because each harbored a tiny RFID (radiofrequency identification) chip—just 0.4 millimeter (mm) on a side and 0.06 mm thick—that transmitted a unique identification number via
radio waves to a scanner at the gates.
Now Hitachi, the maker of that chip, is aiming even smaller. Last year it announced a working version of a chip only 0.05 mm on a side and 0.005 mm thick"
Źródło: http://www.cs.virginia.edu/~robins/RFID_Powder.pdf
Takie coś spokojnie można komuś do jedzenia dorzucić.
http://www.technovelgy.com/ct/Science-Fiction-News.asp?NewsNum=939
OdpowiedzUsuńWitam
OdpowiedzUsuńWiem że są święta, ale prosiłbym o w miarę szybką odpowiedź. Chciałbym się pobawić czytnikiem kart RFID jednak mam problem z skompletowaniem części. Mam w związku z tym 3 pytania:
1. "ANT – złącza anteny. Podłączamy do nich cewkę o indukcyjności ok. 736 μH lub posiadającą 32 zwoje i średnicę 8 cm" - czy mogę zamiast takiej cewki użyć połączonych np szeregowo dwóch dławików 680uH i 56 uH ? Pytam bo w "cewkowych" sprawach to słaby jestem :)
2. Chciałbym też użyć układu EM4095 i mam problem z kartami. Chciałbym kupić te karty z AVT (warunek konieczny), i nie wiem która z nich będzie dobra, czy wystarczy patrzeć tylko na częstotliwość (tj. 125 kHz) ?
Oto karty którymi jestem zainteresowany:
a) KARTA RFID ISO R/O 125kHZ TK4100 http://sklep.avt.pl/karta-rfid-iso-r-o-125khz-tk4100.html
b) KARTA RFID ISO EM4200 http://sklep.avt.pl/karta-rfid-iso-em4200.html
c) KARTA RFID EM4100 http://sklep.avt.pl/karta-rfid-em4100.html
3. Trochę się pogubiłem jeśli chodzi o standardy. Czy układ EM4095 będzie użyteczny także przy kartach w standardzie HITAG ? (też 125kHz nośna). W karcie katalogowej EM4095 nie znalazłem informacji na ten temat.
Z góry dziękuje za wszystkie odpowiedzi. Jeżeli czegoś nie dopowiedziałem to proszę pytać.
Pozdrawiam
1. Dławiki się raczej do tych celów nie nadają - powinna być to solidna cewka - w czasie testów wykorzystywałem między innymi nawinięty drut o wymiarach podanych w punkcie pierwszym
Usuń2. Wszystkie te karty powinny być odpowiednie - należy zwrócić uwagę by była to karta standardu UNIQUE.
3. Tego osobiście nie testowałem, ale układ ten umożliwia też zapis danych, więc powinien współpracować z tymi kartami.
Ja też dziękuję za RIFD pod skórą:
OdpowiedzUsuńhttps://www.youtube.com/watch?v=zbABszxPlMg
Witam
OdpowiedzUsuńWykonałem i zaprogramowałem wyżej przedstawiony projekt, ale mam pewien problem. Odbieranie ramek z karty działa jedynie kiedy źródło taktowania TIMERA1 ustawione jest jako zewnętrzne z pinu T1 połączonego z wyjściem CLK układu EM4095. Kiedy ustawiam źródło z preskalera na 8, urządzenie przestaje działać. Kwarc jest na 16 MHz. Nie mam pojęcia dlaczego tak się dzieje, próbowałem już z dwoma ATMEGAmi. Ktoś się orientuje co może być nie tak?
Z góry dziękuje za odpowiedź.
Pozdrawiam
Dobra poradziłem sobie, zapomniałem w pliku nagłówkowym zmienić definicje.
UsuńPozdrawiam
Witam
UsuńJestem początkujący mocno i chciałem zrobić sobie zamek do pokoju z takim tematem ... Lecz to cudo nie wiedziec czemu nie chce działać ...
Zakupiłem płytkę z atmegą 328p i kwarcem 16 MHz fuse bits już ustawiłem na zewnętrzny...
Zakupiłem moduł http://allegro.pl/demodulator-rfid-unique-em4095-z-antena-i4856031941.html
I to nie tyka
Proszę o pomoc...
Pozdrawiam
Nic nie kombinuj! kup sobie tylko http://allegro.pl/sterownik-rfid-un7-oem-modul-kontrola-dostepu-i4954671958.html a atmegi zostaw na inne zabawy.
UsuńWitam, plik z przebiegami niestety nie chce się otworzyć :( ,mam też pytanie odnośnie tablicy 5 elementowej TagID w Emulatorze ,dlaczego jest tylko 5 elementów? ,w terminalu widzę numer karty ,przykładowo: 8F25511704 ,to już 10 elementów jeśli chodzi o ASCII ,próbowałem to podzielić na 0x85-0x25-0x51-0x17-0x04 ,wtedy jest 5 elementów ,ale chyba nie tędy droga ,bo nie działa. Mógłbym prosić bardziej doświadczonych kolegów o pomoc ,pozdrawiam.
OdpowiedzUsuńWitaj,
OdpowiedzUsuń1. Rzeczywiście jest jakiś problem w nowszej wersji - spróbuj ze starszą wersją: https://support.saleae.com/hc/en-us/articles/210245603-Older-Saleae-Logic-Beta-Downloads
2. Numer karty, jaki widzisz to zapis heksadecymalny - podziel go na bajty i ich wartości wprowadź do TagID - tak jak zrobiłeś. Jeśli czytnik odczyta z emulatora inny numer, niż wpisałeś do programu, to błąd może polegać na tym że Twój czytnik podaje bajty lub bity w odwrotnej kolejności. Jeśli czytnik w ogóle nie wykrywa karty to błąd tkwi w innym miejscu (częstotliwość taktowania procesora, połączenia, użyta cewka, ...)
Ok, dziękuję bardzo za podpowiedź, będę dalej próbował ;)
OdpowiedzUsuńi zostanie dane znamie na prawą ręke lub czoło..i co wam to mówi ? Apokalisa....
OdpowiedzUsuńDzień dobry
OdpowiedzUsuńNie jestem specjalistą ani też amatorem tej dziedziny techniki. Mam zatem pytanie czy i do kogo mogę się zwrócić o pomoc w przygotowaniu pełnego systemu który miałby wykonywać określoną jedną czynność w oparciu o tagi RFID UHF 866/928 MHz. System ma informować że pobliżu znajduje się tag i komunikować jedynie sygnałem dźwiękowym lub świetlnym. Coś na wzór bramek antykradzieżowych jednak by całe sterowanie systemem znajdowało się na małej płytce.
Czy możecie mnie skierować do hobbisty lub czy musi to być profesjonalny zakład. Osobiście wolałbym hobbistę
Dziękuje