Android近距離無線通訊---NFC基礎(一)

來源:互聯網
上載者:User

標籤:

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

 

 

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

本文介紹在Android系通過你所能執行的基本任務?它解釋了如何用NDEF訊息格式來發送和接收NFC資料,並且介紹了支援這些功能的Android架構API?有關更進階的話題,包括對非NDEF格式資料的討論,情況“進階 NFC”

NDEF資料和Android一起工作的情境主要有兩個:

1.  從NFC標籤中讀取NDEF資料;

2.  把NDEF訊息從一個裝置發送給另一個裝置?

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

Android  Beam™ 功能允許裝置把一個NDEF訊息推送到物理上相互監聽的另一個裝置上?這種互動提供了比其他無線技術(如藍芽)更容易的發送資料的方法?因為NFC不需要手動的裝置發現或配對要求?兩個裝置在接近到一定範圍時會自動的串連?Android Beam通過一組NFC API來使用,以便應用程式能夠在裝置之間來傳輸資訊?例如,通訊錄?瀏覽器以及YouTube等應用程式都使用Android Beam來跟其他裝置共用通訊錄?網頁和視頻?

NFC標籤調度系統

通常,除非是在裝置的設定菜單中NFC被禁用,否則Android裝置會在非鎖屏的狀態下搜尋NFC?當Android裝置發現NFC標籤時,期望的行為是用最合適的Activity來處理該Intent,而不是詢問使用者使用什麼應用程式?因為裝置只能在很短的範圍內掃描到NFC標籤,強制的讓使用者手動的選擇一個Activity,會導致裝置離開NFC標籤,從而中斷該串連?你應該開發你自己的Activity來處理你所關心的NFC標籤,從而阻止 選取器的操作?

為了協助你達到這個目標,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

 

Android近距離無線通訊---NFC基礎(一)(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.