Android讀寫NFC

NFC卡種類很多,NFC讀寫芯片PN547可以支持格式

Android SDK API已經有封裝好的接口

http://www.android-doc.com/reference/android/nfc/tech/package-summary.html

14443和15693區別在於傳輸範圍,15693傳輸距離更遠。


14443A標籤卡

MifareClass:

標準卡

MifareUltralight:

這類卡相對較小,不加密,成本也低,只有幾百字節大小。

15693標籤卡

NfcV

8字節UID,最後一字節固定爲0xE0,需要發送寫的命令串才能讀。

命令列表,命令格式:標識 + 命令 + 參數 + 數據 + 校驗

示例代碼以cmd:0x20爲例



開始寫程序:

加入NFC權限:

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

支持NFC類型:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
</resources> />

應用消息過濾器:

<intent-filter >
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

當NFC靠近時,系統組件檢測到NFC發送Intent,這時候應用接收到消息後啓動。


Java代碼:

MifareClassic讀代碼

分爲幾個扇區,每個扇區有幾個block

		Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
		MifareClassic mifare = MifareClassic.get(tagFromIntent);
		mifare.connect();
		int type = mifare.getType();
		Count = mifare.getBlockCountInSector(0);
		bIndex = mifare.sectorToBlock(0);
		byte[] data = mifare.readBlock(bIndex);//可以讀bCount次
		bIndex++;

MifareUltralight代碼

分爲幾個page,每個page大小是4字節。

readPage接口一次讀4個頁,也就是16字節。

		Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
		MifareUltralight mifare =  MifareUltralight.get(tagFromIntent);		
		mifare.connect();			
		byte data [] = mifare.readPages(16 * i);//偏移

NfcV(15693)代碼

發送讀命令,等待接收返回,命令格式 flag + cmd + para + crc,crc自動計算,我們不用理會。ID號要作爲數據傳入。

示例讀取第1塊區域數據

                Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);		
		NfcV nv = NfcV.get(tagFromIntent);		
		nv.connect();
                byte[] ID = nv.getTag().getId();			
                byte[] cmd = new byte[11];
                cmd[1] = (byte) 0x20; // command
                for (int i = 0; i < ID.length; i++) {
                     cmd[i + 2] = ID[i];
                }
                cmd[10] = 1;//第一塊區域數據
                byte[] data = nv.transceive(cmd);





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