Android近場通訊---NFC基礎(一)(轉)

轉自 http://blog.csdn.net/think_soft/article/details/8169483html

 

 

本文譯自:http://developer.android.com/guide/topics/connectivity/nfc/nfc.htmlandroid

本文介紹在Android系經過你所能執行的基本任務。它解釋瞭如何用NDEF消息格式來發送和接收NFC數據,而且介紹了支持這些功能的Android框架API。有關更高級的話題,包括對非NDEF格式數據的討論,狀況「高級 NFC瀏覽器

NDEF數據和Android一塊兒工做的場景主要有兩個:框架

1.  從NFC標籤中讀取NDEF數據;dom

2.  把NDEF消息從一個設備發送給另外一個設備。ide

從NFC標籤中讀取NDEF數據是用標籤調度系統來處理的,它會分析被發現的NFC標籤,對數據進行適當的分類,並啓動對該類數據感興趣的應用程序。想要處理被掃描到NFC標籤的應用程序會聲明一個Intent過濾器,並請求處理數據。ui

Android  Beam™ 功能容許設備把一個NDEF消息推送到物理上相互監聽的另外一個設備上。這種交互提供了比其餘無線技術(如藍牙)更容易的發送數據的方法。由於NFC不須要手動的設備發現或配對要求。兩個設備在接近到必定範圍時會自動的鏈接。Android Beam經過一組NFC API來使用,以便應用程序可以在設備之間來傳輸信息。例如,通訊錄、瀏覽器以及YouTube等應用程序都使用Android Beam來跟其餘設備共享通訊錄、網頁和視頻。編碼

NFC標籤調度系統spa

一般,除非是在設備的設置菜單中NFC被禁用,不然Android設備會在非鎖屏的狀態下搜索NFC。當Android設備發現NFC標籤時,指望的行爲是用最合適的Activity來處理該Intent,而不是詢問用戶使用什麼應用程序。由於設備只能在很短的範圍內掃描到NFC標籤,強制的讓用戶手動的選擇一個Activity,會致使設備離開NFC標籤,從而中斷該鏈接。你應該開發你本身的Activity來處理你所關心的NFC標籤,從而阻止 選擇器的操做。.net

爲了幫助你達到這個目標,Android提供了特殊的標籤調度系統,來分析掃描到的NFC標籤,經過解析數據,在被掃描到的數據中嘗試找到感興趣的應用程序,具體作法以下:

1.  解析NFC標籤並搞清楚標籤中標識數據負載的MIME類型或URI;

2.  把MIME類型或URI以及數據負載封裝到一個Intent中。

3.  基於Intent來啓動Activity。

怎樣把NFC標籤映射到MIME類型和URI

開始編寫NFC應用程序以前,重要的是要理解不一樣類型的NFC標籤、標籤調度系統是如何解析NFC標籤的、以及在檢測到NDEF消息時,標籤調度系統所作的特定的工做等。NFC標籤涉及到普遍的技術,而且有不少不一樣的方法向標籤中寫入數據。Android支持由NFC Forum所定義的NDEF標準。

NDEF數據被封裝在一個消息(NdefMessage)中,該消息中包含了一條或多條記錄(NdefRecord)。每一個NDEF記錄必須具備良好的你想要建立的記錄類型的規範的格式。Android也支持其餘的不包含NDEF數據類型的標籤,你可以使用android.nfc.tech包中的類來工做。要使用其餘類型標籤來工做,涉及到編寫本身的跟該標籤通訊的協議棧,所以咱們建議你儘量的使用NDEF,以便減小開發難度,而且最大化的支持Android設備。

注意:要下載完整的NDEF規範,請去「NFC論壇規範下載」網址來下載。

如今,你已經具有了一些NFC標籤的背景知識,接下來要詳細的介紹Android是如何處理NDEF格式的標籤的。當Android設備掃描到包含NDEF格式數據的NFC標籤時,它會解析該消息,並嘗試搞清楚數據的MIME類型或URI標識。首先系統會讀取消息(NdefMessage)中的第一條NdefRecord,來判斷如何解釋整個NDEF消息(一個NDEF消息可以有多條NDEF記錄)。在格式良好的NDEF消息中,第一條NdefRecord包含如下字段信息:

3-bit TNF(類型名稱格式)

指示如何解釋可變長度類型字段,在下表1中介紹有效值。

可變長度類型

說明記錄的類型,若是使用TNF_WELL_KNOWN,那麼則使用這個字段來指定記錄的類型定義(RTD)。在下表2中定義了有效的RTD值。

可變長度ID

惟一標識該記錄。這個字段不常用,可是,若是須要惟一的標識一個標記,那麼就能夠爲該字段建立一個ID。

可變長度負載

你想讀/寫的實際的數據負載。一個NDEF消息可以包含多個NDEF記錄,所以不要覺得在NDEF消息的第一條NDEF記錄中包含了全部的負載。

標籤調度系統使用TNF和類型字段來嘗試把MIME類型或URI映射到NDEF消息中。若是成功,它會把信息跟實際的負載一塊兒封裝到ACTION_NEDF_DISCOVERED類型的Intent中。可是,會有標籤調度系統不能根據第一條NDEF記錄來判斷數據類型的狀況,這樣就會有NDEF數據不能被映射到MIME類型或URI,或者是NFC標籤沒有包含NDEF開始數據的狀況發生。在這種狀況下,就會用一個標籤技術信息相關的Tag對象和封裝在ACTION_TECH_DISCOVERED類型Intent對象內部的負載來代替。

表1.介紹標籤調度系統映射如何把TNF和類型字段映射到MIME型或URI上。同時也介紹了那種類型的TNF不能被映射到MIME類型或URI上。這種狀況下,標籤調度系統會退化到ACTION_TECH_DISCOVERED類型的Intent對象。

例如,若是標籤調度系統遇到一個TNF_ABSOLUTE_URI類型的記錄,它會把這個記錄的可變長度類型字段映射到一個URI中。標籤調度系統會把這個URI跟其餘相關的標籤的信息(如數據負載)一塊兒封裝到ACTION_NDEF_DISCOVERED的Intent對象中。在另外一方面,若是遇到了TNF_UNKNOWN類型,它會建立一個封裝了標籤技術信息的Intent對象來代替。

表1.所支持的TNF和它們的映射

 

類型名稱格式(TNF)

映射

TNF_ABSOLUTE_URI

基於類型字段的URI

TNF_EMPTY

退化到ACTION_TECH_DISCOVERED類型的Intent對象

TNF_EXTERNAL_TYPE

基於類型字段中URN的URI。URN是縮短的格式(<domain_name>:<service_name)被編碼到NDEF類型中。Android會把這個URN映射成如下格式的URI:vnd.android.nfc://ext/<domain_name>:<service_name>。

TNF_MIME_MEDIA

基於類型字段的MIME類型

TNF_UNCHANGED

退化到ACTION_TECH_DISCOVERED類型的Intent對象

TNF_UNKNOWN

退化到ACTION_TECH_DISCOVERED類型的Intent對象

TNF_WELL_KNOWN

依賴你在類型字段中設置的記錄類型定義(RTD)的MIME類型或URI,

 

表2.TNF_WELL_KNOWN所支持的RTD和它們的映射

 

記錄類型定義(RTD)

映射

RTD_ALTERNATIVE_CARRIER

退化到ACTION_TECH_DISCOVERED類型的Intent對象

RTD_HANDOVER_CARRIER

退化到ACTION_TECH_DISCOVERED類型的Intent對象

RTD_HANDOVER_REQUEST

退化到ACTION_TECH_DISCOVERED類型的Intent對象

RTD_HANDOVER_SELECT

退化到ACTION_TECH_DISCOVERED類型的Intent對象

RTD_SMART_POSTER

基於負載解析的URI

RTD_TEXT

text/plain類型的MIME

RTD_URI

基於有效負載的URI

相關文章
相關標籤/搜索