朱鳳山
摘要:移動終端應(yīng)用程序的發(fā)展,促進(jìn)了近距離通信技術(shù)的應(yīng)用。NFC以其安全、簡單、低功耗等特點成為移動終端主要采用的技術(shù)。介紹了NFC技術(shù)的基本特點、應(yīng)用領(lǐng)域,給出了在Android操作系統(tǒng)中,NFC對NDEF標(biāo)簽讀寫的方法,對NFC應(yīng)用前景進(jìn)行了展望。
關(guān)鍵詞:NFC;Android移動平臺; NDEF標(biāo)簽
DOIDOI:10.11907/rjdk.143641
中圖分類號:TP392
文獻(xiàn)標(biāo)識碼:A 文章編號文章編號:16727800(2015)001015103
1 NFC與Android平臺
NFC被稱作“近場通信”,是RFID技術(shù)和互聯(lián)網(wǎng)技術(shù)融合的產(chǎn)物,可以實現(xiàn)在單一芯片上,集感應(yīng)式讀卡器、感應(yīng)式卡片和點對點數(shù)據(jù)傳輸功能于一體,在較短的距離(10cm)內(nèi)與兼容設(shè)備進(jìn)行識別和數(shù)據(jù)交換。相對于其它無線通信技術(shù),NFC具備更好的安全特性,可以用于機(jī)場/車站身份驗證、大廈門禁、智能交通卡、信用卡、支付卡等領(lǐng)域,擁有廣闊的市場前景。
NFC的數(shù)據(jù)傳輸特點,決定了它可以與移動互聯(lián)網(wǎng)融合,給互聯(lián)網(wǎng)應(yīng)用領(lǐng)域帶來革命。2011年,基于Android操作系統(tǒng)的首款NFC近場通信應(yīng)用就已推出,并獲得好評,隨后,多款采用Android系統(tǒng)的高端手機(jī)都將NFC作為標(biāo)配。
2 NFC應(yīng)用場景
NFC技術(shù)應(yīng)用領(lǐng)域廣泛,以其安全的數(shù)據(jù)傳輸特性,彌補了RFID在近距離通信方面的不足。支持NFC技術(shù)的設(shè)備可以替代非接觸式的智能卡片,如公交卡、地鐵卡等;支持NFC技術(shù)的手機(jī)可以充當(dāng)讀卡器,對卡片進(jìn)行數(shù)據(jù)的讀寫操作;兼容NFC的設(shè)備之間可以直接進(jìn)行數(shù)據(jù)傳輸,如手機(jī)之間進(jìn)行名片數(shù)據(jù)的互發(fā)。NFC技術(shù)應(yīng)用主要有5種基本類型。
(1) 智能卡片。用NFC標(biāo)簽替代現(xiàn)有的卡片,用戶使用感覺友好,攜帶方便。NFC標(biāo)簽可以直接貼在客戶的手機(jī)上,實現(xiàn)非接觸卡的功能。NFC可以實現(xiàn)大型終端客戶身份識別、消費積分、客戶特別服務(wù)等功能。
(2)掃描碼。在商業(yè)宣傳中,促銷的特定信息寫在帶NFC標(biāo)簽的海報上,當(dāng)客戶使用帶有NFC讀卡機(jī)的手機(jī)貼近標(biāo)簽時,瞬間完成一系列設(shè)定的功能。
(3)無接觸支付。在移動支付、儲值消費、積分消費等系統(tǒng)中,NFC標(biāo)簽可以實現(xiàn)帶有用戶密碼安全認(rèn)證的高安全性商業(yè)消費和支付交易操作。
(4) 數(shù)據(jù)傳輸。NFC設(shè)備之間可以進(jìn)行數(shù)據(jù)傳輸,實現(xiàn)文件傳輸、識別、交換功能。在設(shè)備之間、設(shè)備和后臺服務(wù)器之間完成數(shù)據(jù)同步功能。
(5) 與移動互聯(lián)網(wǎng)深度融合。NFC是一個嶄新的開放性技術(shù)領(lǐng)域,是射頻技術(shù)、無線通訊技術(shù)和最新的網(wǎng)絡(luò)技術(shù)結(jié)合的產(chǎn)物,未來2~5年必將給人們的生活帶來巨大的變革。
3 NDEF標(biāo)簽
NFC標(biāo)簽分類復(fù)雜。簡單的NFC標(biāo)簽只提供讀寫語法,某些時候一次只能以只讀的方式讀取卡片的可編程區(qū)域。復(fù)雜一點的NFC標(biāo)簽提供了數(shù)學(xué)運算能力,并且有加密的硬件來認(rèn)證扇區(qū)的訪問。最復(fù)雜的NFC標(biāo)簽包含了運算環(huán)境,允許在標(biāo)簽上執(zhí)行復(fù)雜的交互代碼,存儲在標(biāo)簽中的數(shù)據(jù)也可以用各種格式來編寫。
大多數(shù)Android框架的API都使用基于NDEF(NFC Data Exchange Format)的標(biāo)準(zhǔn)。Android平臺中,NFC的基礎(chǔ)應(yīng)用主要是從NFC標(biāo)簽中讀取NDEF數(shù)據(jù),把NDEF消息從一個設(shè)備發(fā)送給另一個設(shè)備。除非是在移動設(shè)備的設(shè)置菜單中NFC被禁用,否則Android設(shè)備會在非鎖屏的狀態(tài)下搜索NFC,然后通過標(biāo)簽調(diào)度系統(tǒng)來處理被發(fā)現(xiàn)的NFC標(biāo)簽,對數(shù)據(jù)進(jìn)行適當(dāng)?shù)姆诸?,并啟動對該類?shù)據(jù)感興趣的應(yīng)用程序。目標(biāo)應(yīng)用程序要處理掃描到的NFC標(biāo)簽,需要聲明一個Intent過濾器,并請求處理數(shù)據(jù)。
4 標(biāo)簽調(diào)度
當(dāng)Android設(shè)備發(fā)現(xiàn)NFC標(biāo)簽時,目標(biāo)Activity處理該Intent,借助Android提供的特殊標(biāo)簽調(diào)度系統(tǒng),分析掃描到的NFC標(biāo)簽。通過解析數(shù)據(jù),在掃描到的信息中查找感興趣的應(yīng)用程序。
4.1 映射MIME數(shù)據(jù)類型和URI
當(dāng)Android設(shè)備掃描到NDEF格式數(shù)據(jù)的NFC標(biāo)簽時,它會解析該消息,并嘗試搞清楚數(shù)據(jù)的MIME類型或URI標(biāo)識。系統(tǒng)首先會讀取消息(NdefMessage)中的第一條NdefRecord,來判斷如何解釋整個NDEF消息(一個NDEF消息能夠有多條NDEF記錄)。在格式良好的NDEF消息中,第一條NdefRecord包含以下字段信息:
(1)3bitTNF——類型名稱格式。指示如何解釋可變長度類型字段。
(2)可變長度類型——說明記錄的類型,如果使用TNF_WELL_KNOWN,那么則使用這個字段來指定記錄的類型定義(RTD)。
(3)可變長度ID,對記錄進(jìn)行唯一標(biāo)識。這個字段不經(jīng)常使用,但是,如果需要唯一標(biāo)識一個標(biāo)記,就可以為該字段創(chuàng)建一個ID。
(4)可變長度負(fù)載——讀/寫的實際數(shù)據(jù)負(fù)載。一個NDEF消息能夠包含多個NDEF記錄。
標(biāo)簽調(diào)度系統(tǒng)使用TNF和類型字段,嘗試把MIME類型或URI映射到NDEF消息中。如果成功,它會把信息與實際負(fù)載一起封裝到ACTION_NEDF_DISCOVERED類型的Intent中。但是,有標(biāo)簽調(diào)度系統(tǒng)不能根據(jù)第一條NDEF記錄來判斷數(shù)據(jù)類型的情況,這樣就會有NDEF數(shù)據(jù)不能映射到MIME類型或URI,或者是NFC標(biāo)簽沒有包含NDEF開始數(shù)據(jù)的情況發(fā)生,這種情況下,就會用一個和標(biāo)簽技術(shù)信息相關(guān)的Tag對象和封裝在ACTION_TECH_DISCOVERED類型Intent對象內(nèi)部的負(fù)載來代替。
4.2 NFC標(biāo)簽啟動方式
NFC標(biāo)簽的啟動依賴于標(biāo)簽調(diào)度系統(tǒng),主要以“隱式Intent”的方式啟動應(yīng)用程序。當(dāng)標(biāo)簽調(diào)度系統(tǒng)創(chuàng)建Intent對象后,需要向Intent中封裝相應(yīng)的標(biāo)識信息,然后向外發(fā)送廣播,接收該廣播的應(yīng)用程序需要注冊廣播接收器,響應(yīng)該廣播。如果多個應(yīng)用程序都注冊了上述Intent的廣播接收器,則系統(tǒng)會彈出應(yīng)用程序選擇器,提示用戶選擇哪一個應(yīng)用程序響應(yīng)本次廣播。標(biāo)簽調(diào)度系統(tǒng)預(yù)定義的Intent活動主要有以下3項。
(1)ACTION_NDEF_DISCOVERED活動。封裝該種類型活動的Intent會啟動包含NDEF的應(yīng)用程序,這是優(yōu)先級較高的一種活動,系統(tǒng)會優(yōu)先嘗試啟動該種類型的應(yīng)用程序。
(2)ACTION_TECH_DISCOVERED活動。這種活動比第(1)種活動的優(yōu)先級低,只在系統(tǒng)發(fā)現(xiàn)沒有封裝了ACTION_NDEF_DISCOVERED活動的Intent時,才會嘗試啟動該類型的應(yīng)用程序。有一種例外情況:如果設(shè)備在發(fā)現(xiàn)NFC標(biāo)簽之后,無法映射到相應(yīng)的MIME類型,或者沒有相應(yīng)的URI類型,則會直接啟動該種類型的應(yīng)用程序。
(3)ACTION_TAB_DISCOVERED活動。這種活動優(yōu)先級最低,標(biāo)簽調(diào)度系統(tǒng)沒有發(fā)現(xiàn)上述兩種活動時,會啟動該種類型的應(yīng)用程序。
調(diào)度系統(tǒng)按照上述3種活動的優(yōu)先級依次嘗試所要啟動的應(yīng)用程序:如果存在封裝了ACTION_NDEF_DISCOVERED的Intent,則首先啟動該應(yīng)用程序,如果沒有應(yīng)用程序響應(yīng),則嘗試啟動封裝了ACTION_TECH_DISCOVERED的Intent。如果這兩種Intent都沒有應(yīng)用程序響應(yīng),調(diào)度系統(tǒng)會嘗試啟動封裝了ACTION_TAG_DISCOVERED的Intent,如果依然沒有應(yīng)用程序響應(yīng),則停止調(diào)度工作,系統(tǒng)將不處理所發(fā)現(xiàn)的標(biāo)簽。多數(shù)應(yīng)用場合,調(diào)度系統(tǒng)都會成功啟動封裝了ACTION_NDEF_DISCOVERED的Intent,這也是上述3種類型的活動中,最為規(guī)范、標(biāo)準(zhǔn)的一種。
4.3 設(shè)定系統(tǒng)訪問權(quán)限
當(dāng)應(yīng)用程序需要響應(yīng)NFC標(biāo)簽調(diào)度系統(tǒng)的觸發(fā)時,需要在配置文件AndroidManifest.xml中聲明所需要的權(quán)限,以便獲得訪問手機(jī)硬件信息的資格。NFC應(yīng)用程序通常需要聲明的權(quán)限信息有:①在
目前,Android操作系統(tǒng)版本眾多,各版本之間差異較大。在使用NFC技術(shù)時,不同的版本略有不同。在Android API 10中,系統(tǒng)提供了廣泛的NFC讀寫支持,可以實現(xiàn)較為豐富的應(yīng)用。在Android API 14中,系統(tǒng)增加了Android Beam操作,可以直接創(chuàng)建NDEF記錄,這樣便可以更加靈活地將消息傳送給其它設(shè)備。Android的前期版本不完全支持NFC,比如在Android API 9中,系統(tǒng)僅支持ACTION_TAG_DISCOVERED活動,并且只能通過EXTRA_NDEF_MESSAGES來訪問NDEF數(shù)據(jù)。
5 讀取NDEF類型的Intent
上述3種類型Intent,都可以響應(yīng)NFC標(biāo)簽調(diào)度系統(tǒng)的觸發(fā)。如果某個Activity需要響應(yīng)NFC調(diào)度,則需要在過濾器中配置活動信息??梢詫?種活動都配置到過濾器中,也可以只配置一種。通常情況下,優(yōu)先級最高的ACTION_NDEF_DISCOVERED活動需要首先配置。
5.1 配置NDEF過濾器
要過濾ACTION_NDEF_DISCOVERED類型的Intent,就要在清單中與過濾的數(shù)據(jù)一同聲明該類型的Intent過濾器。比如過濾text/plain類型的MIME,ACTION_NDEF_DISCOVERED類型過濾器聲明如下:
5.2 掃描目標(biāo)Intent數(shù)據(jù)
NFC調(diào)度系統(tǒng)在向外廣播NDEF時,會將標(biāo)簽中的數(shù)據(jù)封裝在Intent中。當(dāng)Activity成功響應(yīng)一個NFC Intent之后,可以從該Intent中讀取所需要的數(shù)據(jù)。這些數(shù)據(jù)的封裝是固定的,可以通過EXTRA_TAG鍵,獲取手機(jī)所掃描到的NFC標(biāo)簽對象,這也是最為重要的數(shù)據(jù);EXTRA_NDEF_MESSAGES鍵對應(yīng)NDEF中的消息數(shù)組,EXTRA_ID鍵對應(yīng)標(biāo)簽ID值。
檢查ACTION_NDEF_DISCOVERED類型的Intent,并從Intent對象的附加信息中獲取NDEF消息,可以參考如下代碼:
public void onResume() {
super.onResume();
...
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_N DEF_MESSAGES);
if (rawMsgs != null){
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}}}}
6 結(jié)語
Android系統(tǒng)對NFC技術(shù)提供了較為全面的支持。所涉及的API主要位于android.nfc和android.nfc.tech兩個包中。其中NfcManager類主要用于實例化NfcAdapter,管理Android設(shè)備中所有的NFC適配器。NfcAdapter類是一個NFC 適配器類,通過getDefaultAdapter(Context)方法獲取對象。NdefMessage 類和NdefRecord類用于封裝數(shù)據(jù)格式。Tag類是NFC標(biāo)簽類,當(dāng)系統(tǒng)掃描到一個NFC標(biāo)簽時,會創(chuàng)建一個對象,發(fā)送到感興趣的Activity。
目前, NFC技術(shù)處于蓬勃發(fā)展階段,各種使用NFC技術(shù)實現(xiàn)的應(yīng)用程序?qū)映霾桓F。雖然NFC技術(shù)只出現(xiàn)在Android操作系統(tǒng)的高端手機(jī)中,但由于NFC芯片成本不高,易于貼附于手機(jī)電池和外殼上,其發(fā)展前景廣闊。在手機(jī)支付、手機(jī)公交、手機(jī)門禁等領(lǐng)域,完全可以通過NFC實現(xiàn)。