article-img
更新時間2024-09-08 22:48:28

NDEF進入NFC世界的任意門 之 1

NFC的手機與 NFC標籤(TAG) 之所以可以達到許多網際連接與互動訊息,就是依靠解析存放在TAG記憶體內NDEF訊息區塊的資料,所得到的指示與行動。



你大概也知道,現在市面上的智慧型手機,有著不同的作業系統(OS);就像 APPLE 的 iPhone 是 iOS、Google的手機用 Android;而不同廠牌的手機,就算是都以 Android 為主,也都還會有一些小小的差異。如果要讓不同廠牌、甚至不同作業系統的 NFC手機之間,都可以讀取同一個 NFC標籤,來共享信息的交換的話,就必須制定出一套標準,如同網頁的 HTML 語法。



這就是 NFC協會所制定 NDEF 規範的目的:『即便是使用不同的NFC的手機,都可以用來讀取 NFC標籤的資料。而之所以可以完成網際連接與互動訊息的傳遞,就是依靠解析存放在標籤記憶體內 NDEF 訊息區塊的資料,所得到的指示與行動。』 基本上, NDEF 訊息的複雜程度和存放記憶體的容量大小,有著一定的關係。 這意味著只要有足夠的容量,可以設定不只是網際資源的連接,還可以包含自行定義特殊格式(Proprietary)的資料。當然,這些自行定義的資料,還是需要開發特定的App來解讀。



在標準的 NDEF 訊息區塊內所描述的 資源記錄(Record) 可以不只一筆(如 圖1 ),但均需符合 NFC協會的記錄類別標準 (RTD; Record Type Definition) 文件裡所定義的規範。



NFC的手機與NFC標籤之所以可以達到許多網際連接與互動訊息,就是依靠解析TAG的NDEF...

this is a text description




圖1. NDEF訊息的基本格式



NDEF的記錄格式



在 NFC協會所定義簡單的資源記錄(Record)中,如:文字記錄 (RTD_TEXT)、資源定址記錄 (RTD_URI)或是 MIME媒體位址記錄 (Media Recoed),大都只包含單獨的一筆記錄。 而較複雜的 智慧型海報記錄 (RTD_SMART_POSTER) 與 數位簽章記錄 (RTD_SIGNATURE),則可以包含多筆的記錄來組成。 



這些所謂不同類別的記錄,均以同一種格式,但其內的資料長度可能不同的方式來描述;為了能達到完整描述一連串的資料,均採用 表頭(Header)+ 資料內容(Payload) 的格式來進行;而這裡所謂的表頭,其實是指這筆記錄的 類別與型式 (Flags & TNF);每一筆記錄資料內容的長度,就由 表頭 這個位元組來定義,並依此決定其後所存在的欄位組成。



一筆正常的記錄其資料格式如 圖2 所示:大致包含有此記錄類別名稱的長度 (TYPE_LENGTH)、最多有4個位元組的資料內容長度 (PAYLOAD_LENGTH3~0)、資源標識碼的長度 (ID_LENGTH)、類別名稱 (TYPE_NAME)、資源標識碼 (ID)與資料本身的內容 (DATA PAYLOAD)。



this is a text description




圖2. 只含單筆資源紀錄的NDEF訊息格式



圖2 這筆紀錄內,標示前往某特定網站的網址連結:『https://reactnative.dev/』



$ 
$ 
NDEF的靈魂:表頭



現在回顧一下,在 圖1 所顯示是由3筆 NDEF 紀錄所組成的訊息,我們來看看怎麼由各紀錄的表頭裡的各個功能位元(Bit)來把每筆紀錄串起來。在表頭的前兩個功能位元(Bit7, Bit6),分別為:

  • MB (Message Begin) MB=1; 表示為訊息的第一筆記錄。
  • ME (Message End) ME=1; 表示為訊息的最後一筆記錄。

所以,如果訊息僅含一筆記錄,則該筆紀錄的表頭的 MB=1, ME=1;如果是圖中的多筆紀錄型態,第一筆的紀錄表頭的 MB=1, ME=0,這樣我們知道這是開頭的第一筆,因為ME=0就表示後面還有紀錄;再來看第二筆紀錄的表頭的 MB=ME=0,明顯地說明後面還有紀錄;最後,第三筆紀錄的表頭的 MB=0, 但ME=1,表示已經到了最後一筆紀錄。你有沒有發現,訊息本身並沒有什麼欄位明顯指名訊息裡有多少筆紀錄,所以當循序一筆一筆資料爬進來的同時,一邊解析的同時也要進行統計。再來,看看其他的功能位元:

  • CF (Chunked Message) CF=1; 表示為分段訊息,表示這個標籤內容,僅為一個超長訊息的其中一部分訊息;其他部分則存在其他的標籤中。
  • SR (Short Record) SR=1; 表示為短記錄型式,PAYLOAD_LENGTH僅以單一位元組來定義,表示其後資料內容長度將不超254個位元組。 SR=0; 表示資料內容的長度將以4個位元組來表示。
  • IL (ID Length) IL=1; 表示會有ID長度標示的位元組;反之,IL=0; 表示ID LENGTH與ID均被省略。

而最後的3個位元組合成所謂的TNF:

  • TNF (Type Name Format) 在NDEF訊息裡的每筆記錄,都先必須在記錄的表頭宣告其形態的名稱,而這些名稱又分成幾類的名稱格式 (Type Name Format):

- 0x00 Empty Record; 僅有此狀態位元組。

- 0x01 Well_Known Record;  (TEXT, URI(http, https, sms, mailto...), SmartPoster, Signature)

- 0x02 MIME Media Record; MIME所定義的媒體記錄

- 0x03 Absolute URI Record; 絕對URI記錄

- 0x04 External Record; Domain名稱+“:”+類形名稱

- 0x05 Unknown Record; TYPE_LENGTH=0且TYPE被省略。

- 0x06 Unchanged Record; TYPE_LENGTH=0且TYPE被省略。$ 
$ 
$ 
$ 
$ $ $ $ 
$ 

$ 
$ 
$ $ 
$ 


Share: