zoukankan      html  css  js  c++  java
  • Android Studio NFC 读写卡程序 (二)

    上一章简单的介绍了 一下NFC android 中的认识 和配置,这次认识一下NFC 卡片。

    卡片一共 分为16个扇区(sector),每个扇区又分为4个块(block) 每个块 包含16个字节,

    比如“1234567890123456”, “ASDFGHJKLQWERTYU”,可以存取一些信息,

    因为卡片的类型不同,所以在存取的时候需要注意一下,

    比如 对于一般的 MifareClassic 来说,  第一扇区 第一块 一般会被厂家占用,这里是不能被写入数据的,每一扇区的 最后一块,也就是第四block,是用来存放密码或控制位的,其余的三个块是数据区,这里可以存放我们的数据。

    而对于 MifareUltralight 来说, 一般 前四扇区 是不能够 写数据的,而且没有密码。

    当你在第几扇区第几块中写的数据,就需要 在第几扇区第几块中读出来。

    写数据流程为: data (符合要求的16位) 

     public void writeTag(Tag tag) {  
      
            MifareClassic mfc = MifareClassic.get(tag);  
      
            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 be overwritted  
                    mfc.writeBlock(4, "1313838438000000".getBytes());  
                    mfc.writeBlock(5, "ASDFGHJKLl000000".getBytes());  
                    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();    

    我们把数据写入了第一扇区的第四和第五块,

    然后从第四区和第五区读出来

     public String readTag(Tag tag) {  
            MifareClassic mfc = MifareClassic.get(tag);  
            for (String tech : tag.getTechList()) {  
                System.out.println(tech);  
            }  
            boolean auth = false;  
            //读取TAG  
      
            try {  
                String metaInfo = "";  
                //Enable I/O operations to the tag from this TagTechnology object.  
                mfc.connect();  
                int type = mfc.getType();//获取TAG的类型  
                int sectorCount = mfc.getSectorCount();//获取TAG中包含的扇区数  
                String typeS = "";  
                switch (type) {  
                    case MifareClassic.TYPE_CLASSIC:  
                        typeS = "TYPE_CLASSIC";  
                        break;  
                    case MifareClassic.TYPE_PLUS:  
                        typeS = "TYPE_PLUS";  
                        break;  
                    case MifareClassic.TYPE_PRO:  
                        typeS = "TYPE_PRO";  
                        break;  
                    case MifareClassic.TYPE_UNKNOWN:  
                        typeS = "TYPE_UNKNOWN";  
                        break;  
                }  
                metaInfo += "卡片类型:" + typeS + "
    共" + sectorCount + "个扇区
    共"  
                        + mfc.getBlockCount() + "个块
    存储空间: " + mfc.getSize()  
                        + "B
    ";  
                for (int j = 0; j < sectorCount; j++) {  
                    //Authenticate a sector with key A.  
                    auth = mfc.authenticateSectorWithKeyA(j,  
                            MifareClassic.KEY_NFC_FORUM);  
                    int bCount;  
                    int bIndex;  
                    if (auth) {  
                        metaInfo += "Sector " + j + ":验证成功
    ";  
                        // 读取扇区中的块  
                        bCount = mfc.getBlockCountInSector(j);  
                        bIndex = mfc.sectorToBlock(j);  
                        for (int i = 0; i < bCount; i++) {  
                            byte[] data = mfc.readBlock(bIndex);  
                            metaInfo += "Block " + bIndex + " : "  
                                    + bytesToHexString(data) + "
    ";  
                            bIndex++;  
                        }  
                    } else {  
                        metaInfo += "Sector " + j + ":验证失败
    ";  
                    }  
                }  
                return metaInfo;  
            } catch (Exception e) {  
                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();  
                e.printStackTrace();  
            } finally {  
                if (mfc != null) {  
                    try {  
                        mfc.close();  
                    } catch (IOException e) {  
                        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG)  
                                .show();  
                    }  
                }  
            }  
            return null;  
      
    

      

    上面是把 卡片的所有信息 读出来,如果需要第四和第五的,自己可以改动取值。

    因为存在卡片中的为16进制(不是16进制字符串),所以需要 先转为16进制字符串,然后再转为自己用的字符串就可以了

    代码就不贴了,网上一搜一大把,关键是 认识 自己需要什么样的 类型,不要用错了

  • 相关阅读:
    Java基础知识&面试题
    用例设计之API用例覆盖准则
    用例设计之APP用例覆盖准则
    Java的8种基本数据类型和3种引用数据类型
    并发concurrent---1
    Java运行时环境---ClassLoader类加载机制
    Java运行时环境---内存划分
    Java高阶语法---Volatile
    Java高阶语法---transient
    Java高阶语法---final
  • 原文地址:https://www.cnblogs.com/lfyy/p/7056313.html
Copyright © 2011-2022 走看看