先了解一下MifareClassic协议

在android sdk 的文档中,描述道 “allI/O operations will be supported, andNDEF tags will also be supported. In either case,will also be enumerated on the tag, because all MIFARE Classic tags are also.” 所以说NFCA协议是兼容MifareClassic 协议的, 我们可以通过NfcA在android的相关类来处理给予MifareClassic 的RFID卡。

一般来说,给予MifareClassic的射频卡,一般内存大小有3种:

1K: 16个分区(sector),每个分区4个块(block),每个块(block) 16个byte数据

2K: 32个分区,每个分区4个块(block),每个块(block) 16个byte数据

4K:64个分区,每个分区4个块(block),每个块(block) 16个byte数据

对于所有基于MifareClassic的卡来说,每个区最后一个块叫Trailer,16个byte, 主要来存放读写该区的key,可以有A,B两个KEY,每个key长6byte,默认的key一般是FF 或 0,最后一个块的内存结构如下:

Block 0  Data 16bytes

Block 1  Data 16 bytes

Block 2  Data 16 bytes

Block 3  Trailer 16 bytes

Trailer:

Key A: 6 bytes

Access Conditions: 4 bytes

Key B: 6 bytes

所以在写卡的内存的时候,一般不能写每个sector的最后一个block,除非你有要修改KEY和访问权限的需求。如果KEY A 被你不小心修改掉了,而你不知道修改成什么,那与之对应的那个sector你就没有办法访问了。因为在MifareClassic中,如果你要读取数据,那么必须要有这个数据地址所在的sector的权限,这个权限就是这个sector的trailer的keyA或KEY B。

读数据的例子:

//tag 就是在上一篇中onNewIntent中获取的tag

MifareClassic mc =MifareClassic.get(tag);short startAddress =0;short endAddress =5;byte[] data = new byte[(endAddress - startAddress + 1 ) *ByteCountPerBlock];try{

mc.connect();for (short i = startAddress; i <= endAddress; i++ ,time++) {boolean auth = false;short sectorAddress =getSectorAddress(i);

auth=mc.authenticateSectorWithKeyA(sectorAddress, MifareClassic.KEY_DEFAULT);if(auth){//the last block of the sector is used for KeyA and KeyB cannot be overwritted

short readAddress = (short)(sectorAddress == 0 ? i : i +sectorAddress);byte[] response =mc.readBlock(readAddress);

CombineByteArray(data, response, time*ByteCountPerBlock);

}else{throw newNfcException(NfcErrorCode.TemporaryError,"Authorization Error.");

}

}

mc.close();

}catch(NfcException ne) {throwne;

}catch(IOException e) {throw newNfcException(NfcErrorCode.TemporaryError,"Get response, what it is not successfully.", e);

}finally{try{

mc.close();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

写数据的例子:

//tag 就是在上一篇中onNewIntent中获取的tag

MifareClassic mc =MifareClassic.get(tag);try{

mc.connect();boolean auth = false;short sectorAddress = 0auth=mc.authenticateSectorWithKeyA(sectorAddress,

MifareClassic.KEY_DEFAULT);if(auth) {//the last block of the sector is used for KeyA and KeyB cannot be overwritted

mc.writeBlock(readAddress, dataTemp);

mc.close();

}}finally{try{

mc.close();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}}

完整的代码示例在这里下载

nfc读写程序专业版卡密_NFC (二)读写MifareClassic协议的NFC卡相关推荐

  1. NFC读写MifareClassic协议的NFC卡

    IC卡 (Integrated Circuit Card,集成电路卡) 有些国家和地区也称智能卡(smart card).智慧卡(intelligent card).微电路卡(microcircuit ...

  2. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...

  3. 容易忽视但是功能灰常强大的Java API(二. 读写对象)

    二. 读写对象 有时候你会遇到这样的情况:从数据集合中读取数据,解析数据,然后封装成对象,再把对象放到一个集合中,对集合对象进行操作,程序结束.第二次需要运行程序时,又按如上的操作流程做一遍.第三次, ...

  4. AT24C02读写程序

    AT24C02读写程序 单片机:STM32F030F4 编辑环境:keil+stm32cubemx6.6.1 一.硬件配置 二.程序编辑 1.头文件 /********************** A ...

  5. Android手机nfc基础及ndef标准标签消息读写

    官方API: https://developer.android.google.cn/guide/topics/connectivity/nfc/nfc 基础概念,什么是nfc? Near Field ...

  6. NFC之基于51单片机rc522的读写

    NFC之基于51单片机rc522的读写 改程序,端口定义 上位机修改com口

  7. c语言中读取flash值的作用,flash读写程序

    原标题:flash读写程序 在电子工程世界为您找到如下关于"flash读写程序"的新闻 msp430F149单片机的flash读写程序 //基于msp430F149单片机的flas ...

  8. LPS25HB 寄存器读写程序解读

    文章目录 LPS25HB 寄存器读写程序解读 1.读写功能的统一接口函数 2.设计结构体函数指针来调用统一的读写函数 3.与通信方式无关的寄存器读写抽象函数接口 LPS25HB 寄存器读写程序解读 一 ...

  9. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)

    <STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...

最新文章

  1. 重复调用的代码块——方法
  2. hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据
  3. 【多线程】多线程锁住的是什么、std::lock_guard<std::mutex> locker(mutex_)
  4. 【Python基础】学习用Pandas处理分类数据!
  5. Linux管道用法示例
  6. wxWidgets:wxRegKey类用法
  7. js利用localStorage和sessionStorage完成记住我功能
  8. listwidget设置条目文本居中_将Word文档中的所有图片一键居中对齐,这个方法比插件更好用!...
  9. 技巧----时间优化
  10. css3 修改checkbox disabled颜色_HTML5 + CSS3 gt;gt;gt; 009
  11. MFC 盾webBrowser打开弹出的页面
  12. sql优化的几种方法
  13. 5G 协议 标准 下载
  14. JDK动态代理和CGLIB动态代理介绍
  15. wps excel连接MySQL数据库可刷新实时读取数据
  16. 企业如何做好终端设备管理?
  17. mysql实现俩个属性加减运算_mysql加减乘除
  18. JAVA打印指定长度的随机英文字母(小写)
  19. Nginx负载均衡策略 - least_conn 最少连接
  20. PS吸管工具用不了?

热门文章

  1. 转载 半步八拍(单双八拍)步进电机
  2. 正则表达式爬取贵州财经大学-信息学院官网
  3. android imageview src获取,Android ImageView Src 和Background 区别
  4. Kaiming He 论文阅读笔记一——Masked Autoencoders
  5. apollo 官网地址
  6. java aidl多线程_AIDL踩坑实战
  7. pip install urllib2失败
  8. java 后端实现页面跳转
  9. linux系统中tar命令的使用,Linux系统下正确使用tar命令的操作方法
  10. vue暴露一个就js 以及引入详解