使用 Arduino MFRC522 进行 Android NFC 卡仿真
Posted
技术标签:
【中文标题】使用 Arduino MFRC522 进行 Android NFC 卡仿真【英文标题】:Android NFC Card Emulation With Arduino MFRC522 【发布时间】:2021-05-11 05:29:39 【问题描述】:我正在开发一个创建 NFC 卡 ID 的 android 应用程序。我可以通过电话从扫描的 NFC 卡中获取信息。但我无法用我的应用程序创建它们。首先,我尝试使用this method 来做到这一点。然后,我意识到需要有 Tag 对象并尝试以不同的方式保存它。虽然没用。
其次,我从 android 文档中找到了this。然后,我尝试使用HostNfcFService 和HostApduService。为了使用它们,我创建了如下的 XML 文件和服务类;
nfcfservice.xml:
<!--HostNfcFService XML-->
<host-nfcf-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="NFCService">
<system-code-filter android:name="4000"/>
<nfcid2-filter android:name="02FE000000000000"/>
<t3tPmm-filter android:name="FFFFFFFFFFFFFFFF"/>
</host-nfcf-service>
<!--HostNfcFService XML-->
apduservice.xml:
<!--HostApduService XML-->
<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/servicedesc"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/servicedesc"
android:category="other">
<aid-filter android:name="A0000002471001"/>
</aid-group>
</host-apdu-service>
<!--HostApduService XML-->
HostCardEmulatorService.java:
public class HostCardEmulatorService extends HostApduService
private static HostCardEmulatorService.ScannedByRemoteListener listener;
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras)
byte[] response = null;
if(listener != null)
response = listener.onScannedByRemote();
return response;
@Override
public void onDeactivated(int reason)
public static void setOnScannedByRemoteListener(HostCardEmulatorService.ScannedByRemoteListener listener)
HostCardEmulatorService.listener = listener;
public interface ScannedByRemoteListener
public byte[] onScannedByRemote();
MyHostNfcFService.java:
public class MyHostNfcFService extends HostNfcFService
private static ScannedByRemoteListener listener;
@Override
public byte[] processNfcFPacket(byte[] commandPacket, Bundle extras)
byte[] response = null;
if(listener != null)
response = listener.onScannedByRemote();
return response;
@Override
public void onDeactivated(int reason)
public static void setOnScannedByRemoteListener(ScannedByRemoteListener listener)
MyHostNfcFService.listener = listener;
public interface ScannedByRemoteListener
public byte[] onScannedByRemote();
我在清单文件中定义了两种方式,如下所示;
<manifest>
<uses-permission android:name="android.permission.NFC" />
<uses-feature
android:name="android.hardware.nfc"
android:required="true" />
...
<application>
...
<service
android:name=".HostCardEmulatorService"
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>
</manifest>
NfcFService 也一样。它们之间的唯一区别是“apdu”被重命名为“nfcf”。但即使两者都不起作用。我检查以下链接以了解一些东西。
https://medium.com/the-almanac/how-to-build-a-simple-smart-card-emulator-reader-for-android-7975fae4040f
Android Host Card Emulation with Arduino
NFC - Help to exchange data between RC522 & Android HCE
但我没有完全理解。所以,我只是做了我在那里看到的。当我尝试用阅读器扫描手机时,我认为其中一项服务会运行它的“processCommand”方法。但是什么也没发生。
有人知道怎么做吗? XML文件中的名称有什么特殊含义吗?因为我看到某处有 3 个名称不同的“辅助过滤器”。我错过了什么?
注意 1:我使用 Arduino Pro Mini 和 MFRC522 RFID 阅读器进行测试。我尝试扫描通过 MFRC522 从我的应用程序创建的 NFC ID。我必须使用另一个模块来解决这个问题吗?
注意 2:我在服务类中使用侦听器从活动中获取 NFC ID。
【问题讨论】:
【参考方案1】:我认为您的问题是 MFRC522 RFID 阅读器是一个非常基本/旧的设计,实际上只支持 MIFARE 类型的卡(这是非标准化的原始卡格式)。虽然主机卡模拟使用 ISO/IEC 14443A(大部分)作为基础,但它使用其他更高级别的协议来模拟该读卡器不支持的 NFC 类型 4 卡。
如果您为读者查看 Arduino 库https://github.com/miguelbalboa/rfid#troubleshooting
我的手机无法识别 MFRC522 或者我的 MFRC522 无法读取其他 MFRC522 的数据 不支持卡片模拟。 不支持手机通讯。 不支持点对点通信。
正如图书馆建议的那样,如果您想要更多功能,请改用基于 PN532 的模块。
如果您查看 PN532 的 Arduino 库https://github.com/Seeed-Studio/PN532#Features
与android 4.0+通信(支持的设备列表)
【讨论】:
感谢您的回答。我要看看这些。 我订购了PN532,今天终于可以试用了。这个对我有用。再次感谢您的回答。以上是关于使用 Arduino MFRC522 进行 Android NFC 卡仿真的主要内容,如果未能解决你的问题,请参考以下文章