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