NFC技術簡介

1 簡介

1.1技術背景

無線近場通訊技術(Near Field Communication,NFC),最早是Sony和Philip這兩家公司共同開發的一種非接觸式識別和互聯技術,現在已經發展為國際性的非盈利組織 NFC Forum。該組織相當於藍牙技術聯盟(Bluetooth SIG)和WIFI聯盟負責相關技術的規範制定和認證。

1.2技術原理

NFC利用無線射頻技術實現設備之間的通信,工作頻率為13.56MHz,有效距離為4cm左右,目前支持的數據傳輸速率有106Kbps、212Kbps和424Kbps這三種。

1.3技術應用

NFC提供了一種簡單的、非接觸式的解決方案,在移動設備、消費電子產品和智能設備間讓使用者簡單直觀的交換信息、訪問內容和服務。當前NFC技術整合了非接觸式讀卡器、非接觸式智能卡和點對點(Peer-to-Peer)通信功能,為消費者創造了一個全新便利的生活方式

2 工作模式

NFC工作模式可以分為主動模式、被動模式與雙向模式這三種。

2.1主動模式(讀卡器模式)

NFC設備作為非接觸讀卡器使用,主動發出自己的射頻場去識別具有NFC標籤的設備,或者向NFC標籤設備讀寫數據。應用領域包括廣告讀取、車票讀取、電影海報讀取、電影門票銷售等。作為讀卡器的NFC設備需要供電使用。

2.2被動模式(仿真卡模式)

具有NFC功能的設備模擬成一張NFC標籤或非接觸卡,只能在其他設備發出的射頻場中被動響應。利用供電主設備產生的射頻場轉換成電能為自己供電接受主設備的數據並利用負載調製技術將自己的數據傳回主設備。應用領域包括支持NFC功能的手機作為門禁卡、銀行卡、公交卡等。

2.3雙向模式(點對點模式)

具備NFC功能的設備間都主動發出射頻場來建立點對點的連接進行數據交換。應用領域包括兩個具備NFC功能的手機建立連接傳輸文件等。

3 數據結構

NDEF:NFC Data Exchange Format,NFC數據交換格式,NFC Forum約定的NFC Tag中的數據格式。一個NDEF message包含多個Record記錄,真正的數據則都是封裝在Record中的,NDEF與Record之間的關係及數據結構如圖所示:

NFC技術簡介

NDEF message


NFC技術簡介

Record

4 NFC技術在Android中的應用

Android2.3.1(API Level = 9)才開始支持NFC技術,但Android2.x和Android3.x對NFC的支持還是非常有限的,而從Android4.0(API Level = 14)開始,Google向NFC發力才使得NFC技術在Android中得到了更進一步的支持。尤其是Android4.1,可以利用NFC技術傳遞較大的數據(NFC Handover也就是Android Beam技術)。Android9已經全面支持NFC的三種工作模式,從而以下分析也都是基於Android9。

5 NFC在安卓系統中的架構

NFC技術簡介

NFC系統架構圖

以下章節會依次說明NFC架構圖中各個模塊的啟動及作用。

5.1 NFC Framework

Android對外提供NFC功能的API,API主要方法都在android.nfc package中,android.nfc.tech package補充了非NDEF數據格式的標籤類型的連接及數據交互接口。相關Application直接通過NfcAdapter.getDefaultAdapter(Context)就可獲取到NFC的適配器,應用apk的所有對NFC的操作都需要通過 NfcAdapter來工作。

NFC技術簡介

NFC framework initialize

5.2 NFC Service

NFC service服務是由NFC apk提供的,源碼路徑為:packages\\apps\\Nfc\\...,編譯後會生成 NfcNci.apk 和 libnfc_nci_jni.so (下一節介紹)。

NfcNci.apk的AndroidManifest.xml中設置了安卓開機自啟動屬性:persistent="true",所以我們直接從NfcApplication.java開啟NFC服務進程的講解。

下圖為簡單的NFC Service啟動時序圖:

NFC技術簡介

apk initialize

5.3 NFC JNI

源碼路徑:packages\\apps\\Nfc\\nci\\jni,編譯生成 libnfc_nci_jni.so。由於編譯JNI的so庫包含有NFC Stack的so庫,所以能直接在JNI中調用NFC協議棧中的相關方法。

NFC技術簡介

加載JNI so庫是在初始化NFC Service中的NativeNfcManager.java時,通過下面的調用加載進com.android.nfc所屬進程中運行的。

NFC技術簡介

5.4 NFC Stack

NFC協議棧的初始化主要是創建了NFC_TASK的線程,協議棧和底層Controller的消息交互主要是通過該線程轉運的。

NFC技術簡介

NFC Stack initialize

5.5 NFC HAL Server

HAL(硬件抽象層)是Google為了保護硬件廠商的利益而在Android架構中加入了HAL的概念,使得上層不需關心硬件實現的具體細節,只需傳入抽象層所需參數,就可以達到控制硬件的目的。

前面一小節初始化的NFC協議棧通過HIDL技術獲取到了NFC HAL Server端的對象。HAL Server中通過HAL技術打開NFC Controller提供的so庫,從而可以操作NFC硬件。


分享到:


相關文章: