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();

}

}

}

android 近场通信,Android NFC近场通信03----读写MifareClassic卡(示例代码)相关推荐

  1. Android nfc模块读写MifareClassic卡50

     http://3y.uu456.com/bp_8mhvy4gizz721et5ih0i_1.html 一般来说,基于MifareClassic的射频卡:1K:16个分区(sector),每个分区 ...

  2. android 代码 卸载app,Android在一个app中安装并卸载另一个app的示例代码

    Android在一个app中安装并卸载另一个app 1.在app→src→main下新建文件夹asserts,将准备安装的apk文件放在asserts内 2.在app→src→main→res下新建文 ...

  3. android studio导入jar包和so库,Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库(示例代码)...

    第三方类库源码 将一网友的XMPP代码从ADT转到AS时,发现其使用了第三方类库,源码放在了lib下,直接在AS中Import project,第三方类库并没有自动导入进来,看来需要自己动手了. 项目 ...

  4. android有道翻译代码,Android使用有道翻译API实如今线翻译功能(示例代码)

    在Android应用中,加入在线翻译的功能,这里调用的是有道翻译的API. 使用有道翻译API.首先要申请一个key,申请地址为:有道翻译API申请地址. 申请之后就会得到一个keyfrom和一个ke ...

  5. android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...

  6. android自定义水波纹,Android自定义View——实现水波纹效果类似剩余流量球(示例代码)...

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  7. 百度 android geocoding,百度地图经纬度批量查找功能XGeocoding使用手册(示例代码)

    <XGeocoding使用手册> 1.下载XGeocoding V2 http://www.gpsspg.com/xgeocoding/download/ 2.解压XGeocoding_v ...

  8. android 模拟器监听短信,android模拟器用命令和DDMS模拟来电和短信(示例代码)

    以下方法均测试成功 一.用命令模拟 (一).模拟来电 1.打开命令行cmd,输入telnet 回车. 2.然后输入 o localhost 5554 回车,连到Emulator上. 3.输入gsm c ...

  9. android仿喜马拉雅APP状态栏,ReactNative+TypeScript仿喜马拉雅开发App(示例代码)

    ReactNative+TypeScript仿喜马拉雅开发App 融合RN的跨平台能力+TS的全新开发体验 使用RN + TS开发听书App,从需求分析,到功能实现,一步步带领大家完成功能,学会如何解 ...

最新文章

  1. mybatis自动生成代码工具
  2. 基于android的家庭财务通 .apk,毕业论文(设计)基于Android的家庭财务管家的设计与实现.doc...
  3. hdfs通过接口退出安全模式_Hadoop之HDFS简介
  4. “德国屈臣氏”来天猫!欧洲3000家门店,优质低价背后有啥秘密
  5. MySQL学习笔记(十二)—— MySQL的命令集(2)
  6. SAP Spartacus Popover Directive 构造函数的用途分析
  7. Android系统JNI的实现方式
  8. php中__autoload()方法详解
  9. 164. Maximum Gap
  10. HDU/HDOJ 2612 Find a way 双向BFS
  11. 计算机硬件组成 pdf,计算机硬件的组成..pdf
  12. PostgreSQL 9.5 pg_dump新特性 你是我的眼
  13. 大数据之_数据采集Flume_Flume了解_学习内容介绍---Flume工作笔记002
  14. android fastboot原理,FastBoot使用一
  15. NVIDIA下载老版本驱动/CUDA/Video Codec SDK的链接
  16. ssm项目搭建(tomcat配置)详解
  17. Android 自定义和可下载字体
  18. mysql版本号xx.xx.xx类型字段排序问题解决
  19. mysql的sid_修改数据库的SID
  20. 关于iphone开发前期环境搭建过程中需要注意的一些要点

热门文章

  1. python太阳代码_python实现实时太阳跟踪
  2. 联想网盘:看得见的云计算
  3. 编译安装PHP,解决问题 Don't know how to define struct flock on this system, set --enable-opcache=no
  4. 非科班、无实习、拿到腾讯华为提前批offer,C++学习路线及项目分享
  5. 基于ssm的零食商城的设计与实现
  6. SSI-DDI:基于子结构相互作用的药物-药物反应预测
  7. mysql数据库原理分析
  8. java 创建gbase_GBase8s + MyBatis 操作示例
  9. 变身小小科学家 南瓜科学让孩子爱上实验
  10. 语音分类任务(基于UrbanSound8K数据集)