Android NFC开发教程: Mifare Tag读写示例

移动开发 Android
本文介绍Mifare Tag的具体规格,和如何利用Android SDK中的NFC包来读写Mifare Tag中的数据。

本例针对常用的Mifare Tag具体说明。

Mifare Tag 可以有1K ,2K, 4K,其内存分区大同小异,下图给出了1K字节容量的Tag的内存分布:

数据分为16个区(Sector) ,每个区有4个块(Block) ,每个块可以存放16字节的数据,其大小为16 X 4 X 16 =1024 bytes。

每个区***一个块称为Trailer ,主要用来存放读写该区Block数据的Key ,可以有A,B两个Key,每个Key 长度为6个字节,缺省的Key值一般为全FF或是0. 由 MifareClassic.KEY_DEFAULT 定义。

因此读写Mifare Tag 首先需要有正确的Key值(起到保护的作用),如果鉴权成功:

  1. auth = mfc.authenticateSectorWithKeyA(j, MifareClassic.KEY_DEFAULT); 

然后才可以读写该区数据。

本例定义几个Mifare相关的类 MifareClassCard ,MifareSector, MifareBlock 和MifareKey 以方便读写Mifare Tag.

Android 系统来检测到NFC Tag, 将其封装成Tag类,存放到Intent的NfcAdapter.EXTRA_TAG Extra 数据包中,可以使用MifareClassic.get(Tag) 获取对象的 MifareClassic类。

  1. Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
  2. // 4) Get an instance of the Mifare classic card from this TAG 
  3. // intent MifareClassic mfc = MifareClassic.get(tagFromIntent);  

下面为读取Mifare card 的主要代码:

  1. // 1) Parse the intent and get the action that triggered this intent  
  2. String action = intent.getAction();  
  3. // 2) Check if it was triggered by a tag discovered interruption.  
  4. if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {  
  5. // 3) Get an instance of the TAG from the NfcAdapter  
  6. Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
  7. // 4) Get an instance of the Mifare classic card from this TAG  
  8. // intent  
  9. MifareClassic mfc = MifareClassic.get(tagFromIntent);  
  10. MifareClassCard mifareClassCard=null;  
  11.   
  12. try { // 5.1) Connect to card  
  13. mfc.connect();  
  14. boolean auth = false;  
  15. // 5.2) and get the number of sectors this card has..and loop  
  16. // thru these sectors  
  17. int secCount = mfc.getSectorCount();  
  18. mifareClassCard= new MifareClassCard(secCount);  
  19. int bCount = 0;  
  20. int bIndex = 0;  
  21. for (int j = 0; j < secCount; j++) {  
  22. MifareSector mifareSector = new MifareSector();  
  23. mifareSector.sectorIndex = j;  
  24. // 6.1) authenticate the sector  
  25. auth = mfc.authenticateSectorWithKeyA(j,  
  26. MifareClassic.KEY_DEFAULT);  
  27. mifareSector.authorized = auth;  
  28. if (auth) {  
  29. // 6.2) In each sector - get the block count  
  30. bCount = mfc.getBlockCountInSector(j);  
  31. bCount =Math.min(bCount, MifareSector.BLOCKCOUNT);  
  32. bIndex = mfc.sectorToBlock(j);  
  33. for (int i = 0; i < bCount; i++) {  
  34.   
  35. // 6.3) Read the block  
  36. byte []data = mfc.readBlock(bIndex);  
  37. MifareBlock mifareBlock = new MifareBlock(data);  
  38. mifareBlock.blockIndex = bIndex;  
  39. // 7) Convert the data into a string from Hex  
  40. // format.  
  41.   
  42. bIndex++;  
  43. mifareSector.blocks<i> = mifareBlock;  
  44.   
  45. }  
  46. mifareClassCard.setSector(mifareSector.sectorIndex,  
  47. mifareSector);  
  48. else { // Authentication failed - Handle it  
  49.   
  50. }  
  51. }  
  52. ArrayList<String> blockData=new ArrayList<String>();  
  53. int blockIndex=0;  
  54. for(int i=0;i<secCount;i++){  
  55.   
  56. MifareSector mifareSector=mifareClassCard.getSector(i);  
  57. for(int j=0;j<MifareSector.BLOCKCOUNT;j++){  
  58. MifareBlock mifareBlock=mifareSector.blocks[j];  
  59. byte []data=mifareBlock.getData();  
  60. blockData.add("Block "+ blockIndex++ +" : "+  
  61. Converter.getHexString(data, data.length));  
  62. }  
  63. }  
  64. String []contents=new String[blockData.size()];  
  65. blockData.toArray(contents);  
  66. setListAdapter(new ArrayAdapter<String>(this,  
  67. android.R.layout.simple_list_item_1, contents));  
  68. getListView().setTextFilterEnabled(true);  
  69.   
  70. catch (IOException e) {  
  71. Log.e(TAG, e.getLocalizedMessage());  
  72. showAlert(3);  
  73. }finally{  
  74.   
  75. if(mifareClassCard!=null){  
  76. mifareClassCard.debugPrint();  
  77. }  
  78. }  

运行结果:

 

责任编辑:徐川 来源: eoeAndroid
相关推荐

2013-01-23 14:33:04

Android开发NFC

2011-10-11 10:33:06

RIM黑莓NFC

2013-12-27 14:34:46

Android开发Android应用短信触发示例

2013-12-27 13:49:22

Android开发Android应用Button

2013-12-27 12:51:44

Android开发Android应用引路蜂

2011-08-22 12:01:38

iPhone开发文件

2023-12-22 09:11:45

AndroidNFC移动开发

2013-01-23 13:35:46

AndroidNFC学生卡

2010-12-23 09:11:17

读写Android文件

2015-01-26 13:16:30

NFCAndroid

2015-02-26 14:17:45

2016-11-14 15:40:01

Android

2011-09-13 17:15:58

Eclipse And

2011-09-14 10:52:39

Android 2.2

2011-09-07 13:00:36

2014-08-26 11:46:46

QtAndroid实例教程

2010-10-13 12:12:19

网络安全身份验证HID Global

2013-12-26 15:18:09

Android开发安装开发环境

2014-02-26 13:08:48

AndroidService教程

2013-12-26 15:10:08

Android开发应用和框架Linux 内核
点赞
收藏

51CTO技术栈公众号