티스토리 뷰
목차
[안드로이드 강좌] NFC Reader 프로그래밍 소스 (Mifare)
안드로이드 강좌 - Mifare NFC Reader 프로그래밍 기초
안드로이드 Mifare NFC의 기본 구조는 참조 링크(Mifare 카드구조)에서 확인하시고, NFC Reader로 NFC 데이터를 읽기 위해선 NDEF를 거쳐야 합니다. 이 과정은 어느 분께서 pdf(NDEF NFC Forum Spec.pdf)로 정리해 주셨으니 문서로 확인하시면 됩니다.
[안드로이드 강좌] NDEF NFC 블록 구조체
안드로이드 Mifare NFC 중 A타입은 위와 같습니다.
16개의 섹터는 각각 4개의 블럭을 보유하고 있고, 각 블록 중 3개 블록은 위와 같은 구조로 이루어져 있습니다.
[안드로이드 강좌] 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 클래스 페이지
API 10 기준으로만 봐도, 1K(A타입)와 4K(C타입)의 섹터만도 큰 차이를 나타냅니다.
즉, Mifare NFC 구조 자체가 다르므로 사용할 수 있는 메소드, 나아가 사용 방법이 달라집니다. 안드로이드에서 NFC를 다루기 위한 기본은 위의 안드로이드 강좌 개발자 사이트를 참조하면 됩니다.
안드로이드 강좌 - Mifare NFC Reader 프로그래밍 예제
[안드로이드 강좌] NFC Reader 프로그래밍 예제
위에 나온 스샷은 NFC 16개의 섹터와 각 섹터가 보유한 블럭들의 데이터입니다.
[안드로이드 강좌] imobilebbs - Android NFC 내부 구조
사이트 - Android NFC 开发教程(3): Mifare Tag 读写示例
첨부파일 - MifareDemo.zip
참고로 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. 일본어 잘하는 분들은 오히려 일본어 사이트를 참고하는 게 더 도움이 될 듯.
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)