使用 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 卡仿真的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dotnet/iot Mfrc522 库

关于SI522替代FM17522和MFRC522的资料对比

13.56Mhz SI522兼容MFRC522的资料以及对比性能

STM32+MFRC522完成IC卡号读取密码修改数据读写

STM32+MFRC522完成IC卡号读取密码修改数据读写

智能门锁超低功耗:SI522(13.56芯片)替代MFRC522FM17522