当前位置: 首页 > 知识库问答 >
问题:

使用Arduino MFRC522进行Android NFC卡仿真

萧渝
2023-03-14

我正在开发一个android应用程序,创建NFC卡ID。我可以通过手机从扫描的NFC卡中获取信息。但我不能用我的应用程序创建它们。首先,我尝试用这种方法。然后,我意识到需要标记对象,并尝试以不同的方式保存它。虽然没用。

其次,我从Android文档中找到了这个。然后,我尝试用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-->

hostcard模拟器服务。爪哇:

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>

NFCFS服务也是如此。它们之间唯一的区别是“apdu”更名为“nfcf”。但即使两者都不起作用。我通过以下链接了解一些东西。

https://medium.com/the-almanac/how-to-build-a-simple-smart-card-emulator-reader-for-android-7975fae4040f

使用Arduino的Android主机卡仿真

NFC-帮助RC522之间交换数据

但是我没有完全理解。所以,我只是做了我在那里看到的。我以为当我试图用阅读器扫描手机时,其中一个服务会运行它的“进程命令”方法。但是什么都没发生。

有人知道怎么做吗?XML文件中的名称有什么特殊含义吗?因为我看到某处有3个不同名字的“援助过滤器”。我错过了什么?

注1:我使用Arduino Pro Mini和MFRC522 RFID阅读器进行测试。我试图通过MFRC522扫描从我的应用程序创建的NFC ID。我必须使用另一个模块来解决这个问题吗?

注2:我在服务类中使用监听器从活动中获取NFC ID。

共有1个答案

朱啸
2023-03-14

我认为您的问题在于MFRC522 RFID读卡器是一种非常基本/古老的设计,实际上只支持MIFARE类型的卡(这是非标准化的原始卡格式)。虽然主机卡仿真使用ISO/IEC 14443A(大部分)作为基础,但它使用其他更高级别的协议来仿真该读卡器不支持的NFC类型4卡。

如果你看看Arduino库的读者https://github.com/miguelbalboa/rfid#troubleshooting

我的手机无法识别MFRC522,或者我的MFRC522无法从其他MFRC522读取数据。不支持卡模拟。不支持与手机通信。不支持对等通信。

正如图书馆建议的那样,如果你想要更多功能,可以使用基于PN532的模块。

如果你看看Arduino图书馆的PN532https://github.com/Seeed-Studio/PN532#Features

与android 4.0通信(支持的设备列表)

 类似资料:
  • 本文向大家介绍PayPal使用信用卡(节点)进行支付,包括了PayPal使用信用卡(节点)进行支付的使用技巧和注意事项,需要的朋友参考一下 示例 在此示例中,我们将研究如何使用PayPal保管库存储信用卡,然后参考存储的信用卡来为用户处理信用卡交易。 我们之所以要使用保管库,是因为我们不必在自己的服务器上存储敏感的信用卡信息。我们仅通过提供的保管库ID引用付款方式,这意味着我们不必自己存储信用卡就

  • 我想在我的网站上使用信用卡重复付款。我网站的访客可以不用paypal注册就用信用卡进行定期付款吗?我尝试使用订阅按钮,但当我选择用信用卡支付时,我输入了信用卡信息,然后贝宝让我在贝宝上注册(https://snag.gy/hxO2Gl.jpg)。此外,我还尝试使用信用卡进行定期付款(直接付款定期付款(DPRP)),但我必须符合PCI标准才能在我的网站上处理dredit卡。我可以通过结账页面(带有“

  • 我正在尝试测试一个KnoxToken服务背后的应用程序,用户需要使用智能卡和他的PIN。使用JMeter来测试没有安全特性的应用程序,效果和预期的一样。 在这种情况下,我得到一个错误:javax . net . SSL . SSL handshakeexception:远程主机在握手期间关闭了连接 从Jmeter- 从日志文件:

  • 我开发了一个系统,可以使用带有PN532芯片的阅读器读取NFC标签。它工作正常。我可以阅读米费尔经典和米费尔超轻标签。 现在我想使用带有Android 4.4.2的Nexus平板电脑来模拟标签。我没有Android开发经验,但我认为这是可能的。 我已经在Nexus平板电脑中设置了NFC通信,但我想我必须下载或编写一些应用程序来模拟Tag和NDEF通信。 最简单的方法是什么?

  • 我正在编写一个Java程序,该程序使用USB证书(智能卡)进行加密和签名。我有一个共享库(Windows上为.dll,Linux上为.so),它为硬件实现PKCS11。 我正在搜索现有的解决方案,并找到以下指南http://docs.oracle.com/javase/7/docs/technotes/guides/security/p11guide.html指南建议使用sun。安全pkcs11.

  • 我正在尝试使用mocha和mongoose编写一个测试用例。但我编写的以下代码片段在每个“hook:error:timeout of 2000ms extered.确保在此测试中调用了done()回调”之前都给出了错误“Todo”。我无法解决此问题。我是node的初学者。谁能在这个问题上帮我一下吗。提前谢谢。