본문 바로가기
C++ 200제/코딩 IT 정보

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

by vicddory 2017. 10. 6.

[안드로이드 강좌] 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)

댓글