Android使用NFC模拟IC卡

本文介绍如何使用Android手机NFC功能模拟IC卡,以解决携带实体卡不便的问题。通过读取IC卡ID,修改系统配置文件,使手机能够模仿门禁系统的IC卡。文章提供详细步骤,并分享了一款方便切换模拟IC卡的应用。
摘要由CSDN通过智能技术生成

      前言:前几天不知道老板出于什么原因居然给我们研发部门安装了门禁,只有我们研发部的人员使用员工卡才能进出,每天上下班携带员工卡着实不太方便,于是想着动了点歪脑筋...

       NFC是在RFID的基础上发展而来的,两者本质上并没有太大的区别,但细节方面还是有点不同:

1.NFC增加了点对点通信功能,通信的双方是相互对等的,而RFID是主从关系。

2.工作有效距离:NFC一般不超过10cm,而RFID最远的可以有几十米。

3.工作频段:NFC仅限于13.56MHz,而RFID有低频(125KHz到135KHz),高频(13.56MHz),超高频(860MHz到960MHz)。

       联想到之前做过的一个嵌入式项目使用的富士通的SL3S4011双界面存储芯片一般都是通过序列号ID来识别不同的卡片初步猜测该门禁系统的原理是通过读写

要实现AndroidNFC模拟功能,可以按照以下步骤进行: 1. 在AndroidManifest.xml文件中添加NFC权限: ``` <uses-permission android:name="android.permission.NFC" /> ``` 2. 创建一个继承HostApduService的类来处理APDU命令: ``` public class MyHostApduService extends HostApduService { private static final String TAG = "MyHostApduService"; @Override public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) { // 处理APDU命令 ... // 返回响应数据 return responseApdu; } @Override public void onDeactivated(int reason) { Log.d(TAG, "onDeactivated: " + reason); } } ``` 3. 在AndroidManifest.xml文件中注册该服务: ``` <application> <service android:name=".MyHostApduService" android:exported="true" android:permission="android.permission.BIND_NFC_SERVICE"> <intent-filter> <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" /> </intent-filter> <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/apduservice" /> </service> </application> ``` 其中,@xml/apduservice是一个XML文件,定义了支持的AID(应用标识符)和对应的服务组件: ``` <?xml version="1.0" encoding="utf-8"?> <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/app_name" android:requireDeviceUnlock="false" > <aid-group android:description="@string/app_name" android:category="other"> <aid-filter android:name="F0010203040506" /> </aid-group> </host-apdu-service> ``` 4. 在processCommandApdu方法中处理APDU命令,可以根据命令字节码来判断需要执行的操作。例如,如果收到SELECT AID命令,可以返回应用程序的名称和版本号: ``` private static final byte[] AID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; private static final byte[] VERSION = { 0x00, 0x01 }; @Override public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) { if (Arrays.equals(commandApdu, SELECT_APDU)) { return concatenateByteArrays(AID, VERSION); } return UNKNOWN_COMMAND_RESPONSE; } private byte[] concatenateByteArrays(byte[] a, byte[] b) { byte[] result = new byte[a.length + b.length]; System.arraycopy(a, 0, result, 0, a.length); System.arraycopy(b, 0, result, a.length, b.length); return result; } ``` 这样,当读器连接到设备时,设备会自动启动MyHostApduService,并等待命令。如果读器发送SELECT AID命令,设备会返回应用程序的名称和版本号。 需要注意的是,NFC模拟功能需要设备支持Host Card Emulation(HCE)功能。如果设备不支持HCE,那么就无法使用NFC模拟功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值