NFC (二)读写MifareClassic协议的NFC卡
发布日期:2021-09-28 18:45:54 浏览次数:13 分类:技术文章

本文共 3506 字,大约阅读时间需要 11 分钟。

http://www.cnblogs.com/haoxinyue/archive/2012/05/03/2479599.html

先了解一下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 alsoNfcA.” 所以说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 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中获取的tagMifareClassic 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();                }            }        }

完整的代码示例在下载

转载地址:https://blog.csdn.net/h3c4lenovo/article/details/8171893 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IC/RFID/NFC 关系与区别
下一篇:NFC (一)概述

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月28日 18时57分53秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

大疆机甲大师教育机器人Python API中文化之四五:云台灯效,指定序号 2019-04-26
大疆机甲大师教育机器人Python API中文化之六:关灯 2019-04-26
“中文编程”知乎专栏两岁了——山雨欲来风满楼 2019-04-26
大疆机甲大师Python API之七:做个闹钟 2019-04-26
【意外走向】大疆机甲大师Python API之八:计时——为性能测试展开1000次循环 2019-04-26
RFC#2457——Rust 语言支持非 ASCII 码标识符在 GitHub 引发的激辩(一) 2019-04-26
RFC#2457——Rust 语言选择支持非 ASCII 码标识符在 GitHub 引发的激辩(二) 2019-04-26
”为什么有这么多人执着于中文编程?”回答两千赞留念及回应 2019-04-26
【家务】盘点小孩玩具零件缺失情况 2019-04-26
开发中文 API 的一些策略 2019-04-26
从日本编程书籍《我的第一本编程书》中译版看中文例程如何扬长避短——标识符(一) 2019-04-26
中文命名标识符如何区分类型和变量 2019-04-26
编程术语成系统中文化的意义 2019-04-26
草蟒 Python 中文 API 与 IDE 支持尝鲜 2019-04-26
一种改进中文 API 可读性的方法:参数不限于在末尾 2019-04-26
中文编程开发工具的生存模式探讨 2019-04-26
写给木兰编程语言研发团队的公开信 2019-04-26
为什么要急着为「木兰」编程语言贴上“造假”的标签? 2019-04-26
编程语言国产化的关键一战——对肆意污名化“木兰”编程语言说“不” 2019-04-26
各大媒体对「木兰」编程语言的不当言论盘点 2019-04-26