2017-10-11

[NFC] NDEF (NFC Data Exchange Format) 內容初步解析

Hi 大家好,最近工作上的需要快速認識NFCNDEF的定義,因此這邊比較像是針對工作上做個筆記備忘。

[前言]

1.     關於NFC的科普可以直接透過 wiki 初步認識一下,本篇文章主要專注於讀卡機模式(Reader/Writer mode

2.     請務必事先閱讀今天,你NFC了沒? 這網站介紹的NFC Type Tag基本概觀

[操作]

1.     這邊是透過CR95 (Reader) ,讀取我們產品的NFC tagNFC forum Data Area部分,如圖所示:
PS. 避免機密外洩,圖中黑色遮住的部分是 NDEF Payload 部分,

2.     這邊是透過產品 Console dump出來的NFC tag內容,如圖所示:

3.     承上題,console dump出來的格式是透過NDEF NFC去實現的,先看不懂印出來的格式沒關係,這邊是確保我們可以驗證 CR95讀取和console dump是否一致?

[解說]

這兒簡單介紹一下剛才所提到的內容,全都是16進制:
0xE1 0x40 0x40 0x05                                                         /* Capability Container */
0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74           /* NDEF Message TLV */
0x** 0x** 0x** ……                                                        /* Payload of NDEF Message TLV */

另外NFC Tagmemory map如圖下:

PS. 本文章的NFC Tag沒有Lock Control TL Memory Control TLV
,不同類型的晶片實現方式隨之不同,這邊我們重點放在NDEF

/* Capability Container */

如圖藍色框框部分是Capability container,內容如下:

0xE1 0x40 0x40 0x05
ð 0xE1表示採用NFC Forum標準,0x40表示版本號碼4.0,若版本號碼3.1此值為0x31

0xE1 0x40 0x40 0x05
ð 0x40 表示記憶體容量,0x40等於十進制64,表示64 * 8bits = 512 bytes

0xE1 0x40 0x40 0x05
ð 0x05的前四個位元是表示讀取記憶體機制,後四個位元是表示寫入機制,這邊不是很確定內容意義為何,這邊先保留

   

/* NDEF Message TLV */

如圖紅色框框部分是 NDEFMessage TLV,內容如下:

0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74
ð 0x03表示採用控制資料類型碼是 NDEF 的訊息區塊,0x98表示此 NDEF Message TLV內所有的Record (Header + Payload) 長度共152 bytes,如範例所示我們 NDEF Message TLV 包含兩個 Records,這邊只介紹第一個 Record,爾後 Record 以此類推

0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74
ð 0x92這邊是NDEF Message RecordHeader,可表示成二進制: 10010010,對照如下

Flag
Value
Description
MB
1
1表示第一筆Record
ME
0
0表示非最後一筆Record
CF
0
0表示不是長訊息
SR
1
1表示短紀錄格式,此payload長度不超過254 bytes
IL
0
0表示ID LENGTHID被省略。這邊對範例來說不重要,可略過
TNF
0
1
0

0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74
ð 0x04表示Type Length,表示0x74 0x65 0x78 0x74 的長度為4 bytes,這邊可以看成ASCII的"TEXT",表示文字。至於0x61指的是此RecordPayload 長度為97 bytes

還記得剛才前面的圖嗎? Record的長度為104 bytes算法是這樣子的
0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74 0x** 0x** 0x** ……..
ð 0x92 0x04 0x61 0x74 0x65 0x78 0x74 7 bytes
ð 0x** 0x** 0x** …….. Payload97 bytes
ð 7 bytes + 97 bytes = 104 bytes

[總結]

我們第二個Record長度48 bytes,細節就不再贅述。因此本範例NDEF MessageRecord長度總共:
ð 104 bytes (1st Record) + 48 bytes (2nd Record) = 152 bytes


0x03 0x98 0x92 0x04 0x61 0x74 0x65 0x78 0x74 0x** 0x** 0x** …….
ð 104 bytes 的16進制為0x98,所以才會有0x98的存在
ð 152 bytes 的16進制為0x98所以才會有0x98的存在 (update: 2017/10/11)

這邊工作紀錄就提供大家參考,開發之前的Know How真的很花時間:( 謝謝。

Jhanggj 2017/10/10 in Taipei

沒有留言: