from: http://wszf.net/archives/2012/11/07/80510.html

一般来说,给予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

M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,)存贮结构如右表所示

0

块0

数据块

0

块1

数据块

1

块2

数据块

2

块3

密码A存取控制    密码B

数据块

3

1

块0

数据块

4

块1

数据块

5

块2

数据块

6

块3

密码A存取控制    密码B

数据块

7

15

块0

数据块

60

块1

数据块

61

块2

数据块

62

块3

密码A存取控制    密码B

数据块

63

第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。

每个扇区的块0、块1、块2为数据块,可用于存贮数据。

每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:

A1A2 A3 A4 A5               FF 07 8069               B0 B1 B2 B3 B4 B5

密码A(6字节)          存取控制(4字节)          密码B(6字节)

每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制;

存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的。工作原理:

读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与讯写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。

Android 读写M1卡

先了解一下MifareClassic协议

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

读M1卡代码:

01

if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action))

02

{

03

// 3) Get an instance of the TAG from the NfcAdapter

04

Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

05

// 4) Get an instance of the Mifare classic card from this TAG

06

// intent

07

mfc = MifareClassic.get(tagFromIntent);

08

if(mfc!=null)

09

{

10

Toast.makeText(this,"检测到卡片,读卡中。。。", Toast.LENGTH_SHORT).show();

11

try

12

{

13

mfc.connect();

14

boolean auth =false;

15

auth = mfc.authenticateSectorWithKeyA(15,"passwo".getBytes());//验证密码

16

if (auth)

17

{

18

card_number_edittext.setText(new String(mfc.readBlock(60)));//读取M1卡的第60块即15扇区第0块

19

password_edittext.requestFocus();

20

}

21

}catch (Exception e)

22

{

23

if(BuildConfig.DEBUG)

24

{

25

e.printStackTrace();

26

}

27

28

}

29

}

30

}// End of method

写M1卡代码:

01

try

02

{

03

mfc.connect();

04

boolean auth =false;

05

short sectorAddress =1;

06

auth = mfc.authenticateSectorWithKeyA(sectorAddress, MifareClassic.KEY_DEFAULT);

07

if (auth)

08

{

09

// the last block of the sector is used for KeyA and KeyB cannot be overwritted

10

mfc.writeBlock(4,"1383838438000000".getBytes());//必须为16字节不够自己补0

11

mfc.close();

12

Toast.makeText(MainActivity.this,"写入成功", Toast.LENGTH_SHORT).show();

13

}

14

}catch (IOException e)

15

{

16

// TODO Auto-generated catch block

17

e.printStackTrace();

18

}finally

19

{

20

try

21

{

22

mfc.close();

23

}catch (IOException e)

24

{

25

// TODO Auto-generated catch block

26

e.printStackTrace();

27

}

28

}

Demo下载地址:NFCDemo

参考资料:1/2/3/4/5

posted on 2012-12-25 11:47 汪杰 阅读(12494) 评论(3)  编辑 收藏 引用

nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)相关推荐

  1. android nfc 原始读取,Android NFC读取数据

    1.添加相应的权限和gradle引用 android:name="android.hardware.nfc" android:required="true"/& ...

  2. android nfc扇区加密,android NFC MifareClassic 读IC卡加密扇区方法

    近段时间在做android下NFC的M1卡的加密扇区的读取,参考了Android_磊子的操作基础内容,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassi ...

  3. android nfc标签类型,Android NFC标签 开发深度解析 触碰的艺术

    原标题:Android NFC标签 开发深度解析 触碰的艺术 本文来自于CSDN博客,作者:郭朝,已获授权,版权归原作者所有,未经作者同意,请勿转载. 欢迎同有博客好文章的作者加微信(ID:tm_fo ...

  4. android nfc框架分析,Android NFC架构分析

    原创:木头月亮 来自:http://blog.csdn.net/mutouyueliang/archive/2011/03/08/6232028.aspx Android中对NFC的实现代码分布在如下 ...

  5. android开发相关资料整理【2011-11-10】

    常用的Android指令和模拟器参数 如何在windows下不用Eclipse,用dos命令启动emulator呢??? Android中的Task相关问题: Flag和LaunchMode同时起作用 ...

  6. android nfc开发教程,Android NFC开发实战

    您可能感兴趣的话题: Android 核心提示:本教程为大家介绍android开发中NFC实例. 对于Android 4.0 SDK中提供的Beam例子,对于NFC开发来说的确是一个不错的模板.对于了 ...

  7. android开发相关资料整理【2011-10-29】

    外文译本--andbook Android开发基础书籍 Android CheckBox的isChecked属性 方法的反射 Android BluetoothClass.Device Android ...

  8. android开发相关资料整理【2011-10-04】

    请求服务器的问题? webview加载页面时部分js失效问题 ImageButton,OnClick事件报空指针,怎么回事? 请问如何让Service在待机时仍然运行? 如何在android中实现自己 ...

  9. android 录音相关资料

    http://www.eoeandroid.com/thread-171763-1-1.html 一.实例教程:Android设备功能之录音教程篇: 1.Android中的录音效果 (火) http: ...

最新文章

  1. mkdir、rmdir命令、head、tail命令
  2. everedit选择_EverEdit(文本编辑器)
  3. leetcode 242. 有效的字母异位词(Java版)
  4. 前端也要懂Http缓存机制
  5. 【Apache】Apache ab压力测试工具Window下载和用法详解
  6. OGNL、EL表达式——Struts
  7. oracle中的脱机与联机,使存储池中的设备联机和脱机
  8. BestCoder Round #70
  9. ADODB.Connection、ADODB.RecordSet
  10. CentOS 桌面版安装配置(以CentOS 7为例)
  11. vue项目之页面底部出现白边及空白区域错误记录
  12. 本地idea通过tomcat启动服务停滞
  13. 中报业绩被华夏幸福拖累,“50元”的中国平安是否值得珍惜?
  14. SWUST OJ#1052 输出利用先序遍历创建的二叉树中的指定结点的双亲结点
  15. linux su无效_linux系统 su切换用户失败情况
  16. JS中NaN定义与用法
  17. 股市非常态,CCI指标买卖点实例图解
  18. RabbitMQ(Java操作工作队列-按劳分配方式)
  19. Migrate DB data using expdp/impdp
  20. ubuntu18.04卸载cuda11.3安装cuda10.2

热门文章

  1. Kubernetes 部署 Ingress 控制器 Traefik v1.7.4
  2. centos安装php7编译
  3. 跨考计算机教研室,跨考教研室专家:脱离题海沉浮 做到有效做题_跨考网
  4. 计算机组成原理和体系结构----软考(到处copy)
  5. win10创建新的计算机用户名和密码错误,Win10开机提示用户名或密码不正确现象的解决办法...
  6. python读取sqlserver的数据_Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例...
  7. python模型的属性是什么_python – Django:为什么Django模型字段的类属性?
  8. c语言数码管的动态显示时间,8位数码管动态显示时间,可调节,调节的数闪烁显示...
  9. sql中in和exist语句的区别?
  10. mysql partition 性能_通过分区(Partition)提升MySQL性能