logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Czytnik kart magnetycznych - Bascom

ElektroTME 10 Wrz 2010 14:02 3418 7
REKLAMA
  • #1 8495961
    ElektroTME
    Poziom 14  
    Witam.
    Posiadam standardowy czytnik kart magnetycznych.
    Wyciągnąłem go ze słynnych kiedyś na elektrodzie niemieckich kas fiskalnych z Goleniowa.
    Z tego co się dowiedziałem jest to czytnik 2 ścieżki danych na której jest zapisane ok. 40 znaków, 1 znak tworzą 4 bity + 1 bit parzystości.

    Wyprowadzenia czytnika GSR-1120-12

    Czerwony - VCC (5V)
    Czarny - GND
    Pomarańczowy - CLK
    Brązowy - DATA
    Żółty - CS (Card Inserdet)

    Znalazłem tez dużo informacji
    tutaj.

    Poczyniłem kilka programów w Bascomie na ATMegę16, doszedłem do miejsca w którym dostaję ok 40 znaków, lecz za każdym razem (przesuwając tą samą kartą bankomatową) dostaję inny zestaw znaków.

    Oto mój program:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 57600
    
    Dim Ar(300) As Byte , B As Word , A As Byte
    
    _mdata Alias Pina.0
    _mcs Alias Pina.1
    _mclock Alias Pina.2
    
    Config Porta = Input
    Porta = 255
    
    Declare Sub Cardread
    
    Do
       Print " -> "
       Do
       Loop Until _mcs = 0
       Gosub Cardread
       Do
       Loop Until _mcs = 1
       Print B ; " B - "
       For A = 1 To B
          Print Ar(a) ; " "
       Next
    
       Print
    Loop
    End
    
    Sub Cardread
    Dim I As Byte , D As Byte , Bi As Bit , Ss As Bit , Es As Bit
    I = 0
    D = 0
    B = 0
    Do
    If _mclock = 0 Then
       Shift D , Right
       Waitus 20
       D.4 = Not _mdata
       If D = 11 And Ss = 0 Then
          I = 0
          Ss = 1
       Else
          Incr I
          If I = 5 Then
             I = 0
             D.4 = 0
             Incr B
             Ar(b) = D
          End If
       End If
    End If
    Do
    Loop Until _mclock = 1
    Loop Until B = 300 Or _mcs = 1
    
    
    End Sub
    


    Podgląd z okna terminala:
    Czytnik kart magnetycznych - Bascom

    Gdzie robię błąd?
    Pozdrawiam
    ElektroTME

    Dodano po 2 [godziny] 42 [minuty]:

    Problem rozwiązała prosta funkcja shiftin
    oto kod dla potomnych:

    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 57600
    
    Dim Ar(40) As Byte , B As Word , A As Byte
    
    _mdata Alias Pina.0
    _mcs Alias Pina.1
    _mclock Alias Pina.2
    
    Config Porta = Input
    Porta = 255
    
    Declare Sub Cardread
    
    Do
       Print " -> "
    
       Gosub Cardread
    
       Print B ; " B - "
       For A = 1 To B
       Ar(a) = Not Ar(a)                                        'negujemy
       Shift Ar(a) , Right , 3                                  'przesuwamy o 3 w prawo
       Ar(a).4 = 0                                              'usuwamy bit parzystości
          Print Ar(a) ; " "                                     'drukujemy do terminala
       Next
    
       Print
    Loop
    End
    
    Sub Cardread
    Dim I As Byte , D As Byte , Bi As Bit , Ss As Bit , Es As Bit
    I = 0
    D = 0
    B = 0
    Do
    Loop Until _mcs = 0
    Do
    Shiftin _mdata , _mclock , Ar(b) , 7 , 5
    Incr B
    Loop Until B = 40 Or _mcs = 1
    Do
    Loop Until _mcs = 1
    End Sub
    


    oraz dowód powtarzalnych wyników 2 kart

    Czytnik kart magnetycznych - Bascom

    40 B - 0 0 11 4 2 5 1 6 7 0 0 3 1 8 7 8 7 6 0 13 1 1 1 2 1 2 6 0 0 0 0 0 4 6 9 15 3 0 0 14
    40 B - 0 0 11 4 2 5 1 6 7 0 0 3 1 8 7 8 7 6 0 13 1 1 1 2 1 2 6 0 0 0 0 0 4 6 9 15 3 0 0 14

    40 B - 0 0 12 1 8 4 6 8 14 0 2 14 6 0 13 0 13 8 2 6 5 4 4 8 4 8 8 2 2 2 2 2 2 8 6 15 15 2 0 14
    40 B - 0 0 12 1 8 4 6 8 14 0 2 14 6 0 13 0 13 8 2 6 5 4 4 8 4 8 8 2 2 2 2 2 2 8 6 15 15 2 0 14
    40 B - 0 0 12 1 8 4 6 8 14 0 2 14 6 0 13 0 13 8 2 6 5 4 4 8 4 8 8 2 2 2 2 2 2 8 6 15 15 2 0 14
    40 B - 0 0 12 1 8 4 6 8 14 0 2 14 6 0 13 0 13 8 2 6 5 4 4 8 4 8 8 2 2 2 2 2 2 8 6 15 15 2 0 14
    40 B - 0 0 12 1 8 4 6 8 14 0 2 14 6 0 13 0 13 8 2 6 5 4 4 8 4 8 8 2 2 2 2 2 2 8 6 15 15 2 0 14

    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • #3 8497043
    ElektroTME
    Poziom 14  
    karta bankomatowa ma 3 paski magnetyczne, tutaj był odczytywany tylko 2 pasek, na nim znajduje się tylko numer kart(unikalny) i jakaś data.
    Poza tym użyta karta już dawno jest nieważna i konto bankowe też już nieaktywne.

    Teraz tylko rozszerzyć program o zapamiętywanie w eep pierwszych 40B dla 1 lub kilku kart i obsługę przekaźnika lub kilku i mamy zamek na kartę magnetyczną :D

    Cieszę sie że kod się przyda. Jeżeli będą jakieś pytania proszę pisać w Tym temacie.
  • REKLAMA
  • Pomocny post
    #4 8503272
    saper_2
    Poziom 18  
    Jak czytałeś lub nie :) karta ma sekwencje "startu" , nie pamiętam teraz jaki ma format, jest to jakiś 5bit znak, ja najpierw z czytuje cały bitstream od czytnika i potem funkcją szukam startu jak nie znajdę to "przekręcam" bufor (znaczy ostatni bit staje się pierwszym w strumieniu) i jeszcze raz szukam znaku startu, potem już tylko na podstawie tablicy (16 znaków 4bit z bitem parzystości) porównuje po 5 kolejnych bitów z tablicą i znak wrzucam do 2 bufora który pluje na USART ,aż do znaku końca.

    Nie patrzyłem w kod bo to bascom, nie pamiętam na którym zboczu clk "sampluje" linie danych - musiał byś zerknąć do kodu jak ustawiłem INT0.
    Na moim chomiku mam folder: http://chomikuj.pl/sapers_2/Elektronika/strip-card-reader w nim mam projekt czytnika na 90s8535.

    Dodano po 5 [minuty]:

    O mam coś w zakładkach na temat danych na karcie :) :
    Smart Cards - ISO7816 etc.:
    http://en.wikipedia.org/wiki/Magnetic_stripe_card
    http://www.ded.co.uk/magnetic-stripe-card-standards/
    http://www.gae.ucm.es/~padilla/extrawork/tracks.html
    http://en.wikipedia.org/wiki/Magnetic_card
  • REKLAMA
  • #6 8504026
    ElektroTME
    Poziom 14  
    Owszem komenda jest, ale nie działa na karcie bankomatowej, przynajmniej u mnie. Co do sekwencji startowej to standardowo jest to "11" ( ";", &hB lub 01011) ale sprawdziłem sobie kilka kart i są różne znaki startowe, na skasowanej karcie bankomatowej też jest numer, ale chyba bardziej losowy, jednak niepowtarzalny i nie zaczyna się od "11" a od "12"
    W moim przypadku potrzebuję tylko zapamiętać niepowtarzalny ciąg znaków dla danej karty, nie odczytuję i nie wykorzystuję konkretnych informacji.
    Niedługo zrobię sobie zamek na kartę i przedstawię kod, może w DIY.
    (Tutaj też o nim wspomnę)

    Edit: Saper - bardzo fajne linki, szczególnie drugi.
    Odemnie prezent :D
  • #7 8504621
    saper_2
    Poziom 18  
    EEEE... (wiem nie zaczyna się od "e" zdania :D ) Nie mogą być różne znaki, bo wtedy standardu by nie było. znak jest jeden , jak podajesz kod nazwany BH (start char) ma format 0b01011 (jako "bit stream" będzie 11010). Więc nie może być różny, jeśli jest to albo błąd odczytu/dekodowania albo karta nie jest bankomatową.

    Tak, wiem, czepiam się :)

    A co do projektu, jak będziesz robił obudowę to chętnie zobaczę jak ona wygląda do czytnika - jak mi się spodoba, to zmałpuję ją :P

    Wrzuciłem na chomika trochę jeszcze info o kartach co zgromadziłem kopiąc po internecie (~4Mb - parę pdf'ów i jakieś chyba projekt z avrfreaks).
  • #8 8504883
    ElektroTME
    Poziom 14  
    Dobra, poprawka:
    - mam czytnik kart magnetycznych
    - standard kart bankomatowych ma 0x0B na początku jako SS
    - natomiast skasowana karta(rzecz nie jest już bankomatową) ma na starcie 0x0C
    - Karta bp ma "%" na początku(gdzieś to przeczytałem)

    Ale rację muszę przyznać, standard obejmuje wszystkie karty tych rozmiarów, lecz jeżeli dana karta ma inną sekwencję startowa to znaczy że jest skasowana lub rozmagnesowana.
    Ja badałem te wszystkie znaczki na każdej z kart które miałem pod ręką:
    Moja aktualna(usunąłem numery):
    40 B - 0 0 11 x x x x x x x x x x x x x x x x x x x x 13 x x x x x x x x x x x x x x x x 15 x x x 14
    pierwsza karta, pewnie skasowana
    40 B - 0 0 8 2 1 8 13 0 13 1 12 0 12 8 6 13 14 8 1 13 11 0 0 4 10 0 0 5 4 4 4 4 12 0 10 14 7 0 0 14
    druga - skasowana z konta co na dole
    40 B - 0 0 12 1 8 4 6 8 14 0 2 14 6 0 13 0 13 8 2 6 5 4 4 8 4 8 8 2 2 2 2 2 2 8 6 15 15 2 0 14
    Poprawna z nieaktywnego już konta
    40 B - 0 0 11 4 2 5 1 6 7 0 0 3 1 8 7 8 7 6 0 13 1 1 1 2 1 2 6 0 0 0 0 0 4 6 9 15 3 0 0 14

    jak widać nie ma po co stosować jakieś standardy przy otwieraniu szafki, bo starej kart nie obsłuży
    Ale system odwracający strumień by się przydał, muszę pomyśleć o tym przy pisaniu programu dla zamka.
REKLAMA