22
Android NFC 讀寫模式開發 Android Application Development of NFC Reader-Writer Mode Chun-Kai Wang (王雋凱) IDSL - Dept. of IM - NTUST

Android Application Development of NFC Reader-Writer Mode

Embed Size (px)

Citation preview

Page 1: Android Application Development of NFC Reader-Writer Mode

Android NFC 讀寫模式開發Android Application Development of NFC Reader-Writer Mode

Chun-Kai Wang (王雋凱)

IDSL - Dept. of IM - NTUST

Page 2: Android Application Development of NFC Reader-Writer Mode

NFC Reader/Writer Mode

▪ Description from Android Developers:

▪ “Reader/writer mode, allowing the NFC device to read and/or write passive NFC tags and stickers.”

2

Page 3: Android Application Development of NFC Reader-Writer Mode

NFC Tags▪ NFC Tag 用於 NFC通訊中小資料的互動,可以儲存如 URL、手機號碼或其他文字資訊。NFC Forum 定義了四種不同的 Tag 類型:

▪ 除了 NFC Forum 定義的 Tag 類型外,其他廠商也提供了其他自訂的私有 Tag類型。其中,用的最廣的是 NXP的MIFARE Classic Tag。

3

Page 4: Android Application Development of NFC Reader-Writer Mode

Types of NFC Tag

NFC Forum PlatformNXP Specific

Platform

Type 1 Tag Type 2 Tag Type 3 Tag Type 4 TagType MIFARE

Classic Tag

Compatible Products

Broadcom Topaz

NXP MifareUltralight, NXP MifareUltralight C, NXP NTAG203

Sony FeliCa NXP DESFire / NXP SmartMX-JCOP

NXP MIFARE Classic 1k / NXP MIFARE Classic 4k / NXP MIFARE Classic Mini

Memory Size 96 Bytes 48 Bytes / 144 Bytes

1, 4, 9 KB 4 KB /32 KB 768 Bytes / 3584 Bytes / 192 Bytes

Unit Price Low Low High Medium I High Low

Data Access Read/Write or Read-Only

Read/Write or Read-Only

Read/Write or Read-Only

Read/Write or Read-Only

Read/Write or Read-only

4

Page 5: Android Application Development of NFC Reader-Writer Mode

NDEF▪ NFC Data Exchange Format

▪ NDEF是 NFC Forum所定義的NFC 資料交換格式通用標準。

▪ NFC tag中的 NDEF資料是封裝在一個 NDEF message裡面。

▪ NDEF message 內部可以有一個或多個 record。

▪ NDEF 的功能:

▪ 從 NFC Tag 讀取 NDEF 資料。

▪ 從一個 NFC裝置傳送 NDEF資料到另一個 NFC裝置。

5

Page 6: Android Application Development of NFC Reader-Writer Mode

How Android handles NFC Tag▪ NDEF Record 的第一位元組包含:

1. 3-bit TNF (Type Name Format):決定 Type 欄位的格式。

2. Variable length type:TNF欄位的值決定此欄位的資料格式。

3. Variable length ID:Record的 ID編號,通常不需要設定。

4. Variable length payload:用來儲存實際的資料,NDEF message的資料可以分開儲存在多個 record中。

6

Page 7: Android Application Development of NFC Reader-Writer Mode

How Android handles NFC Tag (Cont.)

▪ 當 Android 裝置偵測到 NFC tag 時,開始分析從 NFC tag 中取得的資料。

▪ 利用 Tag dispatch system透過 TNF與 Type 兩個欄位嘗試去配對 NDEF message 符合MIME type或URI:

▪ 如果配對成功,系統會封裝這些資訊至 ACTION_NDEF_DISCOVERED型態的 intent 物件。

▪ 如果配對不成功或是 NFC tag不包含NDEF data造成無法配對,系統會再倒給 ACTION_TECH_DISCOVERED進行配對。

▪ 如果沒有配對成功再退給ACTION_TAG_DISCOVERED。

7

Page 8: Android Application Development of NFC Reader-Writer Mode

Supported TNFsType Name Format (TNF) Mapping

TNF_ABSOLUTE_URI Type欄位資料是 URI 資料

TNF_EMPTY Android 系統會以 ACTION_TECH_DISCOVERED 的方式處理

TNF_EXTERNAL_TYPE

Type欄位資料格式為:URN 類型的 URI。 URN被編碼放入NDEF type欄位,符合一個字段格式:

<domain name>:<service name>Android系統轉譯成:

vnd.android.nfc://ext/<domain name>:<service name>。

TNF_MIME_MEDIA Type欄位是描述MIME的型態

TNF_UNCHANGED第一個 Record 為無效的Android 系統會以 ACTION_TECH_DISCOVERED 的方式處理

TNF_UNKNOWN Android系統會以 ACTION_TECH_DISCOVERED 的方式處理

TNF_WELL_KNOWN 設定在 type field中的 MIME type 或 URI,是取決於 Record Type Definition (RTD)

8

Page 9: Android Application Development of NFC Reader-Writer Mode

Supported RTDs (for TNF_WELL_KNOWN)

Record Type Definition (RTD) Mapping

RTD_ALTERNATIVE_CARRIER Android系統會以 ACTION_TECH_DISCOVERED 的方式處理

RTD_HANDOVER_CARRIER Android系統會以 ACTION_TECH_DISCOVERED 的方式處理

RTD_HANDOVER_REQUEST Android系統會以 ACTION_TECH_DISCOVERED 的方式處理

RTD_HANDOVER_SELECT Android系統會以 ACTION_TECH_DISCOVERED 的方式處理

RTD_SMART_POSTER Payload 欄位是 URI

RTD_TEXT MIME 型態是 text/plain.

RTD_URI Payload 欄位是 URI

9

Page 10: Android Application Development of NFC Reader-Writer Mode

Reading NDEF-formatted Tag▪ 讀取 NFC Tag 的操作主要包含以下步驟:

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

// 1. 定義 Tag 物件Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

// 2. 取得 NDEF Message// your code in here...

// 3. 解析 NDEF Message// your code in here...

// 4. 真實資料展示和進一步操作// your code in here...

}

10

Page 11: Android Application Development of NFC Reader-Writer Mode

Getting NDEF Message from Tag▪ Android 裝置掃描到的 NFC Tag 資料會以兩種方式儲存在 Intent :

▪ EXTRA_TAG:表示是一個 Tag 型態的物件。

▪ EXTRA_NDEF_MESSAGES:表示是 NDEF型態的資料。

▪ 以下程式碼先檢查接收到的 Intent 是否為 ACTION_NDEF_DISCOVERED,然後取出 EXTRA_NDEF_MESSAGES 形式的資料。

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent().getAction())) {Parcelable[] rawMsgs =

intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);if (rawMsgs != null) {

msgs = new NdefMessage[rawMsgs.length];for (int i = 0; i < rawMsgs.length; i++) {

msgs[i] = (NdefMessage) rawMsgs[i];}

}}

//process the msgs array

11

Page 12: Android Application Development of NFC Reader-Writer Mode

Parsing NDEF Message▪ NDEF Message 是由一系列的 Records所組成。

▪ Records 可以是MIME-type media、URIs 或 RTDs (Record Type Definitions) 類型。

12

Page 13: Android Application Development of NFC Reader-Writer Mode

Sample Project - NFCDemo▪ 關於 NFC Tag 讀取資料解析的詳細操作方法,可以參考 Android 官方的 Sample Project。

▪ Eclipse → File → New → Other → Android → Android Sample Project → Android 4.x → NFCDemo

13

Page 14: Android Application Development of NFC Reader-Writer Mode

Writing NDEF-formatted Tag▪ 寫入 NFC Tag 的操作主要包含以下步驟:

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

// 1. 定義 Tag 物件Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

// 2. 建立 NDEF Record // your code in here...

// 3. 建立 NDEF Message (包含一或多個 NDEF Record)// your code in here...

// 4. 將 NDEF Message 寫入 Tag// your code in here...

}

14

Page 15: Android Application Development of NFC Reader-Writer Mode

Creating Common Types of NDEF Records

▪ 建立 TNF_ABSOLUTE_URI型態的 Record:

▪ 建立 TNF_MIME_MEDIA型態的 Record:

▪ 使用 createMime() 靜態建構函式:

▪ 使用 NdefRecord 建構函式:

15

Page 16: Android Application Development of NFC Reader-Writer Mode

Creating Common Types of NDEF Records

▪ 建立 TNF_WELL_KNOWN 且 RTD_TEXT型態的 Record:

16

Page 17: Android Application Development of NFC Reader-Writer Mode

Creating Common Types of NDEF Records

▪ 建立 TNF_WELL_KNOWN且 RTD_URI型態的 Record:

▪ 使用 createUri(String) 靜態建構函式:

▪ 使用 createUri(Uri) 靜態建構函式:

▪ 使用 NdefRecord 建構函式:

17

Page 18: Android Application Development of NFC Reader-Writer Mode

Creating Common Types of NDEF Records

▪ 建立 TNF_EXTERNAL_TYPE型態的 Record:

▪ 使用 createExternal() 靜態建構函式:

▪ 使用 NdefRecord 建構函式:

18

Page 19: Android Application Development of NFC Reader-Writer Mode

Creating NDEF Message▪ 準備好 NDEF Records 之後,就可以建立 NDEF Message 將 Records 包裝起來:

▪ 如果要在 NDEF Message 中放入多個 Records,可參考以下程式碼:

NdefMessage msg = new NdefMessage(

new NdefRecord[] { ndefRecord });

NdefRecord[] ndefRecord1 = new NdefRecord(...);

NdefRecord[] ndefRecord2 = new NdefRecord(...);

NdefRecord[] ndefRecord3 = new NdefRecord(...);

NdefMessage msg = new NdefMessage(

new NdefRecord[] { ndefRecord1, ndefRecord2, ndefRecord3 });

19

Page 20: Android Application Development of NFC Reader-Writer Mode

Writing to an NDEF Tag▪ 以下是將 NDEF Message 寫入 NDEF Tag 的簡單範例:

Ndef ndef = Ndef.get(tag);

if (ndef.isWritable()

&& ndef.getMaxSize() > ndefMessage.toByteArray().length) {

ndef.connect();

ndef.writeNdefMessage(ndefMessage);

ndef.close();

}

20

Page 21: Android Application Development of NFC Reader-Writer Mode

Useful Third-Party Libraries

▪ NDEF Tools for Android▪ NDEF object representation library (no more byte arrays!)

▪ Simple conversion to and from Android SDK low-level equivalent

▪ NFC utility library. Abstract activities for:

▪ Detecting and reading messages

▪ Writing to tags

▪ Beaming (pushing) to other devices

▪ https://code.google.com/p/ndef-tools-for-android/

21

Page 22: Android Application Development of NFC Reader-Writer Mode

Thank You!