logo头像

你是否为一个人拼过命

针对M1类型的nfc读取扇区初步了解

本文于1455天之前发表,文中内容可能已经过时。

####NFC的一些理解

百科初步讲解

维基百科

NFC的通信原理

  • 工作频率为13.56MHZ
  • 读取模式有被动和主动

具体表现和对比其他短距离通信,如以下表格:

NFC 蓝牙 红外
网络类型 点对点 单点对多点 点对点
使用距离 ≤0.1m ≤10m ≤1m
建立时间 < 0.1s 6s 0.5s
安全性 具备, 硬件实现 具备,软件实现 不具备, 使用IRFM 时除外
通信模式 主动-主动/被动 主动-主动 主动-主动
成本

关于NFC在Android上的表现

  • 首先手机必须具有NFC的功能
  • 再次应用和相关页面要进行相关的配置

配置体现:

 <!-- NFC权限声明 -->
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true"/>

应用的页面 :intent-filter 启动模式为:android:launchMode=”singleTop”

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
</intent-filter>

主要浅显分析下M1类型的读写:

  • 全名为:MifareClassic的射频卡
  • 1K 16个扇区,每个扇区有4个块,每个块有16个字节数据
  • 通过文档查询NFCA协议兼容MifareClassic协议

Android 读取M1大概的方法

//取出封装在intent中的TAG
Tag    tagIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
boolean auth = false;
//读取TAG Tag类型代表着协议类型
MifareClassic mfc = MifareClassic.get(tagIntent);
try {
        //Authenticate a sector with key A.
        auth = mfc.authenticateSectorWithKeyA("Sector 扇区 ","密码");
        if (auth) {
                byte[] data = mfc.readBlock(“块数”);
            } else {
            //验证失败                
          }
            mfc.close();
        } catch (Exception e) {
        e.printStackTrace();
        }

Android 写入M1的大概方法

try {
        Tag tagFromIntent = mIntent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        MifareClassic mfc = MifareClassic.get(tagFromIntent);
        mfc.connect();
        boolean auth = false;        
         auth = mfc.authenticateSectorWithKeyA(1,des);
         if (auth) {
                mfc.writeBlock("块数", byte[] data);// 必须为16字节不够自己补0
                 mfc.close();
            } else {
            }
        } catch (IOException e1) {
            e1.printStackTrace();
  }

在于获取NfcAdapter的EXTRA_TAG 拿取到NFC的协议类型,才能进行下一步的读取。MifareClassic