美文网首页
2019-01-22

2019-01-22

作者: lixinxin | 来源:发表于2019-01-22 18:26 被阅读3次

    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块),它用于存放厂商代码。已经固化。不可更改。

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

    **二.读取数据 **

    <pre name="code" class="java" style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word;">//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();
            }
        }</pre>
    

    **三.写数据 **

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

    相关文章

      网友评论

          本文标题:2019-01-22

          本文链接:https://www.haomeiwen.com/subject/oyerjqtx.html