上一章簡單的介紹了 一下NFC android 中的認識 和配置,這次認識一下NFC 卡片。
卡片一共 分為16個扇區(sector),每個扇區又分為4個塊(block) 每個塊 包含16個字節,
比如“1234567890123456”, “ASDFGHJKLQWERTYU”,可以存取一些信息,
因為卡片的類型不同,所以在存取的時候需要注意一下,
比如 對於一般的 MifareClassic 來說, 第一扇區 第一塊 一般會被廠家占用,這里是不能被寫入數據的,每一扇區的 最后一塊,也就是第四block,是用來存放密碼或控制位的,其余的三個塊是數據區,這里可以存放我們的數據。
而對於 MifareUltralight 來說, 一般 前四扇區 是不能夠 寫數據的,而且沒有密碼。
當你在第幾扇區第幾塊中寫的數據,就需要 在第幾扇區第幾塊中讀出來。
寫數據流程為: data (符合要求的16位)
public void writeTag(Tag tag) { MifareClassic mfc = MifareClassic.get(tag); try { mfc.connect(); boolean auth = false; short sectorAddress = 1; auth = mfc.authenticateSectorWithKeyA(sectorAddress, MifareClassic.KEY_DEFAULT); if (auth) { // the last block of the sector is used for KeyA and KeyB cannot be overwritted mfc.writeBlock(4, "1313838438000000".getBytes()); mfc.writeBlock(5, "ASDFGHJKLl000000".getBytes()); mfc.close(); Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { mfc.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();
我們把數據寫入了第一扇區的第四和第五塊,
然后從第四區和第五區讀出來
public String readTag(Tag tag) { MifareClassic mfc = MifareClassic.get(tag); for (String tech : tag.getTechList()) { System.out.println(tech); } boolean auth = false; //讀取TAG try { String metaInfo = ""; //Enable I/O operations to the tag from this TagTechnology object. mfc.connect(); int type = mfc.getType();//獲取TAG的類型 int sectorCount = mfc.getSectorCount();//獲取TAG中包含的扇區數 String typeS = ""; switch (type) { case MifareClassic.TYPE_CLASSIC: typeS = "TYPE_CLASSIC"; break; case MifareClassic.TYPE_PLUS: typeS = "TYPE_PLUS"; break; case MifareClassic.TYPE_PRO: typeS = "TYPE_PRO"; break; case MifareClassic.TYPE_UNKNOWN: typeS = "TYPE_UNKNOWN"; break; } metaInfo += "卡片類型:" + typeS + "\n共" + sectorCount + "個扇區\n共" + mfc.getBlockCount() + "個塊\n存儲空間: " + mfc.getSize() + "B\n"; for (int j = 0; j < sectorCount; j++) { //Authenticate a sector with key A. auth = mfc.authenticateSectorWithKeyA(j, MifareClassic.KEY_NFC_FORUM); int bCount; int bIndex; if (auth) { metaInfo += "Sector " + j + ":驗證成功\n"; // 讀取扇區中的塊 bCount = mfc.getBlockCountInSector(j); bIndex = mfc.sectorToBlock(j); for (int i = 0; i < bCount; i++) { byte[] data = mfc.readBlock(bIndex); metaInfo += "Block " + bIndex + " : " + bytesToHexString(data) + "\n"; bIndex++; } } else { metaInfo += "Sector " + j + ":驗證失敗\n"; } } return metaInfo; } catch (Exception e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } finally { if (mfc != null) { try { mfc.close(); } catch (IOException e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG) .show(); } } } return null;
上面是把 卡片的所有信息 讀出來,如果需要第四和第五的,自己可以改動取值。
因為存在卡片中的為16進制(不是16進制字符串),所以需要 先轉為16進制字符串,然后再轉為自己用的字符串就可以了
代碼就不貼了,網上一搜一大把,關鍵是 認識 自己需要什么樣的 類型,不要用錯了