Ćwiczenie 6 - Czytnik kart magnetycznych



Podobne dokumenty
PERSON Kraków

Systemy mikroprocesorowe - projekt

Instrukcja programu PControl Powiadowmienia.

CZYTNIK ZBLIŻENIOWY RFID-UR80D

System Informatyczny CELAB. Przygotowanie programu do pracy - Ewidencja Czasu Pracy

REJESTRATOR RES800 INSTRUKCJA OBSŁUGI

Instrukcja obsługi panelu operacyjnego XV100 w SZR-MAX-1SX

INSTRUKCJA DO PROGRAMU LICZARKA 2000 v 2.56

INSTRUKCJA OBSŁUGI URZĄDZENIA: HC8201

db powernet Instalacja czytnika kart mikroprocesorowych (instrukcja)

Warszawa, r.

Instrukcja obsługi zamka. bibi-z50. (zamek autonomiczny z czytnikiem identyfikatora Mifare)

Logowanie do mobilnego systemu CUI i autoryzacja kodami SMS

Instrukcja obsługi. Oprogramowanie SAS 31

raceboard-s Szybki start

INSTRUKCJA OBS UGI

Budowa systemów komputerowych

PRZEMYSŁOWY ODTWARZACZ PLIKÓW MP3 i WAV

Śrubka zamykająca Uchwyt ścienny Przycisk kontrolny Lampka kontrolna

PROCEDURA ADMINISTROWANIA ORAZ USUWANIA

Jak: Kopiować. Wysyłać cyfrowo. Faksować. Przechowywać zlecenia

Opis obsługi systemu Ognivo2 w aplikacji Komornik SQL-VAT

asix4 Podręcznik użytkownika MODBUS - drajwer protokołu MODBUS/RTU tryb MASTER Podręcznik użytkownika

CHEVROLET MYLINK. Krótki przewodnik

Oprogramowanie klawiatury matrycowej i alfanumerycznego wyświetlacza LCD

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

INFORMATOR TECHNICZNY. Pierwsze uruchomienie przemiennika częstotliwości Astraada Drive UWAGA!

Instrukcja procesu aktywacji oraz obsługi systemu Banku Internetowego dla BS Mikołajki

SpedCust 5 instrukcja instalacji

Moduł GSM generacja 1

Wykład 2. Interfejsy I 2 C, OneWire, I 2 S

Instrukcja obsługi. Sterownik ścienny KJR10B/DP

Karta adaptacyjna GSM

Instrukcja obsługi Norton Commander (NC) wersja 4.0. Autor: mgr inż. Tomasz Staniszewski

yoyo ver. 6.0

Detektor przenośny typ GD-7

Instrukcja obsługi aplikacji internetowej Obroty Paliw

Instrukcja obsługi programu MKi-m konfigurator

INTERFEJS S-CTT Super Chip tuning tool INSTRUKCJA OBSŁUGI

Adapter USB do CB32. MDH-SYSTEM ul. Bajkowa 5, Lublin tel./fax lub kom e mail: info@mdh-system.pl

emszmal 3: Automatyczne księgowanie przelewów w menedżerze sprzedaży BaseLinker (plugin dostępny w wersji ecommerce)

VinCent Office. Moduł Drukarki Fiskalnej

Instrukcja postępowania w celu podłączenia do PLI CBD z uwzględnieniem modernizacji systemu w ramach projektu PLI CBD2

Instrukcja logowania do aplikacji ING Agent

Siemens IO-Link. Smart TIA integration of sensors and actuators

EC1000 KATALOG SYSTEMÓW STEROWANIA

PROCEDURA ROZWIĄZYWANIA PROBLEMÓW Z SYSTEMEM SD-NAVI (wersja 1.00)

Opis programu do wizualizacji algorytmów z zakresu arytmetyki komputerowej

Instrukcja instalacji programu Plantator oraz transferu pliku danych z/do PC kolektor danych PT-20

Ręczny czytnik kodów kreskowych QS6500

OBSŁUGI Konwerter USB-RS

Instrukcja dotycząca generowania klucza dostępowego do Sidoma v8

Zaznaczając checkbox zapamiętaj program zapamięta twoje dane logowania. Wybierz cmentarz z dostępnych na rozwijalnej liście.

Kancelaris - Zmiany w wersji 2.50

BANK ENERGII I AWARYJNY STARTER SAMOCHODU INSTRUKCJA OBSŁUGI

Bazy danych. Andrzej Łachwa, UJ, /15

Ręczny czytnik kodów kreskowych ARGOX AS8312

Seria P-662HW-Dx. Bezprzewodowy modem ADSL2+ z routerem. Skrócona instrukcja obsługi

Instrukcja obsługi. Konsola portiera 6806

linkprog programator USB

INSTRUKCJA TESTOWANIA USŁUG NA PLATFORMIE ELA-ENT

emszmal 3: Automatyczne księgowanie przelewów w sklepie internetowym Magento (plugin dostępny w wersji ecommerce)

VLAN Ethernet. być konfigurowane w dowolnym systemie operacyjnym do ćwiczenia nr 6. Od ćwiczenia 7 należy pracować ć w systemie Linux.

Sterownik nagrzewnicy elektrycznej HE

INSTRUKCJA OBSŁUGI JL269. Przenośny detektor gazów

Spis procedur i programów

Rozliczenia z NFZ. Ogólne założenia. Spis treści

Ręczny czytnik kodów kreskowych DATALOGIC QuickScan I (QD2100)

PoniŜej przedstawiono przykład komunikacji pomiędzy CPU224XP a CPU314C-2 DP. UŜyty sprzęt:

Instrukcja wgrywania synoptyki pola (wersja modelu danych do 634)

Zarządzanie Zasobami by CTI. Instrukcja

Instrukcja obsługi mikroprocesorowego terminala DAT-120. Sp. z o.o Czeladź ul. Wojkowicka 21 Tel Fax:

Komunikacja sterownika z rodziny Micro800 z Falownikiem PowerFlex40 przy pomocy sieci DeviceNet.

Interfejs RS485-TTL KOD: INTR. v.1.0. Wydanie: 2 z dnia Zastępuje wydanie: 1 z dnia

PRESTASHOP INTEGRATOR XL BY CTI INSTRUKCJA

Wtedy wystarczy wybrać właściwego Taga z listy.

SKRÓCONA INSTRUKCJA OBSŁUGI CR-500- HD

Ogłoszenie Zarządu o zwołaniu Nadzwyczajnego Walnego Zgromadzenia Akcjonariuszy Yellow Hat S.A. z siedzibą w Warszawie

SIEMENS 1 SCALANCE W786 SIMATIC NET. Instrukcja obsługi. Wyświetlacz LED. Przycisk Reset. Demontaż / montaż obudowy. Specyfikacja techniczna

Spis zawartości Lp. Str. Zastosowanie Budowa wzmacniacza RS485 Dane techniczne Schemat elektryczny

Instrukcja instalacji oraz wykorzystania podpisu cyfrowego

Zdalne odnawianie certyfikatów do SWI

Cennik usług. Internet i telefonia TOYAmobilna Pakiety usługi TOYAmobilna z limitem transmisji danych 1) opłaty abonamentowe.

Generator obrazu transakcji fiskalnych, FG-40

PX319. Driver LED 1x2A/48V INSTRUKCJA OBSŁUGI

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

Dokumentacja użytkownika aplikacji mobilna Aplikacja Uczestnika Gry Miejskiej

MUP.PK.III.SG /08 Lublin, dnia r.

1. Korzyści z zakupu nowej wersji Poprawiono Zmiany w słowniku Stawki VAT Zmiana stawki VAT w kartotece Towary...

Spis treści. Rozdział 1 ewyniki. mmedica - INSTR UKC JA UŻYTKO W NIKA

SINAMICS G120C STARTER. Tworzenie nowego projektu w trybie online.

Konfiguracja przeglądarek internetowych oraz Panelu Java dla klientów instutucjonalnych problemy z apletem do logowania/autoryzacji

Polityka prywatności strony internetowej wcrims.pl

POLITYKA PRYWATNOŚCI SKLEPU INTERNETOWEGO

Instrukcja. 1 Zamawiając kuriera. W Paczkomacie lub POK. 3 Nadając list polecony. nadawania przesyłek z Allegro: (Punkt Obsługi Klienta)

Realizacja poszczególnych zadań wariant minimalny

INSTRUKCJA OBSŁUGI TERMOMETR CYFROWY TES-1312A

Przepisy regulujące kwestię przyznawania przez Ministra Zdrowia stypendium ministra:

Centrum Informatyki "ZETO" S.A. w Białymstoku. Instrukcja użytkownika dla urzędników nadających uprawnienia i ograniczenia podmiotom w ST CEIDG

AKADEMIA MORSKA W SZCZECINIE

Transkrypt:

Grzegorz Pietrzak (133329) Jacek Symonowicz (133375) Wrocław, dnia 8 marca 2007 Laboratorium nr 1 Ćwiczenie 6 - Czytnik kart magnetycznych Kurs: Urządzenia peryferyjne (2) Prowadzący: dr inż. Tomasz Walkowiak

1. Cel ćwiczenia Celem ćwiczenia była obsługa czytnika kart magnetycznych podłączanego do portu szeregowego. Nasze zadanie polegało na zrozumieniu struktury komend przesyłanych z i do czytnika oraz napisaniu programu realizującego uwierzytelnianie na podstawie karty magnetycznej i czterocyfrowego numeru PIN. 2. Czytnik kart Czytnik kart dostępny w laboratorium posiada interfejs szeregowy, załączenie urządzenia odbywa się poprzez ustawienie stanu wysokiego sygnału DTR (Data Terminal Ready). Czytnik sygnalizuje gotowość do pracy głośnym piskiem, odtąd może działać w dwóch trybach: trybie czytnika karty magnetycznej, trybie klawiatury numerycznej. Transmisja danych odbywa się z prędkością 2400 b/s (8 bitów/bajt, 1~bit stopu), można ją przerwać niskim poziomem sygnału RTS (Request To Send). 2.1. Wysyłanie danych Początkowo aktywną stroną transmisji jest komputer, który musi zasygnalizować użytkownikowi gotowość do odczytu danych z karty lub klawiatury poprzez zapalenie zielonej diody na urządzeniu. Po przeciągnięciu karty lub wpisaniu PINu dioda gaśnie i konieczne jest kolejne potwierdzenie gotowości przez komputer lub zmiana trybu działania. W poniższej tabeli zestawione zostały kody operacji wysyłane przez komputer do czytnika, po każdej z komend powinien pojawić się znak terminatora, czyli 0FFh. 2.2. Odbiór danych 168 (0A8h) wybierz moduł klawiatury 170 (0AAh) wybierz moduł czytnika karty 161 (0A1h) zaświeć diodę czerwoną 162 (0A2h) zaświeć diodę żółtą 164 (0A4h) zaświeć diodę zieloną Tabela 1: Kody wysyłane do czytnika Urządzenie potwierdza każdą wykonaną komendę wysyłając dwubajtowy sygnał FF F8h. Pozostałe dane przesyłane są w formie 19-bajtowych pakietów. W trybie czytnika kart przesyłane są następujące informacje: FE 0B 10 04 10 04 01 15 17 19 15 19 02 02 1F 02 FA FF 00 kod oper. wydział kod karty reszta Tabela 2: Dane z karty magnetycznej

Powyższe dane zawierają kod wydziału 04'' oraz numer karty 04157''. Nieco inną strukturę ma pakiet bajtów przesłanych do komputera po naciśnięciu kolejno czterech klawiszy (oprócz * oraz #) na klawiaturze numerycznej: FE 0B 01 02 13 04 1F 10 FF FA FF 01 01 01 1F 1C FF FA FF kod oper. PIN reszta Tabela 3: Dane z klawiatury numerycznej W obu przypadkach informacje (czyli cyfry) koduje się na czterech bitach każdego transmitowanego bajtu. Pozostałe bity są wyzerowane oprócz jednego, stanowiącego negację bitu parzystości (np. 3 13h, 1 01h). 3. Aplikacja do obsługi czytnika Aplikacja została utworzona w środowisku Visual C++ 6.0, przy użyciu MFC. Funkcje do komunikacji przez port szeregowy napisaliśmy w oparciu o WinAPI, korzystając z trybu nonoverlapped I/ O oraz wielowątkowości. Poniżej znajduje się dokładny opis najważniejszych procedur: 3.1. Funkcja SerialInit Funkcja ta inicjalizuje transmisję szeregową, otwierając odpowiedni port (w naszym przypadku COM1) przy pomocy CreateFile. Parametry transmisji są ustalane poprzez strukturę typu DCB, zaś timeouty odczytu i zapisu przez strukturę COMMTIMEOUTS. // inicjalizuj transmisję szeregową void SerialInit() // otwórz port hcomm = CreateFile("COM1", GENERIC_READ GENERIC_WRITE, // zarówno czytamy jak i piszemy 0, // dzielenie portów musi być off NULL, // atrybuty bezpieczeñstwa - niepotrzebne OPEN_EXISTING, // fdwcreate dla portu zawsze OPEN_EXISTING 0, // flagi pliku - synchroniczne IO NULL); // htemplatefile - musi byc NULL if (hcomm == INVALID_HANDLE_VALUE) AfxMessageBox("Nieprawidlowa wartosc handle portu"); // skonfiguruj port DCB config; if(getcommstate(hcomm, &config)) config.baudrate = 2400; config.bytesize = 8; // prędkość w bodach // rozmiar bajtu

else AfxMessageBox("Nie moge pobrac konfiguracji portu"); if(!setcommstate(hcomm, &config)) AfxMessageBox("Nie moge zapisac konfiguracji portu"); // skonfiguruj timeouty (brak dokumentacji) COMMTIMEOUTS timeouts; if(getcommtimeouts(hcomm, &timeouts)) timeouts.readintervaltimeout = 1000; timeouts.readtotaltimeoutconstant = 1000; timeouts.readtotaltimeoutmultiplier = 1; timeouts.writetotaltimeoutconstant = 1000; timeouts.writetotaltimeoutmultiplier = 1; else AfxMessageBox("Nie moge pobrac timeoutów portu"); if(!setcommtimeouts(hcomm, &timeouts)) AfxMessageBox("Nie moge zapisac timeoutów portu"); 3.2. Funkcje SendCOM i RecvCOM Funkcje te mają za zadanie rozpoczęcie odczytu / zapisu do portu szeregowego. W obu przypadkach tworzony jest oddzielny wątek (używamy komunikacji blokującej, czyli nonoverlapped I/O) pozwalający na uniknięcie przerywania pracy aplikacji podczas czekania na zasób we/wy. Wątki przechowują uchwyt okna programu m_hwnd aby umożliwić wysyłanie sygnałów informujących o zakończeniu transmisji. // RecvCOM void CSerialCommDlg::RecvCOM(int bytes) hokno = m_hwnd; ile_bajtow = bytes; hread=createthread(null, 0, Odczyt, NULL, 0, NULL);

// SendCOM void CSerialCommDlg::SendCOM(CString tts) wtext = Hex2Bytes(tts); hokno = m_hwnd; hwrite=createthread(null, 0, Zapis, NULL, 0, NULL); 3.3. Funkcje Odczyt i Zapis Są to funkcje uruchamiane jako oddzielne wątki poprzez SendCOM i RecvCOM. Po odczytaniu niezbędnych parametrów wywoływana jest funkcja WriteABuffer (do zapisu) lub ReadABuffer (do odczytu). Po zakończeniu transmisji danych wątek wysyła do głównego okna aplikacji komunikat WM_THREAD_WRITTEN / WM_THREAD_READ, przechwycony następnie przez metody OnThreadWrite lub OnThreadRead klasy CserialCommDlg. W metodach tych zaimplementowany został automat stanów determinujący kolejność wykonywania operacji na urządzeniu (włącz czytnik zapal zieloną diodę czekaj na kod włącz klawiaturę zapal zieloną diodę czekaj na PIN) oraz czekanie na zakończenie poszczególnych wątków (w celu utrzymania porządku w strukturach programu). Warto wspomnieć tu także o funkcjach Hex2Bytes i Bytes2Hex realizujących konwersję z typu char do dwuliterowego stringa z kodem szestnastkowym znaku (np. '5' 35 ) i odwrotnie. // watek zapisujacy DWORD WINAPI Zapis(LPVOID lparam) oper = OPER_WRITE; CString wr = wtext; WriteABuffer(wr, wr.getlength()); PostMessage(hOkno, WM_THREAD_WRITTEN, 0, 0); ExitThread(THREAD_WRITE_OK); return 0; // watek odczytujacy DWORD WINAPI Odczyt(LPVOID lparam) oper = OPER_READ; CString wr; ReadABuffer(wr, ile_bajtow); wtext = wr; PostMessage(hOkno, WM_THREAD_READ, 0, 0); ExitThread(THREAD_READ_OK); return 0;

3.4. Funkcja WriteABuffer Funkcja ta służy do zapisania bufora str o rozmiarze ile poprzez blokującą funkcję WriteFile. Zapis trwa tak długo aż wysłane zostaną wszystkie bajty albo nastąpi przerwanie transmisji poprzez ustawienie zmiennej globalnej cancel na true. Parametr WriteTotalTimeoutConstant połączenia wynosi 1000 ms, stąd w przypadku braku komunikacji z urządzeniem wartość zmiennej cancel sprawdzana będzie co sekundę. // zapisuj do portu static void WriteABuffer(CString &str, DWORD ile) DWORD wyslane = 0; DWORD przyjete; char znak; while (wyslane < ile) if (cancel) ExitThread(THREAD_CANCELLED); // funkcja write blokuje watek znak = str[(int)wyslane]; if (WriteFile(hComm, &znak, 1, &przyjete, NULL)!= 0) if(przyjete > 0) wyslane++; else AfxMessageBox("Blad funkcji WriteFile"); 3.5. Funkcja ReadABuffer Funkcja bardzo podobna do WriteABuffer, służąca do odczytu danych z portu COM. Odczyt następuje bajt po bajcie aż do zapełnienia bufora str o rozmiarze ile. Warto wspomnieć tu o niebezpieczeństwie zablokowania aplikacji w przypadku żądania zbyt dużej ilości danych jeżeli wywołamy funkcję z parametrami ReadABuffer(buf, 20) i odbierzemy z czytnika 19-bajtowy pakiet to wówczas aplikacja nadal będzie oczekiwać dwudziestego bajtu. // czytaj z portu void ReadABuffer(CString &str, DWORD ile) DWORD jest = 0; DWORD przyszlo; char znak;

str = ""; // czekaj na zdarzenie do // funkcja read blokuje watek if (cancel) // sprawdz, czy nie anulowano watku ExitThread(THREAD_CANCELLED); if (ReadFile(hComm, &znak, 1, &przyszlo, NULL)!= 0) // jesli przyszly jakies bajty to nie ma timeoutu if (przyszlo > 0) jest += przyszlo; str += znak; else AfxMessageBox("Blad funkcji ReadFile"); while(ile > jest); 3.6. Okno programu

Kontrola portu, w przypadku naciśnięcia przycisku Disconnect aktualna transmisja zostaje anulowana Dane odczytywane z karty i klawiatury Status transmisji w danej chwili Wszystkie wysyłane i odbierane dane przedstawione w postaci szesnastkowej, pozwalają na obserwację pracy urządzenia

4. Wnioski Aplikacja działała prawidłowo, jej działanie sprawdziliśmy na kilku kartach magnetycznych do zapisów wydziałowych. Zastosowanie wątków znacznie zwiększyło funkcjonalność programu, eliminując blokowanie się okna na czas transmisji oraz umożliwiając w każdej chwili anulowanie połączenia. Sposób komunikacji z urządzeniem poznaliśmy głównie przy użyciu terminala RealTerm oferującego możliwość wysyłania i odbioru danych w formacie szesnastkowym oraz kontroli ważniejszych linii portu COM. Występowały niewielkie problemy przy kontroli parzystości, sugerowane przez instrukcję do laboratorium ustawienie parametru parity portu na even powodowało w niektórych przypadkach niedeterministyczną pracę aplikacji.