Android Application Development of NFC Reader-Writer Mode
-
Upload
chun-kai-wang -
Category
Technology
-
view
226 -
download
2
Transcript of 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
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
NFC Tags▪ NFC Tag 用於 NFC通訊中小資料的互動,可以儲存如 URL、手機號碼或其他文字資訊。NFC Forum 定義了四種不同的 Tag 類型:
▪ 除了 NFC Forum 定義的 Tag 類型外,其他廠商也提供了其他自訂的私有 Tag類型。其中,用的最廣的是 NXP的MIFARE Classic Tag。
3
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
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
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
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
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
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
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
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
Parsing NDEF Message▪ NDEF Message 是由一系列的 Records所組成。
▪ Records 可以是MIME-type media、URIs 或 RTDs (Record Type Definitions) 類型。
12
Sample Project - NFCDemo▪ 關於 NFC Tag 讀取資料解析的詳細操作方法,可以參考 Android 官方的 Sample Project。
▪ Eclipse → File → New → Other → Android → Android Sample Project → Android 4.x → NFCDemo
13
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
Creating Common Types of NDEF Records
▪ 建立 TNF_ABSOLUTE_URI型態的 Record:
▪ 建立 TNF_MIME_MEDIA型態的 Record:
▪ 使用 createMime() 靜態建構函式:
▪ 使用 NdefRecord 建構函式:
15
Creating Common Types of NDEF Records
▪ 建立 TNF_WELL_KNOWN 且 RTD_TEXT型態的 Record:
16
Creating Common Types of NDEF Records
▪ 建立 TNF_WELL_KNOWN且 RTD_URI型態的 Record:
▪ 使用 createUri(String) 靜態建構函式:
▪ 使用 createUri(Uri) 靜態建構函式:
▪ 使用 NdefRecord 建構函式:
17
Creating Common Types of NDEF Records
▪ 建立 TNF_EXTERNAL_TYPE型態的 Record:
▪ 使用 createExternal() 靜態建構函式:
▪ 使用 NdefRecord 建構函式:
18
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
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
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
Thank You!