티스토리 뷰

목차

    반응형

    [안드로이드 강좌] NFC Reader 프로그래밍 소스 (Mifare)


    안드로이드 강좌 - Mifare NFC Reader 프로그래밍 기초


    안드로이드 Mifare NFC의 기본 구조는 참조 링크(Mifare 카드구조)에서 확인하시고, NFC Reader로 NFC 데이터를 읽기 위해선 NDEF를 거쳐야 합니다. 이 과정은 어느 분께서 pdf(NDEF NFC Forum Spec.pdf)로 정리해 주셨으니 문서로 확인하시면 됩니다.


    NDEF NFC 블록 구조체[안드로이드 강좌] NDEF NFC 블록 구조체


    안드로이드 Mifare NFC 중 A타입은 위와 같습니다.


    16개의 섹터는 각각 4개의 블럭을 보유하고 있고, 각 블록 중 3개 블록은 위와 같은 구조로 이루어져 있습니다.


    NFC A타입 - 16개 섹터와 4개의 블럭 구조[안드로이드 강좌] NFC A타입 - 16개 섹터와 4개의 블럭 구조


    정확한 Mifare NFC 스펙과 구조는 fcd-14443-3과 fcd-14443-4의 pdf 파일에 있고, 14443은 일종의 분류 기준인데, NFC 중 A 타입은 14443으로 표기됩니다. 이것은 ISO/IEC 타입의 분류의 기준이기도 합니다.


    NXP Mifare NFC Reader 프로그래밍 참고 자료


    1. fcd-14443-3.pdf

    2. fcd-14443-4.pdf

    3. M001053_MF1ICS50_rev5_3.pdf

    그리고 NFC 타입은 안드로이드 내부에서 소스를 구성하는데에도 차이를 나타냅니다.


    개발자 사이트(MifareClassic)를 참조해보면 그 차이는 확연히 드러납니다.


    안드로이드 Mifare Classic 클래스 페이지[안드로이드 강좌] 안드로이드 Mifare Classic 클래스 페이지


    API 10 기준으로만 봐도, 1K(A타입)와 4K(C타입)의 섹터만도 큰 차이를 나타냅니다.


    즉, Mifare NFC 구조 자체가 다르므로 사용할 수 있는 메소드, 나아가 사용 방법이 달라집니다. 안드로이드에서 NFC를 다루기 위한 기본은 위의 안드로이드 강좌 개발자 사이트를 참조하면 됩니다.


    안드로이드 강좌 - Mifare NFC Reader 프로그래밍 예제


    NFC Reader 프로그래밍 예제[안드로이드 강좌] NFC Reader 프로그래밍 예제


    위에 나온 스샷은 NFC 16개의 섹터와 각 섹터가 보유한 블럭들의 데이터입니다.


    imobilebbs - Android NFC 내부 구조[안드로이드 강좌] imobilebbs - Android NFC 내부 구조



    참고로 NFC Reader 어플은 Foreground에서 구동해야 합니다.

    안드로이드 기기에서 NFC를 읽는 즉시, 타입별로 분류하여 인식해야 하기에, 아래처럼 안드로이드 프로젝트의 manifest.xml을 설정합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="net.kazzz"
          android:versionCode="1"
          android:versionName="1.0">
     
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name="NFCFeliCaReader" android:label="@string/app_name">
              <!--  
              <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
              </intent-filter>
               -->
     
              <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
              </intent-filter>
              <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                    android:resource="@xml/nfc_tech_filter"
              />
     
              <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
           </activity>
            <activity android:name="FeliCaLiteWriter"/>
         </application>
        <uses-permission android:name="android.permission.NFC" />
        <uses-feature android:name="android.hardware.nfc" android:required="true" />
    </manifest>
    cs


    위의 NFC Reader 프로그래밍 예제를 실행하여 NFC 태그를 읽은 후 결과를 확인합니다.


    만약 NFC에 데이터가 없을 경우 아래처럼 디폴트 값이 출력됩니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ffffffffffff
    a0b0c0d0e0f0
    a1b1c1d1e1f1
    a0a1a2a3a4a5 
    b0b1b2b3b4b5
    4d3a99c351dd 
    1a982c7e459a
    000000000000 
    d3f7d3f7d3f7
    aabbccddeeff
    cs


    저는 빈 NFC를 시험했을 때, 000000000이 출력되었습니다.


    이어서, NFC Reader 프로그래밍 예제로 세 가지 유형의 데이터를 출력할 수 있습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    The KeyA values for Mifare Classics are:
     
    byte[] KEY_DEFAULT
        = {(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF};
     
    For unformatted, factory fresh cards.
     
    byte[] KEY_MIFARE_APPLICATION_DIRECTORY
        = {(byte)0xA0,(byte)0xA1,(byte)0xA2,(byte)0xA3,(byte)0xA4,(byte)0xA5};
     
    For the first sector of the card
     
    byte[] KEY_NFC_FORUM =
    {(byte)0xD3,(byte)0xF7,(byte)0xD3,(byte)0xF7,(byte)0xD3,(byte)0xF7};
    cs


    이와 관련된 내용은 android.nfc.tech.MifareClassic[클릭] 패키지를 참고해 보면 자세히 알 수 있습니다.


    마지막으로 이 사이트(Android NFC 开发实例)를 참조해 보면, 구체적으로 어떻게 사용해야 하는지 브라우저상에서 확인할 수 있습니다.



    ps. [안드로이드 강좌] 포스트를 작성하며 주로 참조한 자료와 사이트


    1. 일본어 잘하는 분들은 오히려 일본어 사이트를 참고하는 게 더 도움이 될 듯.

    - 소프트웨어 기술 도큐멘트 - NFC의 기본

    - 소프트웨어 기술 도큐멘트 - NFC의 고급


    2. Android open source 제공 - NFC 소스 코드

    3. Jazoon 제공 - Jazoon_NFC.pdf

    4. 유사한 또 다른 어플 - ReadingMifare_ver_0.1.zip

    6. MFCUK – MiFare Classic Universal toolKit


    [안드로이드 강좌] NFC Reader 프로그래밍 소스 (Mifare)

    반응형