Android-NFC模塊學習(1)

想要學習Android的NFC模塊,首先要了解,什麼是NFC,NFC是怎麼來的

首先我們先了解ID IC RFID  NFC Mifare卡各種概念的關係

 1. IC和ID卡的區別:

ID卡僅僅記錄卡號,卡內的卡號讀取無任何權限,易於仿製. ID卡不可寫入數據,其記錄內容(卡號)只可由芯片生產廠一次性寫入,開發商可讀出卡號加以利用,無法根據系統的實際需要制訂新的號碼管理制度.  IC卡內所記錄數據的讀取,寫入均需相應的密碼認證,甚至卡片內每個區均有不同的密碼保護,全面保護數據安全,IC卡寫數據的密碼與讀出數據密碼可設爲不同,提供了良好分級管理方式,確保系統安全.IC卡不僅可由授權用戶讀出大量數據,而且亦可由授權用戶寫入大量數據(如新的卡號,用戶的權限,用戶資料等),IC卡所記錄內容可反覆擦寫. IC卡的安全性遠大於ID

 

2.IC卡和RFID

卡的區別IC卡分爲接觸式和非接觸式IC卡,都屬於RFID範疇,接觸式IC卡其芯片直接封裝在卡基表面,而非接觸式IC卡是由芯片和線圈組成,可分爲

COB    線、蝕      印刷天線等等,兩者的應用區別在於:前者在使用過程中需要插入讀卡器使用,例如銀行卡,後者僅需要靠近讀卡器感應天線就能被讀取,例如交通卡、門禁卡。

 

RFID卡是指非接觸式類電子卡片/標籤,包括有ID卡、IC卡和NFC卡以及其它等電子卡/標籤。他們主要的區別在於工作頻段。

 ID卡是早期的非接觸式電子標籤,工作頻段在125kHz只有一個ID號,不可以存儲任何數據,故叫ID卡。

 

IC卡如從字義上面理解,是包括了除ID卡外的其它RFID電子標籤和接觸式的芯片卡,不過一般說IC卡主要是指工作於13.56MHz頻段的非接觸式智能卡和接觸式智能卡,而非接觸式智能卡也就包括了NFC卡片或標籤(NFC論壇規定有四種卡片類型屬於NFC卡片),接      智能卡也就是帶個裸露芯片的智能卡。

  RFID卡還包括其它工作頻段的電子卡/標籤,如915MHz2.4GHz等頻段。 

 

3.RFID卡和NFC卡的區別

  NFC是在RFID的基礎上發展而來,NFC從本質上與RFID沒有太大區別,都是基於地理位置相近的兩個物體之間的信號傳輸。

  NFCRFID還是有區別的,NFC技術增加了點對點通信功能,可以快速建立藍牙設備之間的P2P(點對點)無線通信,NFC設備彼此尋找對方並建立通信連接。P2P通信的雙方設備是對等的,而RFID通信的雙方設備是主從關係。 

其餘還有一些技術細節方面:

  NFC相較於RFID技術,具有距離近、帶寬高、能耗低等一些特點。詳細內容: 

1.NFC只是限於13.56MHz的頻段!而RFID的頻段有低頻(125KHz135KHz),高頻(13.56MHz)和超高頻(860MHz960MHz之間。 

2.工作有效距離:NFC(小於10cm,所以具有很高的安全性),RFID距離從幾米到幾十米都有! 

3.因爲同樣工作於13.56MHzNFC與現有非接觸智能卡技術兼容,所以很多的廠商和相關團體都支持NFC,而

RFID標準較多,統一較爲複雜(估計是沒可能統一的了),只能在特殊行業有特殊需求下,採用相應的技術標準! 

4.應用:RFID更多的被應用在生產、物流、跟蹤、資產管理上,而NFC則在門禁、公交、手機支付等領域內發揮着巨大的作用。

 

  4.Mifare系列卡區別

Mifare系列卡pain根據卡內使用芯片不同分爲

Miare UltraLight 又稱爲MF0

Mifare S50S70,又稱爲MF1

Mifare Pro 又稱爲MF2

Mifare DesFire 又稱爲MF3

 

Mifare 1 有密碼 Mifare UltraLight沒有密碼

M1/ML/UltraLight/Mifare Pro 都遵守14443A協議,AT88RF020遵守14443B

Mifare S50S70的區別:

   一是讀寫器對卡片發出請求命令,二者應答返回的卡類型(ATQA)字節不同, S50的卡類型是0004H,S70的卡類型是0002H,另一個區別就是二者容量和內存結構不同,S50容量是1K字節,S70容量是4K字節


不知道看到這裏,還有沒有看下去的勇氣,以上的內容也是我從網上找的,感覺說的還是比較詳細的,最起碼這些卡的分類和區別能讓我有一個基本的認識,下面就說說Android系統的NFC模塊

  首先你得有一個有NFC模塊的手機或者平板,華爲、小米、三星等

 NFC的TAG分發:

  打開NFC功能,保持屏幕點亮並且要解鎖屏幕

  當系統檢測到一個NFC標籤的時候,他會自動去尋找最合適的activity去處理這個intent.

他所發出的這個Intent將會有三種action:

ACTION_NDEF_DISCOVERED:當系統檢測到tag中含有NDEF格式的數據時,且系統中有activity聲明可以接受包含NDEF數據的Intent的時候,系統會優先發出這個action的intent。

ACTION_TECH_DISCOVERED:當沒有任何一個activity聲明自己可以響應ACTION_NDEF_DISCOVERED時,系統會嘗試發出TECH的intent.即便你的tag中所包含的數據是NDEF的,但是如果這個數據的MIMEtype或URI不能和任何一個activity所聲明的想吻合,系統也一樣會嘗試發出tech格式的intent,而不是NDEF.

ACTION_TAG_DISCOVERED:當系統發現前兩個intent在系統中無人會接受的時候,就只好發這個默認的TAG類型的

Android的androidManifest文件配置權限

  <uses-permissionandroid:name="android.permission.NFC"/>

然後是sdk級別限制:<uses-sdkandroid:minSdkVersion="10"/> 10以上

接着是特殊功能限制<uses-featureandroid:name="android.hardware.nfc"android:required="true"/>這個可以讓你的應用在googleplay上被聲明使用者必須擁有nfc功能

   NFC標籤過濾

    

在activity的intent過濾xml聲明中,你可以同時聲明過濾這三種action.但是由之前所說,你應該知道系統在發送intent的時候是有優先級的,所以你最好清楚自己最想處理哪個。

1:過濾ACTION_TAG_DISCOVERED:

    <intent-filter>

        <action android:name="android.nfc.action.TAG_DISCOVERED"/>

        <category android:name="android.intent.category.DEFAULT"/>
     <data android:mimeType="text/plain" />
     </intent-filter>
這個最簡單,也是最後一個被嘗試接受intent的選項
data的mimeType類型了,這個定義的越準確,intent指向你這個activity的成功率就越高,否則系統可能不會發出你想要的NDEF intent了

   
過濾ACTION_TECH_DISCOVERED:
你首先需要在你的<project-path>/res/xml下面創建一個過濾規則文件。名字任取,比如可以叫做nfc_tech_filter.xml。這個裏面定義的是nfc實現的各種標準,每一個nfc卡都會符合多個不同的標準,個人理解爲這些標準有些相互之間也是兼容的。你可以在檢測到nfc標籤後使用getTechList()方法來查看你所檢測的tag到底支持哪些nfc標準。
一個nfc_tech_filter.xml中可以定義多個<tech-list>結構組。每一組代表我聲明我只接受同時滿足這些標準的nfc標籤。比如A組表示,只有同時滿足IsoDep,NfcA,NfcB,NfcF這四個標準的nfc標籤的intent才能進入。A與B組之間的關係就是隻要滿足其中一個就可以了。換句話說,你的nfc標籤技術,滿足A的聲明也可以,滿足B的聲明也可以。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list> --------------------------------A組
<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-list>
<tech-list>-----------------------------------------B組 
<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>

在androidManifest文件中聲明xml過濾的舉例如下

<activity> 
 <intent-filter> 
<action android:name="android.nfc.action.TECH_DISCOVERED"/> 
</intent-filter> 
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"      android:resource="@xml/nfc_tech_filter" />-------------這個就是你的資源文件名 
 </activity>

nfc標籤前臺分發系統
之所以把他也歸類在nfc的過濾裏面,主要是因爲他跟解析nfc標籤到不是那麼的緊密,他解決的是接受哪些nfc標準的標籤問題。所以更接近nfc的過濾。
什麼叫nfc的前臺發佈系統?就是說當我們已經打開我們的應用的時候,那麼通過這個前臺發佈系統的設置,我們可以讓我們已經啓動的activity擁有更高的優先級來依據我們在代碼中定義的標準來過濾和處理intent,而不是讓別的聲明瞭intent
 filter的activity來干擾,甚至連自己聲明在androidManifest中的intent 
filter都不會來干擾。也就是說foreground Dispatch的優先級大於intent filter。
第一種情況:當你的activity沒有啓動的時候,去掃描tag,那麼系統中所有的intent filter都將一起參與過濾。
第二種情況:當你的actiity啓動了,去掃描tag時,那麼將直接使用你在foreground dispatch中代碼寫入的過濾標準。如果這個標準沒有命中任何intent,那麼系統將使用所有activity聲明的intent filter xml來過濾。
在OnCreate中你可以添加如下代碼        
// Create a
 generic PendingIntent that will be deliver to this activity. The NFC 
stack will fill in the intent with the details of the discovered tag 
before delivering to this activity.
   mPendingIntent = PendingIntent.getActivity(this, 0,

             new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        

        // 做一個IntentFilter過濾你想要的action 這裏過濾的是ndef

        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
//如果你對action的定義有更高的要求,比如data的要求,你可以使用如下的代碼來定義intentFilter

//        try {

//            ndef.addDataType("*/*");

//        } catch (MalformedMimeTypeException e) {

//            // TODO Auto-generated catch block

//            e.printStackTrace();

//        }

     //生成intentFilter   

        mFilters = new IntentFilter[] {

                ndef,

        };

        

        // 做一個tech-list。可以看到是二維數據,每一個一維數組之間的關係是或,但是一個一維數組之內的各個項就是與的關係了

        mTechLists = new String[][] { 

                new String[] { NfcF.class.getName()},

                new String[]{NfcA.class.getName()},

                new String[]{NfcB.class.getName()},

                new String[]{NfcV.class.getName()}

                };
在onPause和 onResume中需要加入相應的代碼。
public void onPause() {
 super.onPause();
//反註冊 mAdapter.disableForegroundDispatch(this); 
}
 
 public void onResume() {
 super.onResume();
//設定intentfilter和tech-list。如果兩個都爲null就代表優先接收任何形式的TAG action。也就是說系統會主動發TAG intent。 
mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章