4년 쯤 전에 미국 출장을 갔을 때  TV에서 한창 선전을 하던 아이폰 악세사리가 있습니다. 바로 아이폰용 신용카드 리더기/결재앱 이었습니다. 당시에는 마그네틱 카드를 읽으려면 대단한 장비가 필요한줄 알았는데 저리 작은 모듈로 가능하다는 것이 신기했었죠.

그래서 좀 찾아보니 이제는 마그네틱 카드 리더기도 쉽게 구매해서 아두이노로 테스트 해볼 수 있네요. 굳이 신용카드 결재 시스템을 만들지 않더라도 다양한 아이디어를 접목해서 사용해 보실 수 있는 모듈입니다.

cardreader

카드 리더기는 대부분 PS/2 또는 USB 포트를 이용한 통신을 지원하고 연결된 장비에서 ‘키보드’ 또는 이와 유사한 장치로 인식됩니다. 그래서 마치 키보드로 데이터를 입력하는 것처럼 카드에서 읽은 데이터를 보내주게됩니다.

Aliexpress 등에서 저렴한 가격으로 파는 카드 리더기(쓰기가 가능한 제품도 있음!!)가 있으니 이걸 살짝 손봐서 사용해도 좋을 것 같습니다. 전 Adafruit 에서 판매하는 PS/2 방식의 제품을 구해서 테스트를 해봤습니다. 그래서 일단 PS/2 방식의 제품을 기준으로 설명하도록 하겠습니다.

카드에서 데이터를 읽는다는게 일견 어려워 보이지만 생각보다 쉽게 카드 데이터를 읽을 수 있습니다.

연결 방법

제가 가진 카드 리더기는 PS/2 소켓이 암-수 2개가 달려 있습니다. 둘 중 숫(male)소켓을 사용해야 합니다.

20151204_235730

PS/2 소켓에 달린 6개의 핀은 아래와 같은 용도로 사용됩니다. 아두이노와 연결해서 데이터를 읽을 예정이기 때문에 소켓에서 데이터 핀과 전원핀, 도합 4개의 핀을 확인하면 됩니다.

42-PS2Connector

숫 소켓의 4개 핀만 아두이노에 연결합니다. 5V, GND 핀은 전원용이고 Data, Clock(IRQ) 핀이 데이터 통신용입니다.

  • 카드리더기 –> 아두이노
  • 5V –> 5V
  • GND –> GND
  • Data –> D2
  • Clock –> D3

Clock 핀을 IRQ 라고도 표기하는데 Interrupt Request 줄임말입니다. 즉, Clock 핀으로 먼저 데이터를 보내겠노라 신호를 보내고 실제 데이터를 Data 핀으로 보내줍니다. 따라서 데이터를 받는 아두이노측에서는 Clock 핀을 인터럽트 핀에 연결해서 신호가 올 때 데이터를 받도록 하면 됩니다. 아두이노의 인터럽트 핀은 D2, D3 핀입니다.

결론은 Data 핀은 원하시는 디지털 핀에 연결하고 Clock 핀은 D2, D3에 꼭 연결하시라는 겁니다.(아두이노 UNO 보드 기준)

이걸로 연결 끝. 카드 데이터를 읽을 하드웨어 준비는 끝입니다.

팁!!! 숫 소켓의 핀과 아두이노를 연결할 때 브레드 보드용 점퍼선(dupont cable)을 살짝 개조해서 사용하세요. 아래처럼 케이블 끝에 달린 플라스틱 커버를 벗겨내고

20151206_00174dd7

테이프로 합선되지 않도록 끝을 감싸주세요.

20151206_002202

그리고 숫 소켓의 핀에 꽂아서 사용하시면 됩니다.

20151206_002557

라이브러리 설치

다행스럽게도 PS/2 키보드가 보내주는 데이터를 읽을 수 있는 아두이노용 라이브러리가 개발되어 있습니다. 아래 링크를 통해 PS2Keyboard 라이브러리를 받아 설치해줍니다.

Download: PS2Keyboard.zip (version 2.4)

출처 : http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html

라이브러리를 개발한 PJRC 페이지에서 키코드 등 상세 내용을 확인하세요.

테스트

설치한 라이브러리에 예제코드도 포함되어 있습니다. examples 폴더 내부에 Simple_Test 예제를 불러와서 아두이노에 업로드하면 카드리더기가 읽은 값을 Serial로 출력해줍니다.

업로드 하기 전, 아래 소스코드 중 DataPin, IRQpin 값을 자신의 연결 상태에 맞게 수정해줍니다. 제 경우엔 D2, D3에 연결 했으므로 2, 3으로 변경해 줬습니다.

#include <PS2Keyboard.h>

const int DataPin = 2;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  Serial.println("Keyboard Test:");
}

업로드가 완료되면 아두이노 IDE에서 시리얼 모니터를 켜두고 신용카드, 직불카드 등등… 마그네틱 카드를 긁어보세요. 시리얼 모니터에 읽은 코드값이 표시될 겁니다.

test_result

2종의 직불, 신용카드를 긁어보니 일련의 숫자와 문자가 주르륵 표시됩니다. 제가 테스트 한 카드 리더기는 3개의 트랙 정보를 읽어서 표시해줍니다. 카드 리더기 종류, 신용카드의 종류에 따라 2개의 트랙만을 읽기도 합니다.

표시되는 정보는 아래의 구조로 나누어 분석하시면 됩니다.

Track 1, Format B:

  • Start sentinel — one character (generally ‘%’)
  • Format code=”B” — one character (alpha only)
  • Primary account number (PAN) — up to 19 characters. 신용카드 고유 숫자
  • Field Separator — one character (generally ‘^’)
  • Name — 2 to 26 characters, 본인 이름 혹은 회사 이름, 관련 정보 등
  • Field Separator — one character (generally ‘^’)
  • Expiration date — four characters in the form YYMM. 사용 기한
  • Service code — three characters. 링크의 서비스 코드 상세 내용 참고
  • Discretionary data
    • may include Pin Verification Key Indicator (PVKI, 1 character)
    • PIN Verification Value (PVV, 4 characters)
    • Card Verification Value or Card Verification Code (CVV or CVC, 3 characters)
    • 이 부분은 아두이노에서 얻는 데이터와 약간 다름. 실제로는 더 긴 데이터가 들어옴.
  • End sentinel — one character (generally ‘?’)
  • Longitudinal redundancy check (LRC) — it is one character and a validity character calculated from other data on the track. ==> 제가 테스트 할 때 이 정보는 표시되지 않음

Track 2: This format was developed by the banking industry (ABA). This track is written with a 5-bit scheme (4 data bits + 1 parity), which allows for sixteen possible characters, which are the numbers 0-9, plus the six characters : ; < = > ? . The selection of six punctuation symbols may seem odd, but in fact the sixteen codes simply map to the ASCII range 0x30 through 0x3f, which defines ten digit characters plus those six symbols. The data format is as follows:

Track2 도 Track 1 과 유사한 형태를 갖습니다. 링크의 자료를 참고하세요.

20151204_235448xx

카드 리더기는 다양한 인증 수단으로 활용할 수 있는 잠재력이 풍부한 모듈인 것 같습니다. Aliexpress 등에서 구매하면 싼 가격에 카드 리더기 입수해서 활용하실 수 있습니다!!

참고자료