Android近场通信---NFC基础(一)(转)
轉自?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 ? |
轉載于:https://www.cnblogs.com/SamuelSun/p/4517496.html
總結
以上是生活随笔為你收集整理的Android近场通信---NFC基础(一)(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery on()方法绑定动态元素的
- 下一篇: (转) 设置sqlplus中的退格键