Android NFC開發(fā)詳細介紹一(理論篇)

大家在做nfc開發(fā)之前可以看一下我的上篇文章區(qū)分IC卡和ID卡

Near Field Communication (NFC) 為一短距離無線通信技術(shù),通常有效通訊距離為4厘米以內(nèi)拙毫。NFC工作頻率為13.65 兆赫茲票罐,通信速率為106 kbit/秒到 848kbit/秒盏浙,NFC手機相比普通手機來說系羞,NFC整合了非接觸式讀卡器复罐、非接觸式智能卡和點對點(Peer-to—Peer)通信功能,為消費者開創(chuàng)了全新的便捷生活方式趟紊。手機和NFC技術(shù)的結(jié)合氮双,將會給消費者提供極大的生活便利,例如移動支付霎匈、位置服務(wù)信息戴差、身份識別、公共交通卡等應(yīng)用铛嘱,在醫(yī)療保健暖释、優(yōu)惠券、智能海報等許多領(lǐng)域有也有巨大的應(yīng)用潛力墨吓。

一 球匕、nfc的三種工作模式

這里給出官方文檔的鏈接 大家可以看一下

  1. 讀卡器模式
    數(shù)據(jù)在NFC芯片中,可以簡單理解成“刷標簽”帖烘。本質(zhì)上就是通過支持NFC的手機或其它電子設(shè)備從帶有NFC芯片的標簽亮曹、貼紙、名片等媒介中讀寫信息秘症。通常NFC標簽是不需要外部供電的照卦。當支持NFC的外設(shè)向NFC讀寫數(shù)據(jù)時,它會發(fā)送某種磁場乡摹,而這個磁場會自動的向NFC標簽供電役耕。

  2. 仿真卡模式
    數(shù)據(jù)在支持NFC的手機或其它電子設(shè)備中,可以簡單理解成“刷手機”趟卸。本質(zhì)上就是將支持NFC的手機或其它電子設(shè)備當成借記卡蹄葱、公交卡、門禁卡等IC卡使用锄列⊥荚疲基本原理是將相應(yīng)IC卡中的信息憑證封裝成數(shù)據(jù)包存儲在支持NFC的外設(shè)中 。
    在使用時還需要一個NFC射頻器(相當于刷卡器)邻邮。將手機靠近NFC射頻器竣况,手機就會接收到NFC射頻器發(fā)過來的信號,在通過一系列復(fù)雜的驗證后筒严,將IC卡的相應(yīng)信息傳入NFC射頻器丹泉,最后這些IC卡數(shù)據(jù)會傳入NFC射頻器連接的電腦,并進行相應(yīng)的處理(如電子轉(zhuǎn)帳鸭蛙、開門等操作)摹恨。

  3. 點對點模式
    該模式與藍牙、紅外差不多娶视,用于不同NFC設(shè)備之間進行數(shù)據(jù)交換晒哄,不過這個模式已經(jīng)沒有有“刷”的感覺了睁宰。其有效距離一般不能超過4厘米,但傳輸建立速度要比紅外和藍牙技術(shù)快很多寝凌,傳輸速度比紅外塊得多柒傻,如過雙方都使用Android4.2,NFC會直接利用藍牙傳輸较木。這種技術(shù)被稱為Android Beam红符。所以使用Android Beam傳輸數(shù)據(jù)的兩部設(shè)備不再限于4厘米之內(nèi)。
    點對點模式的典型應(yīng)用是兩部支持NFC的手機或平板電腦實現(xiàn)數(shù)據(jù)的點對點傳輸伐债,例如预侯,交換圖片或同步設(shè)備聯(lián)系人。因此泳赋,通過NFC雌桑,多個設(shè)備如數(shù)字相機,計算機祖今,手機之間校坑,都可以快速連接,并交換資料或者服務(wù)千诬。

花了點時間耍目,下面用表格寫出NFC、藍牙和紅外之間的差異:

對比項 NFC 藍牙 紅外
網(wǎng)絡(luò)類型 點對點 單點對多點 點對點
有效距離 <=0.1m <=10m徐绑,最新的藍牙4.0有效距離可達100m 一般在1m以內(nèi)邪驮,熱技術(shù)連接,不穩(wěn)定
傳輸速度 最大424kbps 24Mbps 最大慢速115.2kbps傲茄,快速4Mbps
建立時間 <0.1s 6s 0.5s
安全性 安全毅访,硬件實現(xiàn) 安全,軟件實現(xiàn) 不安全盘榨,使用IRFM時除外
通信模式 主動-主動/被動 主動-主動 主動-主動
成本

二喻粹、Android對NFC的支持

不同的NFC標簽之間差異很大,有的只支持簡單的讀寫操作草巡,有時還會采用支持一次性寫入的芯片守呜,將NFC標簽設(shè)計成只讀的。當然山憨,也存在一些復(fù)雜的NFC標簽查乒,例如,有一些NFC標簽可以通過硬件加密的方式限制對某一區(qū)域的訪問郁竟。還有一些標簽自帶操作環(huán)境玛迄,允許NFC設(shè)備與這些標簽進行更復(fù)雜的交互。這些標簽中的數(shù)據(jù)也會采用不同的格式棚亩。
==但Android SDK API主要支持NFC論壇標準(Forum Standard)蓖议,這種標準被稱為NDEF(NFC Data Exchange Format藻肄,NFC數(shù)據(jù)交換格式)==

三、API概覽 Class Description

Class Description
NfcManager 一個NFC adapter的管理器拒担,可以列出所有此android設(shè)備支持的NFC adapter.只不過大部分android 設(shè)備只有一個NFC adapter,所以你大部分情況下可以直接用靜態(tài)方法 getDefaultAdapter(context)來取適配器攻询。
NfcAdapter 表示本設(shè)備的NFC adapter,可以定義Intent來請求將系統(tǒng)檢測到tags的提醒發(fā)送到你的Activity.并提供方法去注冊前臺tag提醒發(fā)布和前臺NDEF推送从撼。 前臺NDEF推送是當前android版本唯一支持的p2p NFC通信方式。
NdefMessage钧栖,NdefRecord NDEF是NFC論壇定義的數(shù)據(jù)結(jié)構(gòu)低零,用來有效的存數(shù)據(jù)到NFC tags.比如文本,URL拯杠,和其他MIME類型掏婶。一個NdefMessage扮演一個容器,這個容器存哪些發(fā)送和讀到的數(shù)據(jù)潭陪。一個NdefMessage對象包含0或多個NdefRecord,每個NDEF record有一個類型雄妥,比如文本,URL依溯,智慧型海報/廣告老厌,或其他MIME數(shù)據(jù)。在NDEFMessage里的第一個NfcRecord的類型用來發(fā)送tag到一個android設(shè)備上的activity.
Tag 標示一個被動的NFC目標黎炉,比如tag枝秤,card,鑰匙掛扣慷嗜,甚至是一個電話模擬的的NFC卡. 當一個tag被檢測到淀弹,一個tag對象將被創(chuàng)建并且封裝到一個Intent里,然后NFC 發(fā)布系統(tǒng)將這個Intent用startActivity發(fā)送到注冊了接受這種Intent的activity里庆械。你可以用getTechList()方法來得到這個tag支持的技術(shù)細節(jié)和創(chuàng)建一個android.nfc.tech提供的相應(yīng)的TagTechnology對象薇溃。

四、Tag支持的技術(shù)標準

Class Description
TagTechnology 這個接口是下面所有tag technology類必須實現(xiàn)的干奢。
NfcA 支持ISO 14443-3A 標準的操作痊焊。Provides access to NFC-A (ISO 14443-3A) properties and I/O operations.
NfcB Provides access to NFC-B (ISO 14443-3B) properties and I/O operations.
NfcF Provides access to NFC-F (JIS 6319-4) properties and I/O operations.
NfcV Provides access to NFC-V (ISO 15693) properties and I/O operations.
IsoDep Provides access to ISO-DEP (ISO 14443-4) properties and I/O operations.
Ndef 提供對那些被格式化為NDEF的tag的數(shù)據(jù)的訪問和其他操作。 Provides access to NDEF data and operations on NFC tags that have been formatted as NDEF.
NdefFormatable 對那些可以被格式化成NDEF格式的tag提供一個格式化的操作
MifareClassic 如果android設(shè)備支持MIFARE忿峻,提供對MIFARE Classic目標的屬性和I/O操作薄啥。
MifareUltralight 如果android設(shè)備支持MIFARE,提供對MIFARE Ultralight目標的屬性和I/O操作逛尚。

五垄惧、Tag發(fā)布系統(tǒng)

當android設(shè)備掃描到一個NFC tag,通用的行為是自動找最合適的Activity會處理這個tag Intent而不需要用戶來選擇哪個Activity來處理绰寞。因為設(shè)備掃描NFC tags是在很短的范圍和時間到逊,如果讓用戶選擇的話铣口,那就有可能需要移動設(shè)備,這樣將會打斷這個掃描過程觉壶。你應(yīng)該開發(fā)你只處理需要處理的tags的Activity脑题,以防止讓用戶選擇使用哪個Activity來處理的情況。Android提供兩個系統(tǒng)來幫助你正確的識別一個NFC tag是否是你的Activity想要處理的:Intent發(fā)布系統(tǒng)和前臺Activity發(fā)布系統(tǒng)铜靶。

Intent發(fā)布系統(tǒng)檢查所有Activities的intent filters叔遂,找出那些定義了可以處理此tag的Activity,如果有多個Activity都配置了處理同一個tag Intent争剿,那么將使用Activity選擇器來讓用戶選擇使用哪個Activity褪尝。用戶選擇之后匪煌,將使用選擇的Activity來處理此Intent.

前臺發(fā)布系統(tǒng)允許一個Activity覆蓋掉Intent發(fā)布系統(tǒng)而首先處理此tag Intent,這要求你將要處理Tag Intent的Activity運行在前臺,這樣當一個NFC tag被掃描到拱雏,系統(tǒng)先檢測前臺的Activity是否支持處理此Intent骑晶,如果支持贸桶,即將此Intent傳給此Activity锰瘸,如果不支持,則轉(zhuǎn)到Intent發(fā)布系統(tǒng)蹬碧。

5.1使用Intent發(fā)布系統(tǒng)

Intent發(fā)布系統(tǒng)指定了3個intent有不同的優(yōu)先級誊薄。通常當一個tag被檢測到之后,Intent就被啟動(start)了锰茉,這個啟動遵循以下行為

  • android.nfc.action.NDEF_DISCOVERED: 這個intent是在一個包含NDEF負載的tag被檢測到時啟動呢蔫,這是最高優(yōu)先級的intent, android系統(tǒng)不會讓你指定一個Intent能處理所有的NFC數(shù)據(jù)類型,你必須在AndroidManifest.xml中指定與NFC tag對應(yīng)的元素飒筑,這樣當掃描到的tag傳過來的數(shù)據(jù)類型與你定義的相匹配時片吊,你的Activity就會被調(diào)用。
<activity android:name=".NdefActivity"
           android:launchMode="singleTop"
           android:label="NDEF格式"
           > 
           <intent-filter>  
             <action android:name="android.nfc.action.NDEF_DISCOVERED"/>    
             <category android:name="android.intent.category.DEFAULT"/> 
            </intent-filter>
          </activity>

如果NDEF_DISCOVERED intent 已經(jīng)被啟動协屡,TECH_DISCOVERED 和 TAG_DISCOVERED intents 將不會被啟動俏脊。假如一個未知的tag或者不包含NDEF負載的tag被檢測到,此Intent就不會被啟動肤晓。

  • android.nfc.action.TECH_DISCOVERED: 如果 NDEF_DISCOVERED intent沒啟動或者沒有一個Activity的filter檢測NDEF_DISCOVERED 爷贫,并且此tag是已知的,那么此TECH_DISCOVERED Intent將會啟動. TECH_DISCOVERED intent要求你在一個資源文件里(xml)里指定你要支持technologies列表补憾。
<activity android:name=".MifareClassicActivity"
            android:launchMode="singleTop"
            android:label="讀寫MIFARECLASSIC格式"
            > 
         <intent-filter>
          <action android:name="android.nfc.action.TECH_DISCOVERED"/> 
            <category android:name="android.intent.category.DEFAULT"/> </intent-filter> 
           
            <meta-data  
           android:name="android.nfc.action.TECH_DISCOVERED"
           android:resource="@xml/tech_list"
            />
      </activity>
  • android.nfc.action.TAG_DISCOVERED: 如果沒有一個activity處理_DISCOVERED and TECH_DISCOVERED intents或者tag被檢測為未知的漫萄,那么此Intent將會被啟動。

假如你的Activity在AndroidManifest.xml文件里聲明了處理android.nfc.action.TECH_DISCOVERED intent 盈匾,你必須創(chuàng)建一個Xml格式的資源文件腾务,并加上你的activity支持的technologies到tech-list集合里。這樣你的activity將被認作能處理這些tech-list的處理者削饵,如果tag使用的technology屬于你的定義的list里岩瘦,你的Activity將接收此Intent未巫。你可以用getTechList()來獲得tag支持的technologies。
例如:如果一個tag被檢測到支持MifareClassic, NdefFormatable, 和 NfcA启昧,你的tech-list集合必須指定了其中的一項或者多項來保證你的Activity能處理此Intent叙凡。
你也可以指定多個tech-list集合,每個集合都認做獨立的密末。如果任何單個tech-list集合是getTechList()返回的technologies集合的子集狭姨,那么你的Activity將被認為匹配了。這個還提供’與’和’或’操作苏遥。
tech_filter.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<!--多個<tech-list>元素之間是OR關(guān)系,<tech-list>元素中的
<tech>是AND關(guān)系,只要任何單個tech-list集合是getTechList()返回的technologies集合的子集赡模,那么你的Activity將被認為匹配了--> 

  <tech-list> 
    <tech>android.nfc.tech.Ndef</tech> 
    <tech>android.nfc.tech.MifareClassic</tech> 
</tech-list> 

<!--或--> 

  <tech-list> 
    <tech>android.nfc.tech.IsoDep</tech> 
    <tech>android.nfc.tech.NfcA</tech> 
    <tech>android.nfc.tech.NfcB</tech> 
    <tech>android.nfc.tech.NfcF</tech> 
    <tech>android.nfc.tech.NfcV</tech> 
    <tech>android.nfc.tech.Ndef</tech> 
    <tech>android.nfc.tech.NdefFormatable</tech> 
    <tech>android.nfc.tech.MifareClassic</tech> 
    <tech>android.nfc.tech.MifareUltralight</tech> 
  </tech-list> 
</resources>

5.2使用前臺發(fā)布系統(tǒng)

前臺發(fā)布系統(tǒng)允許一個Activity 攔截一個tag Intent 獲得最高優(yōu)先級的處理田炭,這種方式很容易使用和實現(xiàn):

1. 在OnCreate()方法中創(chuàng)建一個 PendingIntent對象, 這樣Android系統(tǒng)就能在一個tag被檢測到時定位到這個對象
PendingIntent pendingIntent = PendingIntent.getActivity(
 this, 0, new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

==launchMode設(shè)為singleTop,這樣無論NFC標簽靠近手機多少次漓柑,保障只有一個Activity實例教硫。(除一次靠近調(diào)用OnCreate()方法外,標簽每一次靠近都會調(diào)用OnNewIntent()方法辆布。)==

2. 在主線程里調(diào)用enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][])而且Activity在前臺(可以在onResume()里調(diào)用來保證這點)
//頁面獲取到焦點 
  @Override 
  protected void onResume() {
   super.onResume(); 
   if (mNfcAdapter!=null){   
   mNfcAdapter.enableForegroundDispatch(
   this,mPendingIntent,null,null);
 //打開前臺發(fā)布系統(tǒng)瞬矩,使頁面優(yōu)于其它nfc處理 
 } 
}
//頁面失去焦點 
@Override 
  protected void onPause() { 
   super.onPause(); 
   if(mNfcAdapter!=null){ 
   mNfcAdapter.disableForegroundDispatch(this);
//關(guān)閉前臺發(fā)布系統(tǒng)
 } 
}
3.在OnNewIntent中獲取Tag對象
@Override
protected void onNewIntent(Intent intent) {   
super.onNewIntent(intent); 
 mTag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
 String[] techList=mTag.getTechList();  
 System.out.println("標簽支持的tachnology類型:"); 
 for (String tech:techList){ 
 System.out.println(tech); 
 } 
}

以上,是關(guān)于NFC的基礎(chǔ)知識锋玲,下一篇我們將實現(xiàn)對NFC Ndef標簽和MifareClassic標簽的讀寫操作,大家有什么意見或問題歡迎留言景用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惭蹂,隨后出現(xiàn)的幾起案子伞插,更是在濱河造成了極大的恐慌,老刑警劉巖盾碗,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媚污,死亡現(xiàn)場離奇詭異,居然都是意外死亡廷雅,警方通過查閱死者的電腦和手機耗美,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來航缀,“玉大人商架,你說我怎么就攤上這事〗嬗瘢” “怎么了甸私?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飞傀。 經(jīng)常有香客問我皇型,道長诬烹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任弃鸦,我火速辦了婚禮绞吁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唬格。我一直安慰自己家破,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布购岗。 她就那樣靜靜地躺著汰聋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喊积。 梳的紋絲不亂的頭發(fā)上烹困,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音乾吻,去河邊找鬼髓梅。 笑死,一個胖子當著我的面吹牛绎签,可吹牛的內(nèi)容都是我干的枯饿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼诡必,長吁一口氣:“原來是場噩夢啊……” “哼奢方!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爸舒,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤袱巨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碳抄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愉老,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年剖效,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫉入。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡璧尸,死狀恐怖咒林,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爷光,我是刑警寧澤垫竞,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響欢瞪,放射性物質(zhì)發(fā)生泄漏活烙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一遣鼓、第九天 我趴在偏房一處隱蔽的房頂上張望啸盏。 院中可真熱鬧,春花似錦骑祟、人聲如沸回懦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怯晕。三九已至,卻和暖如春缸棵,著一層夾襖步出監(jiān)牢的瞬間舟茶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工蛉谜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崇堵。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓型诚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸳劳。 傳聞我的和親對象是個殘疾皇子狰贯,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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