Android NFC技術(shù)解析按摘,附Demo源碼

? ? ? ? 由于項(xiàng)目需求包券,對(duì)Android NFC 技術(shù)進(jìn)行了一定的了解和深入纫谅,整合了一些網(wǎng)絡(luò)炫贤、書籍資料,此文章僅作為自己的學(xué)習(xí)筆記付秕。

NFC是Near Field Communication縮寫兰珍,即近距離無線通訊技術(shù)⊙猓可以在移動(dòng)設(shè)備掠河、消費(fèi)類電子產(chǎn)品、PC 和智能控件工具間進(jìn)行近距離無線通信猛计。簡單一點(diǎn)說唠摹,nfc功能是什么?nfc功能有什么用奉瘤?其實(shí)NFC提供了一種簡單勾拉、觸控式的解決方案,可以讓消費(fèi)者簡單直觀地交換信息盗温、訪問內(nèi)容與服務(wù)藕赞。NFC技術(shù)允許電子設(shè)備之間進(jìn)行非接觸式點(diǎn)對(duì)點(diǎn)數(shù)據(jù)傳輸,在十厘米(3.9英吋)內(nèi)卖局,交換數(shù)據(jù)斧蜕,其傳輸速度有106Kbit/秒、212Kbit/秒或者424Kbit/秒三種砚偶。接下來我們更加詳細(xì)的來了解一下nfc的應(yīng)用批销。

由飛利浦公司和索尼公司共同開發(fā)的NFC是一種非接觸式識(shí)別和互聯(lián)技術(shù)

一洒闸、nfc是什么,它的工作模式均芽?

? ? ? ? NFC工作模式主要有三種工作模式顷蟀,分別是卡模式(Card emulation)、點(diǎn)對(duì)點(diǎn)模式(P2P mode)和讀卡器模式(Reader/writer mode)骡技。

(1)讀卡器模式

? ? ? ? 數(shù)據(jù)在NFC芯片中鸣个,可以簡單理解成“刷標(biāo)簽”。本質(zhì)上就是通過支持NFC的手機(jī)或其它電子設(shè)備從帶有NFC芯片的標(biāo)簽布朦、貼紙囤萤、名片等媒介中讀寫信息。通常NFC標(biāo)簽是不需要外部供電的是趴。當(dāng)支持NFC的外設(shè)向NFC讀寫數(shù)據(jù)時(shí)涛舍,它會(huì)發(fā)送某種磁場(chǎng),而這個(gè)磁場(chǎng)會(huì)自動(dòng)的向NFC標(biāo)簽供電唆途。

(2)仿真卡模式

? ? ? ? 數(shù)據(jù)在支持NFC的手機(jī)或其它電子設(shè)備中富雅,可以簡單理解成“刷手機(jī)”。本質(zhì)上就是將支持NFC的手機(jī)或其它電子設(shè)備當(dāng)成借記卡肛搬、公交卡没佑、門禁卡等IC卡使用∥屡猓基本原理是將相應(yīng)IC卡中的信息憑證封裝成數(shù)據(jù)包存儲(chǔ)在支持NFC的外設(shè)中 蛤奢。在使用時(shí)還需要一個(gè)NFC射頻器(相當(dāng)于刷卡器)。將手機(jī)靠近NFC射頻器陶贼,手機(jī)就會(huì)接收到NFC射頻器發(fā)過來的信號(hào)啤贩,在通過一系列復(fù)雜的驗(yàn)證后,將IC卡的相應(yīng)信息傳入NFC射頻器拜秧,最后這些IC卡數(shù)據(jù)會(huì)傳入NFC射頻器連接的電腦痹屹,并進(jìn)行相應(yīng)的處理(如電子轉(zhuǎn)帳、開門等操作)枉氮。

(3)點(diǎn)對(duì)點(diǎn)模式

? ? ? ? 該模式與藍(lán)牙志衍、紅外差不多,用于不同NFC設(shè)備之間進(jìn)行數(shù)據(jù)交換嘲恍,不過這個(gè)模式已經(jīng)沒有有“刷”的感覺了足画。其有效距離一般不能超過4厘米,但傳輸建立速度要比紅外和藍(lán)牙技術(shù)快很多佃牛,傳輸速度比紅外塊得多淹辞,如過雙方都使用Android4.2,NFC會(huì)直接利用藍(lán)牙傳輸俘侠。這種技術(shù)被稱為AndroidBeam象缀。所以使用androidBeam傳輸數(shù)據(jù)的兩部設(shè)備不再限于4厘米之內(nèi)蔬将。

NFC、藍(lán)牙和紅外之間的差異

二央星、Android對(duì)NFC的支持

? ? ? ? ?不同的NFC標(biāo)簽之間差異很大霞怀,有的只支持簡單的讀寫操作,有時(shí)還會(huì)采用支持一次性寫入的芯片莉给,將NFC標(biāo)簽設(shè)計(jì)成只讀的毙石。當(dāng)然,也存在一些復(fù)雜的NFC標(biāo)簽颓遏,例如徐矩,有一些NFC標(biāo)簽可以通過硬件加密的方式限制對(duì)某一區(qū)域的訪問。還有一些標(biāo)簽自帶操作環(huán)境叁幢,允許NFC設(shè)備與這些標(biāo)簽進(jìn)行更復(fù)雜的交互滤灯。這些標(biāo)簽中的數(shù)據(jù)也會(huì)采用不同的格式。但Android SDK API主要支持NFC論壇標(biāo)準(zhǔn)(Forum Standard)曼玩,這種標(biāo)準(zhǔn)被稱為NDEF(NFC Data Exchange Format鳞骤,NFC數(shù)據(jù)交換格式)。

NDEF格式其實(shí)就類似于硬盤的NTFS黍判,下面我們看一下NDEF數(shù)據(jù):

(1)NDEF數(shù)據(jù)的操作

Android SDK API支持如下3種NDEF數(shù)據(jù)的操作:

1)從NFC標(biāo)簽讀取NDEF格式的數(shù)據(jù)豫尽。

2)向NFC標(biāo)簽寫入NDEF格式的數(shù)據(jù)。

3)通過Android Beam技術(shù)將NDEF數(shù)據(jù)發(fā)送到另一部NFC設(shè)備样悟。

用于描述NDEF格式數(shù)據(jù)的兩個(gè)類:

1)NdefMessage:描述NDEF格式的信息拂募,實(shí)際上我們寫入NFC標(biāo)簽的就是NdefMessage對(duì)象庭猩。

2)NdefRecord:描述NDEF信息的一個(gè)信息段窟她,一個(gè)NdefMessage可能包含一個(gè)或者多個(gè)NdefRecord。

NdefMessage和NdefRecord是Android NFC技術(shù)的核心類蔼水,無論讀寫NDEF格式的NFC標(biāo)簽震糖,還是通過Android Beam技術(shù)傳遞Ndef格式的數(shù)據(jù),都需要這兩個(gè)類趴腋。

(2)非NDEF數(shù)據(jù)的操作

對(duì)于某些特殊需求吊说,可能要存任意的數(shù)據(jù),對(duì)于這些數(shù)據(jù)优炬,我們就需要自定義格式颁井。這些數(shù)據(jù)格式實(shí)際上就是普通的字節(jié)流,至于字節(jié)流中的數(shù)據(jù)代表什么蠢护,就由開發(fā)人員自己定義了雅宾。

(3)編寫NFC程序的基本步驟

1)設(shè)置權(quán)限,限制Android版本葵硕、安裝的設(shè)備:

配置權(quán)限

2)定義可接收Tag的Activity眉抬,配置一下launchMode屬性:

處理NFC的Activity都要設(shè)置launchMode屬性為singleTop或者singleTask贯吓,保證activty唯一實(shí)例

三、實(shí)戰(zhàn)使用NFC標(biāo)簽

(1)利用NFC標(biāo)簽讓Android自動(dòng)運(yùn)行程序

場(chǎng)景是這樣的:現(xiàn)將應(yīng)用程序的包寫到NFC程序上蜀变,然后我們將NFC標(biāo)簽靠近Android手機(jī)悄谐,手機(jī)就會(huì)自動(dòng)運(yùn)行包所對(duì)應(yīng)的程序,這個(gè)是NFC比較基本的一個(gè)應(yīng)用库北。下面以貼近標(biāo)簽自動(dòng)運(yùn)行Android自帶的“短信”為例爬舰。

向NFC標(biāo)簽寫入數(shù)據(jù)一般分為三步:

1)獲取Tag對(duì)象

2)判斷NFC標(biāo)簽的數(shù)據(jù)類型(通過Ndef.get方法)

3)寫入數(shù)據(jù)

實(shí)際運(yùn)行效果如下:

操作步驟:

點(diǎn)擊自動(dòng)打開短信界面或百度頁面,進(jìn)入對(duì)應(yīng)Activity寒瓦,將NFC標(biāo)簽貼近手機(jī)背面洼专,提示寫入成功。返回主界面孵构,再將NFC標(biāo)簽貼近手機(jī)背面屁商,便能看到自動(dòng)打開短信或者打開百度頁面。

應(yīng)用主界面
數(shù)據(jù)寫入界面


掃描NFC標(biāo)簽后跳轉(zhuǎn)頁面

四颈墅、NDEF文本格式深度解析

獲取NFC標(biāo)簽中的數(shù)據(jù)要通過 NdefRecord.getPayload 方法完成蜡镶。當(dāng)然,在處理這些數(shù)據(jù)之前恤筛,最好判斷一下NdefRecord對(duì)象中存儲(chǔ)的是不是NDEF文本格式數(shù)據(jù)官还。

(1)判斷數(shù)據(jù)是否為NDEF格式

1)TNF(類型名格式,Type Name Format)必須是NdefRecord.TNF_WELL_KNOWN毒坛。

2)可變的長度類型必須是NdefRecord.RTD_TEXT望伦。

如果這兩個(gè)標(biāo)準(zhǔn)同時(shí)滿足,那么就為NDEF格式煎殷。

(2)NDEF文本格式規(guī)范

不管什么格式的數(shù)據(jù)本質(zhì)上都是由一些字節(jié)組成的屯伞。對(duì)于NDEF文本格式來說,這些數(shù)據(jù)的第1個(gè)字節(jié)描述了數(shù)據(jù)的狀態(tài)豪直,然后若干個(gè)字節(jié)描述文本的語言編碼劣摇,最后剩余字節(jié)表示文本數(shù)據(jù)。這些數(shù)據(jù)格式由NFC Forum的相關(guān)規(guī)范定義弓乙,可以通過 http://members.nfc-forum.org/specs/spec_dashboard 下載相關(guān)的規(guī)范末融。

下面這兩張表是規(guī)范中 3.2節(jié) 相對(duì)重要的翻譯部分:

NDEF文本數(shù)據(jù)格式


狀態(tài)字節(jié)編碼格式

實(shí)現(xiàn)NFC標(biāo)簽中的文本數(shù)據(jù)的讀寫操作:

寫文本數(shù)據(jù)核心代碼,具體可查閱項(xiàng)目中代碼WriteTextActivity類
讀文本數(shù)據(jù)核心代碼暇韧,具體可查閱項(xiàng)目中代碼ReadTextActivity類

? ? ? 點(diǎn)擊寫NFC標(biāo)簽中的文本數(shù)據(jù)勾习,跳轉(zhuǎn)到對(duì)應(yīng)的Activity,將NFC標(biāo)簽卡貼近手機(jī)懈玻,寫入成功后會(huì)提示巧婶,再退回主頁面,選擇讀文本數(shù)據(jù),便可讀取粹舵。

數(shù)據(jù)寫入界面
數(shù)據(jù)讀取界面

五钮孵、NDEF Uri格式存儲(chǔ)(操作步驟如上圖,具體實(shí)現(xiàn)可查閱項(xiàng)目代碼)

六眼滤、非NDEF格式(操作步驟如上圖巴席,具體實(shí)現(xiàn)查閱項(xiàng)目代碼)

? ? ? ? MifareUltralight數(shù)據(jù)格式:將NFC標(biāo)簽的存儲(chǔ)區(qū)域分為16個(gè)頁,每一個(gè)頁可以存儲(chǔ)4個(gè)字節(jié)诅需,一個(gè)可存儲(chǔ)64個(gè)字節(jié)(512位)漾唉。頁碼從0開始(0至15)。前4頁(0至3)存儲(chǔ)了NFC標(biāo)簽相關(guān)的信息(如NFC標(biāo)簽的序列號(hào)堰塌、控制位等)赵刑。從第5頁開始存儲(chǔ)實(shí)際的數(shù)據(jù)(4至15頁)。使用MifareUltralight.get方法獲取MifareUltralight對(duì)象场刑,然后調(diào)用MifareUltralight.connect方法進(jìn)行連接般此,并使用MifareUltralight.writePage方法每次寫入1頁(4個(gè)字節(jié))。

? ? ? ?也可以使用MifareUltralight.readPages方法每次連續(xù)讀取4頁牵现。如果讀取的頁的序號(hào)超過15铐懊,則從頭開始讀。例如瞎疼,從第15頁(序號(hào)為14)開始讀科乎。readPages方法會(huì)讀取14、15贼急、0茅茂、1頁的數(shù)據(jù)。

此為本次測(cè)試所使用設(shè)備太抓,手機(jī):小米5 ?NFC標(biāo)簽卡:淘寶可購買


項(xiàng)目源碼地址https://github.com/RickyYu/Nfc-Android

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末空闲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腻异,更是在濱河造成了極大的恐慌进副,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悔常,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡给赞,警方通過查閱死者的電腦和手機(jī)机打,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片迅,“玉大人残邀,你說我怎么就攤上這事。” “怎么了芥挣?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵驱闷,是天一觀的道長。 經(jīng)常有香客問我空免,道長空另,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任蹋砚,我火速辦了婚禮扼菠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坝咐。我一直安慰自己循榆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布墨坚。 她就那樣靜靜地躺著秧饮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泽篮。 梳的紋絲不亂的頭發(fā)上浦楣,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音咪辱,去河邊找鬼振劳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛油狂,可吹牛的內(nèi)容都是我干的历恐。 我是一名探鬼主播备典,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼叹誉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了陡鹃?” 一聲冷哼從身側(cè)響起磷蛹,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吮旅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后味咳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庇勃,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年槽驶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了责嚷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掂铐,死狀恐怖罕拂,靈堂內(nèi)的尸體忽然破棺而出揍异,到底是詐尸還是另有隱情,我是刑警寧澤爆班,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布衷掷,位于F島的核電站,受9級(jí)特大地震影響柿菩,放射性物質(zhì)發(fā)生泄漏戚嗅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一碗旅、第九天 我趴在偏房一處隱蔽的房頂上張望渡处。 院中可真熱鬧,春花似錦祟辟、人聲如沸医瘫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醇份。三九已至,卻和暖如春吼具,著一層夾襖步出監(jiān)牢的瞬間僚纷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工拗盒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怖竭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓陡蝇,卻偏偏與公主長得像痊臭,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子登夫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容