Android nfc模块读写MifareClassic卡50

2024-05-04 00:08

本文主要是介绍Android nfc模块读写MifareClassic卡50,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一般来说,基于MifareClassic的射频卡;1K:16个分区(sector),每个分区4个块;对于所有基于MifareClassic的卡来说,;KeyA:6bytes;AccessConditions:4bytesK;M1卡分为16个扇区,每个扇区由4块(块0、块1;块0块1;扇区0;块2块3块0块1;扇区1;块2块3;密码A存取控制密码B:::;块0

一般来说,基于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 块1

扇 区 0

块2 块3 块0 块1

扇 区 1

块2 块3

密码A 存取控制 密码B : : :

块0

扇 区 15

块1 块2

密码A 存取控制 密码B

数据块 数据块 数据块 数据块 数据块 数据块 数据块 数据块

0 1 2 3 4 5 6 7

数据块 数据块 数据块

60 61 62

块3

密码A 存取控制 密码B 数据块 63

第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。 每个扇区的块0、块1、块2为数据块,可用于存贮数据。

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

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

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

先了解一下MifareClassic协议

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

读M1卡代码:

if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {

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

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

mfc = MifareClassic.get(tagFromIntent); if (mfc != null) {

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

mfc.connect(); boolean auth = false;

auth = mfc.authenticateSectorWithKeyA(15,

"passwo".getBytes());// 验证密码

if (auth) { }

new String(mfc

.readBlock(60)));// 读取M1卡的第60块即15扇区第0块

} catch (Exception e) {

if (BuildConfig.DEBUG) { }

e.printStackTrace();

}

}

}// End of method

写M1卡代码:

try {

mfc.connect(); boolean auth = false; short sectorAddress = 1;

auth = mfc.authenticateSectorWithKeyA(sectorAddress,

MifareClassic.KEY_DEFAULT);

if (auth) { }

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

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

Toast.makeText

this, "写入成功", Toast.LENGTH_SHORT)

.show();

} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally { }

try {

mfc.close();

} catch (IOException e) { }

// TODO Auto-generated catch block e.printStackTrace();

这篇关于Android nfc模块读写MifareClassic卡50的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957948

相关文章

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问