本章所涉及的源代碼檔案名及位置
·ForegroundDispatch.java
development/samples/ApiDemos/src/com/example/android/apis/nfc/ForegroundDispatch.java
·Beam.java
development/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java
·NfcService.java packages/apps/Nfc/src/com/android/nfc/NfcService.java
·P2pLinkManager.java
packages/apps/Nfc/src/com/android/nfc/P2pLinkManager.java
·NativeNfcManager.java
packages/apps/Nfc/nxp/src/com/android/nfc/dhimpl/NativeNfcManager.java
·P2pEventManager.java
packages/apps/Nfc/src/com/android/nfc/P2pEventManager.java
·SnepServer.java packages/apps/Nfc/src/com/android/nfc/SnepServer.java
·NfcDispatcher.java
packages/apps/Nfc/src/com/android/nfc/NfcDispatcher.java
·SendUi.java packages/apps/Nfc/src/com/android/nfc/SendUi.java
·SnepClient.java packages/apps/Nfc/src/com/android/nfc/SnepClient.java
NFC Forum的職責和Wi-Fi Alliance類似,它不但負責制定NFC相關的技術标準,同時還
通過NFC認證測試①來保證各廠家的NFC産品符合NFC規範。
從原理上說,NFC和Wi-Fi類似,二者都利用無線射頻技術來實作裝置之間的通信。不
過,和Wi-Fi相比,NFC的工作頻率為13.56MHz,有效距離為4cm左右,目前所支援的數
據傳輸速率有106kbps、212kbps和424kbps三種。
RFID技術路線,即無線射頻識别技術(圖左邊)。該技術路線發源于條形碼
(Barcodes),然後發展出了RFID,最終出現了NFC中的兩個重要元件NFC Tag(标
簽)和NFC Reader。NFC Tag的作用和Barcodes類似,它是一種用于存儲資料的被動式
(Passive)RFID Tag,其最重要的特征就是NFC Tag自身不包含電源元件,是以它工作
時必須依靠其他裝置(比如NFC Reader)通過電磁感應的方式向其輸送電能。和NFC Tag
相對應的元件是NFC Reader,它首先通過電磁感應向NFC Tag輸送電能使其工作,然後根
據相關的無線射頻通信協定來存取NFC Tag上的資料。
由圖8-2可知,從使用者角度(即圖中的Applications層之上)來看,NFC有三種運作模
式(operation mode)。Application之下的三個箭頭描述了三種運作模式所使用的協定棧。
·Reader/Write模式:簡稱R/W,和NFC Tag/NFC Reader相關。
·Peer-to-Peer模式:簡稱P2P,它支援兩個NFC裝置互動。
·NFC Card Emulation模式:簡稱CE,它能把攜帶NFC功能的裝置模拟成Smart
Card,這樣就能實作諸如手機支付、門禁卡之類的功能。
Type A、B和F主要差別在于RF層的信号調制解調方法、傳輸速率及資料編碼方式上。
RF層之上是Mode Switch,用于确定對端NFC Device的類型并選擇合适的RF層協定
與之通信。
由圖8-3所示的NFC Forum規範架構可知,NFC Forum本身隻定義了P2P模式和R/W
模式相關的規範。CE模式比較複雜。
在RF層,NFC Forum定義了三個主要規範。
·Analog Specifications:該規範描述了NFC裝置RF層的電氣特性。
·Digital Protocal Specification:該規範在ISO 18092、ISO 14443及JIS X6319-
4之上定義了NFC裝置之間的數字通信協定,它使得基于不同底層協定例如Type A或Type
F的NFC裝置之間或者NFC裝置與其他使用ISO 18092等規範的裝置之間能夠互動。
·NFC Activities Specification:該規範為各運作模式對應的協定棧提供支援,例如
P2P模式下兩個NFC裝置如何建立連結,R/W模式下NFC Device如何操作NFC Tag。
圖8-3最上層的Reference Applications表示NFC Forum在應用層面所定義的一些規
範。目前有兩個規範。
·Connection Handover:兩個NFC裝置通過它來協商用藍牙或Wi-Fi來開展後續的
資料傳輸工作。
·Personal Health Device Communication:該規範定義了如何利用NFC技術在個
人健康裝置之間交換資料資訊。
另外,除了圖8-3所示的規範外,NFC還制定了一個NCI(NFC Controller
Interface)規範,該規範制定了一套互動接口,使得主機裝置(Device Host,以手機為
例,NFC晶片被內建到某個手機中,那麼手機就是Device Host)能夠使用這套接口來和
NFC晶片互動。
8.2.2 NFC R/W運作模式
·左邊的智能終端扮演NFC Reader角色。位于其内部的NFC晶片包含NFC
Controller、Antenna(天線)和Contactless Front-End 三個部分。注意,圖中所示的SWP等内容将在8.2.4節介紹。
NFC控制器,它可與Device Host或Secure Element安全單元互動;
CLF,非接觸式前端,負責射頻信号的調制解調等工作;
在R/W模式中,互動操作的發起方隻能是NFC Reader,是以它也稱為Initiator或Active Device。
·右邊的NFC Tag,由于需要NFC Reader通過電磁感應為其提供電能,是以在R/W模式中,NFC Tag隻能作為互動操作的Target(也稱為Passive Device)。
NFC Forum定義了四種類型的Tag,分别為Type 1、Type 2、Type 3和Type 4。這
四種類型NFC Tag的差別在于存儲空間大小、資料傳輸率以及底層使用的協定。
NFC Forum定義了兩個通用的資料結構用于NFC Device之間(包括R/W模式中的
NFC Reader和NFC Tag)傳遞資料。這兩個通用資料結構分别是NFC Data Exchange
Format(NDEF)以及NFC Record。
由于NFC本身源自RFID技術,二者在一些底層協定上也互相相容,是以很多RFID Tag也能被NFC
Reader識别和操作。
雖然NFC Tag有四種不同類型(由上文可知,實際上能被NFC Reader讀寫的RFID
Tag還遠不止四種),但為了保證最大相容性,NFC Forum建議NFC裝置之間盡量使用通
用資料結構NDEF和NFC Record來交換資訊。
1.NDEF和NFC Record
(1)NDEF和NFC Record[8][9]之間的關系
根據NFC Forum的定義,R/W模式下,NFC裝置之間每一次互動的資料都會封裝在一
個NDEF Message中,而一個NDEF Message可以包含多個NFC Record,真正的資料則
封裝在NFC Record中。圖8-5展示了NDEF Message和NFC Record之間的關系。
在一個NDEFMessage中,第一個NFC Record需設定其MB位(Message Begin)為1,表示它是該消
息中第一個NFC Record,最後一個NFC Record需設定ME位(Message End)位為1,表
示它是此消息中最後一個NFC Record。
NFC Record本身的組織結構如圖8-6所示。NFC Record分為NFC Record
Header(頭部資訊)和Payload(資料載荷)兩大部分。
Record Header中最重要的是其第一位元組。該位元組有6個标志資訊,分别如下。
·MB(Message Begin标志)
·ME(Message End标志)
·CF(Chunk Flag标志,表示該Record是否為分片Record)
·SR(Short Record标志。如果該标志被設定,則圖中的4個Payload Length字段僅
需一個,這表明Payload資料長度将限制在255位元組以内)
·IL(ID_LENGTH标志,它用于指明Header中是否包含ID Length和ID這兩個字段)
·TNF(Type Name Format标志,用于指明Payload的類型,NFC Forum定義了一
些常用的Payload類型,詳情見下文分析)
其他位元組如下。
·Type Length指明Record Header中Type字段的長度。
·Payload Length 3~Payload Length 0這4個字段共同指明Payload字段的長度。
如果SR标志被設定,則Record Header僅包含一個Payload length字段。
·ID Length指明ID字段的長度。如圖所示IL标志未設定,則ID Length和ID字段都
不存在。
·Type字段表明Payload的類型,NFC Forum定義了諸如URI、MIME等類型的
Type,其目的是友善不同的應用來處理不同Type的資料,例如URI類型的資料就交給浏覽
器來處理。
·ID需要配合URI類型的Payload一起使用,它使得一個NFC Record能通過ID來指向
另外一個NFC Record。
(2)TNF和RTD
TNF用于描述一個NFC Record中資料(Payload)的類型,為了友善應用程式能正确
解析NFC Record中的資料,NFC Forum規定了一些常用的資料類型,如表8-2所示。
目前NFC支援七種資料類型。
·Empty:表示該Record中沒有資料,即相當于一個空的NFC Record。
·NFC Forum Well-Known Type:由NFC Forum定義的一些較為常用的資料類
型,包括URI、TEXT等,其格式遵循NFC Forum RTD(Record Type Definition)規
範。下文将詳細介紹它。
·MIME:它是Multipurpose Internet Mail Extensions的縮寫,遵循RFC2046規
範。例如,當TNF取值為MIME時,其Type字段取值可為"text/plain"或"image/png"等。
·Absolute URI:絕對URI,遵循RFC 3986規範。例如某檔案的絕對URI
為"http://android.com/robots.txt",而其相對URI則為"robots.txt"。
·NFC Forum External Type:也由NFC Forum的RTD規範定義,下文将介紹它。
·Unknown:代表Payload中的資料類型未知,它和MIME類型"application/octetstream"
有些類似,這種類型的資料由相應的應用程式來解析。
Unchanged:這種類型的資料用于NFC Record分片。例如一個大的資料需要通過多
個NFC Record來承載,除第一個NFC Record分片外,該資料對應的其他NFC Record分
片都必須設定TNF為Unchanged。
在TNF七大類型中,NFC Forum通過RTD規範定義了其中的WKT(Well-Known
Type)和External Type兩種類型。雖然RTD規範全長隻有20來頁,但閱讀起來比較枯
燥,在此,筆者總結其核心内容。
簡單點說,WKT就是NFC Forum自己定義的一些常用資料類型,目前常用類型如下。
·URI Record Type:用于存儲URI資料,對應Type字段取值為"U"。
·Text Record Type:用于存儲文本資料,對應Type字段取值為"T"。
·Signature Record Type:用于存儲數字簽名資料,對應Type字段取值為"Sig"。
·Smart Poster Record Type:智能海報,用于存儲與該海報相關的一些資訊資訊,
如圖檔、相關介紹等,對應Type字段取值為"Sp"。
·Generic Control Record Type:用于傳遞控制資訊,對應Type字段取值為"Gc"。
·External Type:為第三方組織定義的類型,目前NFC Forum沒有定義相關的資料
類型。
提示NFC Forum目前定義的所有WKT類型清單可參考http://www.nfcforum.
org/specs/nfc_forum_assigned_numbers_register。
2.NFC Record執行個體[10][11]
本節這兩個執行個體分别來自URI Record Type規範和TEXT Record Type規範。先來看
URI Record Type執行個體。
(1)URI Record Type執行個體
URI Record Type屬于NFC Forum Well-known Type的一種,其對應的Type字段
取值為"U"。對于這種類型的NFC Record,其Payload組織結構如表8-3所示。
在URI Record Payload中,第一個位元組指明URI的ID碼,表8-4為NFC Forum定義的
幾種ID碼。
了解上述資訊後,我們來看"http://www.nfc.com"這樣的資訊該如何封裝為一個NDEF
消息,圖8-7所示為NDEF消息各字段的取值情況。
由于該NDEF消息隻包含一個NFC Record,是以這個唯一的NFC Record将設定MB和
ME标志位為1。另外,由于資料量小于255位元組,是以SR标志位為1。最後,該Record攜帶
的資料屬于URI類型,它為Well-Known Type的一種,是以TNF取值為0x01。
Type Length字段取值為0x01,對應的Type字段取值為"U",代表URI Record
Type。
根據本節對URI Record的介紹,這種類型Record的Payload包含ID Code和data兩個
部分。ID Code取值為0x01占據1位元組(代表"http://www"),而data為"nfc.com"占據7字
節,是以整個Payload長度為8位元組,故Payload length字段取值為0x08。
當應用程式擷取Payload資訊後,将根據ID Code和Data的取值最終計算出對應的URI
為"http://www.nfc.com"。
(2)Text Record Type執行個體
Text Record Type和URI Record Type類似,其Payload組織結構如表8-5所示。
圖8-8所示為攜帶"Hello World"字元串資訊的NDEF消息各字段的取值情況。
至此,NFC R/W運作模式介紹完畢。在R/W模式下,對應用程式而言最重要的工作就
是解析NDEF消息。NFC Forum定義了七種資料類型,其中内容比較豐富的屬于NFC
Forum Well Known Type。本節介紹了WKT中最簡單的URI Record和TEXT Record。
讀者可在本節基礎上自行研究其他幾種資料類型。