Android NFC MifareClassic详解

来源:互联网 发布:淘宝面具 编辑:程序博客网 时间:2024/05/17 09:20

由下面这个表最终可以判断出卡的类型和卡的大小,如get函数




Get()
生成MifareClassic对象


当发现TAG时,返回SAK/SEL_RES 字节,没有引起RF感应及阻塞。
getSak() 


switch (a.getSak()) 
case 0x01:
case 0x08:
  mType = TYPE_CLASSIC;
    mSize = SIZE_1K;
case 0x09:
  mType = TYPE_CLASSIC;
  mSize = SIZE_MINI;
case 0x10:
    mType = TYPE_PLUS;
    mSize = SIZE_2K;
case 0x11:
    mType = TYPE_PLUS;
    mSize = SIZE_4K;
case 0x18:
    mType = TYPE_CLASSIC;
    mSize = SIZE_4K;
case 0x28:
    mType = TYPE_CLASSIC;
    mSize = SIZE_1K;
    mIsEmulated = true;
case 0x38:
    mType = TYPE_CLASSIC;
    mSize = SIZE_4K;
    mIsEmulated = true;
case 0x88:
    mType = TYPE_CLASSIC;
    mSize = SIZE_1K;
case 0x98:
case 0xB8:
    mType = TYPE_PRO;
    mSize = SIZE_4K;
}
getType()
获取卡的类型
getSize()
获取卡的大小
isEmulated()
判断是否是仿真卡
getSectorCount()
获取扇区大小


getBlockCount()
获取块的总数


getBlockCountInSector(int sectorIndex)
返回给定扇区的块数量


blockToSector(int blockIndex)
由块区返回扇区的索引值


sectorToBlock(int sectorIndex)
返回扇区的一个块


Authenticate(int sector, byte[] key, boolean keyA)
扇区密钥认证
封装发送的命令
cmd[0]=0x60/keyA;0x61/KeyB
cmd[1] =扇区第一个块
cmd[2]=TAG ID号 
cmd[6]=键值
transceive(cmd, false)发送命令给TAG


readBlock(int blockIndex) 
当认证完后可以读取扇区的内容
读取指定块的内容
byte[] cmd = { 0x30, (byte) blockIndex };
transceive(cmd, false);


读取的数据必须是16位的。
如果小于16位的则报错。
大于16位的可以将拷贝前16位数据。
例如:byte[] blockBytesTmp = Arrays.copyOf(blockBytes,16);


writeBlock(int blockIndex, byte[] data)
cmd[0] = (byte) 0xA0;写命令
cmd[1] = (byte) blockIndex;块区
System.arraycopy(data, 0, cmd, 2, data.length);写的数据
transceive(cmd, false);发送命令


increment(int blockIndex, int value) 
增加块并存储值
ByteBuffer cmd = ByteBuffer.allocate(6);
cmd.order(ByteOrder.LITTLE_ENDIAN);
cmd.put( (byte) 0xC1 ); 命令
cmd.put( (byte) blockIndex );
cmd.putInt(value);
transceive(cmd.array(), false); 发送命令


decrement(int blockIndex, int value)
ByteBuffer cmd = ByteBuffer.allocate(6);
cmd.order(ByteOrder.LITTLE_ENDIAN);
cmd.put( (byte) 0xC0 );
cmd.put( (byte) blockIndex );
cmd.putInt(value);
transceive(cmd.array(), false);


参考文档
http://nfc-tools.org/index.php?title=ISO14443A
MifareClassic.java


时间:

起草于2015-10-15




0 0