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

                                       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


密码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时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。

二.读取数据 

//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卡,布布扣,bubuko.com

时间: 2024-12-09 20:09:43

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

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

                    Android NFC近场通信02----读写卡的准备工作      由于公司接了一个听上去感觉比较NB的项目,给某油田做派工系统 .并由小女子负责Android客户端的开发工作~~开发时的Android设备看上去是比较高大上哈,防爆的,其实很多次同事们都想开玩笑的说试试摔地上,都防爆嘛,那肯定摔不坏的哈~~开发过程中需要用到NFC技术,所以就在网上学习并整理了一下关于Android nfc相关的知识~好了,切入主题,本文写读写卡前的准备工作: ps:这一

NFC:Arduino、Android与PhoneGap近场通信

NFC:Arduino.Android与PhoneGap近场通信(第一本全面讲解NFC应用开发的技术著作移动智能设备近距离通信编程实战入门) [美]Tom Igoe(汤姆.伊戈),Don Coleman(唐.科尔曼),Brian Jepson(布莱恩.杰普森) 著   金建刚 冯依 姚尚朗 译 ISBN 978-7-121-23997-7 2014年9月出版 定价:65.00元 244页 16开 编辑推荐 欢迎进入近场通信(NFC)的世界,这种飞速发展的新技术能通过无线信号在靠近的电子设备间进行

android nfc中MifareClassic格式的读写

Android支持的数据格式 数据格式的Intent filter AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-data>元素中指定你创建的资源文件: [html] view plaincopyprint? <activity> ... <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED

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

读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在直接使用NFC标签工作时,你依然能够读写NDEF数据.这是你想要如何构建的事情.下例演示了如何使用MIFARE超薄标签来工作: package com.example.android.nfc; import android.nfc.Tag; import android.nfc.tech.MifareUltralight; import and

Android近场通信---NFC基础(三)(转)

转自 http://blog.csdn.net/think_soft/article/details/8180203 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种.两种或全部三种类型的NFC的Intent来过滤.但是,通常想要在应用程序启动时控制最常用的ACTION_NDEF_DISCOVERED类型的Intent.在没有过滤ACTION_NDEF_DISCOVERED类型的Intent的应用程序,或数据负载不是

Android近场通信---NFC基础(五)(转)

转自 http://blog.csdn.net/think_soft/article/details/8190463 Android应用程序记录(Android Application Record---AAR) 在Android4.0(API Level 14)中引入的Android应用程序记录(AAR),提供了较强的在扫描到NFC标签时,启动应用程序的确定性.AAR有嵌入到NDEF记录内部的应用程序的包名.你能够把一个AAR添加到你的NDEF消息的任何记录中,因为Android会针对AAR来

Android近场通信---NFC基础(一)(转)

转自 http://blog.csdn.net/think_soft/article/details/8169483 本文译自:http://developer.android.com/guide/topics/connectivity/nfc/nfc.html 本文介绍在Android系通过你所能执行的基本任务?它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架API?有关更高级的话题,包括对非NDEF格式数据的讨论,情况“高级 NFC” NDEF

Android近场通信---NFC基础(四)(转)

转自http://blog.csdn.net/think_soft/article/details/8184539 从Intent中获取信息 如果因为NFC的Intent而启动一个Activity,那么你就能够从Intent中获取被扫描到的NFC标签的相关信息.根据被扫描到的标签,Intent对象能够以下额外的信息: 1.  EXTRA_TAG(必须的):它是一个代表了被扫描到的标签的Tag对象: 2.  EXTRA_NDEF_MESSAGES(可选):它是一个解析来自标签中的NDEF消息的数组

android NFC通信初探一

大家好,经历了3个月的沉寂,我又重新走上了编码的道路上了.这次稍微了解了下android NFC,在这里和大家分享下我所学到的东西.希望和大家一起交流,互相学习,MY QQ IS 1339266784. 一.NFC简介 NFC[1]是Near Field Communication缩写,即近距离无线通讯技术.由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,具有成本低廉.方便易用和更富直观性等特点.可以在移动设备.消费类电子产品.PC 和智能控件工具间进行近距离无线通信.NFC