본문 바로가기
코스웨어/15년 스마트컨트롤러

20151210 임현수 업무일지 RFID 도스 시리얼 실습

by 알 수 없는 사용자 2015. 12. 11.
728x90
반응형
■ RFID 


■ Set Output외의 프로토콜 살펴보기

▲ Baud Rate detection은 통신할 때 BaudRate가 일치해야만 응답받을 수 있다.
일치하지 않으면 응답 없다. 즉, 리더기의 baud rate를 알아내기 위해 사용하는 프로토콜이다.

▲ CPU리셋을 위한 프로토콜 (해도되고 안해도됨)

▲ 리더기의 소프트웨어 버전을 알 수 있는 프로토콜이므로 구현해야 된다.

▲ 그 외 RF Reset과 RF On/Off 프로토콜도 있다.

 GetSoftwareVersion 프로토콜 구현


u_char caString[255] =
    {
        0x05, 0x00, 0x65,
        0x00, 0x3F,

    printf("SW-REV : %02X%02X\n", caString[4], caString[5]);
    printf("D-REV   : %02X\n", caString[6]);
    printf("HW-Type : %02X\n", caString[7]);

    printf("SW-Type : ");
    switch(caString[8])
    {
        case 30:
            printf("ID ISC.M01\n");
            break;
        case 31:
            printf("ID ISC.M02\n");
            break;
        case 71:
            printf("ID ISC.PRH100–U (USB-Version)\n");
            break;
        case 72:
            printf("ID ISC.PRH100\n");
            break;
        case 73:
            printf("ID ISC.MR100–U (USB-Version)\n");
            break;
        case 74:
            printf("ID ISC.MR100 / .PR100\n");
            break;
        case 75:
            printf("ID ISC.MR200-A / -E\n");
            break;
        case 40:
            printf("ID ISC.LR100\n");
            break;
        case 41:
            printf("ID ISC.LR200\n");
            break;
        case 91:
            printf("ID ISC.LRU1000\n");
            break;
        case 80:
            printf("ID CPR.M02\n");
            break;
        case 81:
            printf("ID CPR.02\n");
            break;
        case 84:
            printf("ID CPR.M03 (586/#)\n");
            break;
    }

    printf("TR-Type : ");
    if( caString[10] & 0x80 )
    {
        printf("I-Code UID, ");
    }
    if( caString[10] & 0x40 )
    {
        printf("I-Code EPC, ");
    }
    if( caString[10] & 0x08 )
    {
        printf("ISO 15693, ");
    }
    if( caString[10] & 0x02 )
    {
        printf("Tag-it HF, ");
    }
    if( caString[10] & 0x01 )
    {
        printf("I-Code 1, ");
    }



Get Reader Info 알아서구현

■ Host command

호스트 커맨드는 PC에서 카드에있는 값을 읽거나 쓸때 쓰는 커맨드들이다.

▲ Host->Read하면 Host<-Reader로 응답하는데,
4번 바이트에 STATUS, 5번~n-2번 바이트에 데이터가 포함된다.

Host Command부터는 3번째 바이트가 B0로 고정되므로,
데이터시트에는 4번째 바이트부터 CRC 앞 바이트 까지에 대해서만 설명한다.

▲ Inventory 커맨드를 전송하면
리더기가 응답하는 타입이 3가지가 있는데 우리는 스탠다드를 본다.
데이터시트에서 봤을때 15바이트니까 + CRC2바이트 = 총길이 17바이트이다.
I-Code EPC는 16(20)바이트
I-Code UID는 27바이트.

응답데이터 타입마다 길이가 다르므로 길이를 알면 타입을 알 수 있다.
즉 우리 소스코드의 첫번째 readfile()함수에서 카드 타입을 추출할 수 있다는 뜻이다.

우리는 17바이트를 수신할테니까 8~15바이트를 체크하면 UID가 나온다.


UHF는 Ultra High Frequency

▲ TYPE_NO 에는 위의 값들 중 하나가 포함되어 있다.

DSFID - 군(family)을 분류하는 ID. 사용하지않으면 0

UID - 카드의 id가 들어있다. 

 Inventory 프로토콜 구현


UID 카드번호.
u_char caString[255] =
    {
        0x07, 0x00, 0xB0,
        0x01, 0x00,


■ Write Multiple Blocks 프로토콜

카드 내부에 메모리가 있기 때문에 Write하는 프로토콜이 사용가능한 것이다.

괄호 안의 숫자는 Address모드일 때 바이트넘버를 뜻한다.
왜냐하면 부가적인 정보가 더 필요하기 때문에, 프로토콜 길이가 길어진다.

Non-Address모드를 쓸때는 카드 대량등록의 경우이다.
예를들어 처음 교통카드를 구매하면 5천원이 들어있는것을 작업할때 사용한다고 보면 된다.
이처럼 특수한 경우가 아니고서야 보안상의 이유로 거의 Address모드를 사용한다.

Non-Address모드는 위험하기 때문에, 일반적인 단말기는 못하게 해놨다.


▲ DB-ADR을 검색해보면 위와같은 정보가 나오는데 ANNEX G를 참조하라고 되어있다.
그에 따라 ANNEX G를 참조하면..

112쪽

5~15까지 데이터블록(DB-ADR)으로 사용할 수 있음을 알 수 있다.

DB-SIZE는 제조사에 달려있다.

미구현 프로토콜

stay quiet
Lock Multiple Blocks


728x90