基于Arduino MFRC522的Android NFC卡仿真



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

其次,我从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-->

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文件中定义了这两种方式,如下所示;

<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 -构建-一个简单的智能卡片-模拟器-读者- - android - 7975 - fae4040f

Android主机卡仿真与Arduino

NFC -帮助在RC522 &Android HCE

但是我并没有完全理解。所以我就照我看到的做了。我认为其中一个服务运行它的"processcommand"。方法,当我试图用阅读器扫描我的手机。但是什么也没发生。

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

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

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

我认为您的问题是MFRC522 RFID阅读器是一个非常基本/旧的设计,并且实际上只支持MIFARE类型卡(这是非标准化的原始卡格式)。当主机卡仿真使用ISO/IEC 14443A(大部分)作为基础时,它使用其他更高级别的协议来模拟该读卡器不支持的NFC Type 4卡。

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

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

根据库建议,如果您想要更多功能,请使用基于PN532的模块。

如果你看Arduino库的PN532 https://github.com/Seeed-Studio/PN532#Features

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

最新更新