天天看點

(鄧凡平)深入了解android: NFC部分-----1

本章所涉及的源代碼檔案名及位置

·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上的資料。

(鄧凡平)深入了解android: NFC部分-----1

由圖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層協定

與之通信。

(鄧凡平)深入了解android: NFC部分-----1

由圖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運作模式

(鄧凡平)深入了解android: NFC部分-----1

·左邊的智能終端扮演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之間的關系。

(鄧凡平)深入了解android: NFC部分-----1

在一個NDEFMessage中,第一個NFC Record需設定其MB位(Message Begin)為1,表示它是該消

息中第一個NFC Record,最後一個NFC Record需設定ME位(Message End)位為1,表

示它是此消息中最後一個NFC Record。

(鄧凡平)深入了解android: NFC部分-----1

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所示。

(鄧凡平)深入了解android: NFC部分-----1

目前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所示。

(鄧凡平)深入了解android: NFC部分-----1

在URI Record Payload中,第一個位元組指明URI的ID碼,表8-4為NFC Forum定義的

幾種ID碼。

(鄧凡平)深入了解android: NFC部分-----1

了解上述資訊後,我們來看"http://www.nfc.com"這樣的資訊該如何封裝為一個NDEF

消息,圖8-7所示為NDEF消息各字段的取值情況。

(鄧凡平)深入了解android: NFC部分-----1

由于該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所示。

(鄧凡平)深入了解android: NFC部分-----1
(鄧凡平)深入了解android: NFC部分-----1

圖8-8所示為攜帶"Hello World"字元串資訊的NDEF消息各字段的取值情況。

至此,NFC R/W運作模式介紹完畢。在R/W模式下,對應用程式而言最重要的工作就

是解析NDEF消息。NFC Forum定義了七種資料類型,其中内容比較豐富的屬于NFC

Forum Well Known Type。本節介紹了WKT中最簡單的URI Record和TEXT Record。

讀者可在本節基礎上自行研究其他幾種資料類型。