NFC功能介绍及MifareClassic类型的读取数据例子

NFC
 NFC即近场通讯功能,NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。NFC 提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。NFC技术允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英吋)内,交换数据,其传输速度有106Kbit/秒、212Kbit/秒或者424Kbit/秒三种。NFC工作模式有卡模式(Card emulation)、点对点模式(P2P mode)和读卡器模式(Reader/writer mode)。NFC和蓝牙都是短程通信技术,而且都被集成到移动电话。但NFC不需要复杂的设置程序。NFC也可以简化蓝牙连接。NFC 略胜 Bluetooth 的地方在于设置程序较短,但无法达到Blutooth的低功率。NFC的最大数据传输量是 424 kbit/s 远小于 Bluetooth V2.1 (2.1 Mbit/s)。虽然NFC在传输速度与距离比不上BlueTooth,但是NFC技术不需要电源,对于移动电话或是行动消费性电子产品来说,NFC的使用比较方便。

  NFC还优于红外和蓝牙传输方式。作为一种面向消费者的交易机制,NFC比红外更快、更可靠而且简单得多,不用向红外那样必须严格的对齐才能传输数据。与蓝牙相比,NFC面向近距离交易,适用于交换财务信息或敏感的个人信息等重要数据;蓝牙能够弥补NFC通信距离不足的缺点,适用于较长距离数据通信。因此,NFC和蓝牙互为补充,共同存在。事实上,快捷轻型的NFC协议可以用于引导两台设备之间的蓝牙配对过程,促进了蓝牙的使用。

  NFC是一种提供轻松、安全、迅速的通信的无线连接技术,其传输范围比RFID小,RFID的传输范围可以达到几米、甚至几十米,但由于NFC采取了独特的信号衰减技术,相对于RFID来说NFC具有距离近、带宽高、能耗低等特点。 其次,NFC与现有非接触智能卡技术兼容,目前已经成为得到越来越多主要厂商支持的正式标准。再次,NFC还是一种近距离连接协议,提供各种设备间轻松、安全、迅速而自动的通信。与无线世界中的其他连接方式相比,NFC是一种近距离的私密通信方式。最后,RFID更多的被应用在生产、物流、跟踪、资产管理上,而NFC则在门禁、公交、手机支付等领域内发挥着巨大的作用。

  现在刚兴起的NFC手机内置NFC芯片,组成RFID模块的一部分,可以当作RFID无源标签使用———用来支付费用;也可以当作RFID读写器———用作数据交换与采集。NFC技术支持多种应用,包括移动支付与交易、对等式通信及移动中信息访问等。通过NFC手机,人们可以在任何地点、任何时间,通过任何设备,与他们希望得到的娱乐服务与交易联系在一起,从而完成付款,获取海报信息等。NFC设备可以用作非接触式智能卡、智能卡的读写器终端以及设备对设备的数据传输链路,其应用主要可分为以下四个基本类型:用于付款和购票、用于电子票证、用于智能媒体以及用于交换、传输数据。

RFID
RFID(射频识别:radio frequency identification)是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,作为条形码的无线版本,RFID技术具有条形码所不具备的防水、防磁、耐高温、使用寿命长、读取距离大、标签上数据可以加密、存储数据容量更大、存储信息更改自如等优点,其应用将给零售、物流等产业带来革命性变化。

NFC  1. Supported tag technologies
    TagTechnology NfcA NfcB NfcF NfcV IsoDep Ndef NdefFormatable
    2. Optional supported tag technologies
    MifareClassic MifareUltralight     
详细内容 http://developer.android.com/intl/zh-cn/guide/topics/connectivity/nfc/advanced-nfc.html

for example : MifareClassic

 //convert character sequence to hexadecimal
    private String bytesToHexString(byte []src){
        StringBuilder stringBuilder = new StringBuilder("0x");
        if(src == null || src.length == 0){
            return null;
        }
        char[] buffer = new char[2];
        for (int i = 0; i < src.length; i++) {
            buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16);
            buffer[1] = Character.forDigit(src[i] & 0x0F, 16);
            Log.i(TAG, "bytesToHexString--->" + buffer);
            stringBuilder.append(buffer);
        }
        Log.i(TAG, "StringBuilder--->" + stringBuilder.toString());
        return stringBuilder.toString();
    }
     
    private void processIntent(Intent intent) {
        //get the tag from intent
        StringBuffer sbuffer = new StringBuffer();
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        for (String tech : tagFromIntent.getTechList()) {
            Log.i(TAG,"processIntent  tagFromIntent.getTechList()" + tech);
            sbuffer.append(tech + "\n");
        }
     
        //for example :MifareClassic
        boolean auth = false;
        MifareClassic mfc = MifareClassic.get(tagFromIntent);
        String metaInfo = "";
        try {
            mfc.connect();
            int type = mfc.getType();//obtain TAG's type
            int sectorCount = mfc.getSectorCount();//obtain TAG's sectorCounts
            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 + "\n共" + sectorCount + "个扇区\n共"
                    + mfc.getBlockCount() + "个块\n存储空间:" + mfc.getSize() +"B\n";
    
            for (int i = 0; i < sectorCount; i++) {
                auth = mfc.authenticateSectorWithKeyA(i, MifareClassic.KEY_DEFAULT);
                int bCount;
                int bIndex;
                if(auth){
                    metaInfo += "Sector" + i + ":验证成功\n";
                    bCount = mfc.getBlockCountInSector(i);
                    bIndex = mfc.sectorToBlock(i);
                    for (int j = 0; j < bCount; j++) {
                        byte[] data = mfc.readBlock(bIndex);
                        metaInfo += "Block" + bIndex + ":"
                                    + bytesToHexString(data) + "\n";
                        bIndex ++;
                    }
                }else {
                //    metaInfo += "Sector" + i +":验证失败\n";
                }
            }
            Log.i(TAG,"NFC-->metaInfo--:" + metaInfo);
            promt_dialog.setText(sbuffer.append(metaInfo));
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try{
                mfc.close();
            }catch (IOException e){
                e.printStackTrace();
            }    
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值