Android NFC近场通信02----读写MifareClassic卡

一.MifareClassic卡 相关

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

passwordA  存取控制    passwordB

数据块

3

1

块0

数据块

4

块1

数据块

5

块2

数据块

6

块3

passwordA  存取控制    passwordB

数据块

7

15

块0

数据块

60

块1

数据块

61

块2

数据块

62

块3

passwordA  存取控制    passwordB

数据块

63

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

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

每一个扇区的块3为控制块,包含了passwordA、存取控制、passwordB。

详细结构例如以下:

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

passwordA(6字节)          存取控制(4字节)
         passwordB(6字节)

每一个扇区的password和存取控制都是独立的,能够依据实际须要设定各自的password及存取控制;

存取控制为4个字节,共32位。扇区中的每一个块(包含数据块和控制块)的存取条件是由password和存取控制共同决定的。

工作原理:

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

二.读取数据 

//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 new NfcException(NfcErrorCode.TemporaryError,
"Authorization Error.");
}
} mc.close(); }
catch (NfcException ne) {
throw ne;
}
catch (IOException e) {
throw new NfcException(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 = 0
auth = 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 论坛 http://www.nfcchina.org/forum.php

Android NFC近场通信03----读写MifareClassic卡的更多相关文章

  1. Android NFC近场通信02----读写卡的准备工作

                        Android NFC近场通信02----读写卡的准备工作      因为公司接了一个听上去感觉比較NB的项目.给某油田做派工系统 .并由小女子负责Androi ...

  2. Android NFC近场通信1——NFC概述

    最近对NFC挺感兴趣,而且新换的手机也支持NFC功能(最近换了Find5,感觉还不错O(∩_∩)O),所以打算学学NFC编程.NFC就是我们经常说的近场通信.通常距离是4厘米或更短.NFC工作频率是1 ...

  3. Android NFC近场通信2——NFC标签调度

    上面一篇文章简单介绍了NFC的背景和技术应用,今天主要是讲解一下NFC如何发起通信和标签通信(主要是翻译android官网的资料,中间加入个人心得). NFC总是在一个发起者和一个被动目标之间发生.发 ...

  4. nfc近场通信

    NFC简介: Near Field Communication 近场通信,是一种数据传输技术. 与wifi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4cm. NFC支持3种工作 ...

  5. NFC:Arduino、Android与PhoneGap近场通信

    NFC:Arduino.Android与PhoneGap近场通信(第一本全面讲解NFC应用开发的技术著作移动智能设备近距离通信编程实战入门) [美]Tom Igoe(汤姆.伊戈),Don Colema ...

  6. Android近场通信---NFC基础转)

    Android近场通信---NFC基础(一)(转) 本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架 ...

  7. android nfc中MifareClassic格式的读写

    Android支持的数据格式 数据格式的Intent filter AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-dat ...

  8. Android NFC M1卡读写&芯片卡读写(CPU卡读写)(RFID读写)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sgn5200/article/detai ...

  9. Android近场通信---高级NFC(二)

    读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在直接使用NFC标签工作时,你依然能够读写NDE ...

随机推荐

  1. BoneBlack am335x can0 通讯配置与测试

    准备工具: 1.内核3.14.65,u-boot.文件系统 2.boneblack开发板 3.串口线.电源线,测试线,测试夹 一.配置内核支持CAN通讯 [*] Networking support ...

  2. 使用UniBeast安装Hackintosh(黑苹果)

    前期准备 UniBeast 原版macOS Sierra安装包,由于苹果并没有提供完整dmg的下载地址,我也不在此提供,大家可以从信任的途径取得,文件后缀必须为dmg. 16GB或者更大的U盘 至少2 ...

  3. 利用python实现新浪微博爬虫

    第一个模块,模拟登陆sina微博,创建weiboLogin.py文件,输入以下代码: #! /usr/bin/env python # -*- coding: utf-8 -*- import sys ...

  4. bzoj 3209 数位DP+欧拉定理

    枚举1的个数,统计有那么多1的数的个数 /************************************************************** Problem: 3209 Us ...

  5. FLASK开发简易blog的学习笔记

    首先,学会了如何创建一个新的包.就是在文件夹下创建__init__.py文件,就是在其他地方导入这个包了.

  6. ROS知识(10)----smach_viewer的Graph view不能显示状态图

    1.问题 在运行ROS by Example 2--Indigo版本中,运行 smach_viewer,再运行巡逻,命令如下: $ rosrun smach_viewer smach_viewer.p ...

  7. Linux终端(Xshell等)的编码设置

    先简单说说一下遇到的情况吧: 在用类似Xshell的工具连接远端Linux时,运行命令ls时,如果有中文,就会显示有乱码: 网上查资料时,也把相应的连接属性修改为utf-8了(见下图),但是还是不行: ...

  8. OpenCV/CUDA/Qt 环境配置小结

    OpenCV Qt CUDA windows环境下 配置 反复装过几次,每次都网搜攻略:自个做个记录 方便以后使用. 碰到OpenCV各种奇怪的错误 先看看 图片imread() 有没有读空 再找其他 ...

  9. phpcms功能列表

    上1 站点首页 就是前台首页 会员中心 跳到会员中心页面 搜索 新闻,图片等文档搜索 锁屏 锁住账号 Phpcms 官网 授权 官网查询 支持论坛 官网论坛 帮助 官网帮助 上2 我的面板 个人信息 ...

  10. NAS(Network Attached Storage:网络附属存储)

    NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为"网络存储器".它是一种专用数据存储服务器. ...