我使用小型NFC天线,在PC上连接USB接口,并在标准输出(如键盘)上提供读取数据。所以我放了一个小贴纸标签(MIFARE Ultralight),我在控制台上收到了标签ID
我希望用我的智能手机(三星S4)做同样的事情。对于标记仿真,不适用于卡片仿真
怎么做(java,Android Studio)?我找到了卡片仿真的样本,但没有找到标签
我是否需要首先转储标记内容(NdefMessage和NdefRecord)才能发回相同的内容?
哪个java示例专用于此特定行为?
我找到了一个小样本http://www.frugalprototype.com/android-nfc-hce/#comment-22似乎有效......但不是我!
我的NFC天线触发“嘟嘟”声,并在控制台上显示随机ID值,但我从未输入processCommandApdu()
方法。错误在哪里?
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("MainActivity",">>> onCreate...");
setContentView(R.layout.activity_main);
}
}
HceActivity.java:
public class HceService extends HostApduService {
/* Il s’agit en réalité ici de la commande SELECT AID + la taille en octet de l’AID + l’AID.
Dans une application en production, il est préférable de déclarer la commande
SELECT AID = {0x00, (byte) 0xA4, 0x04,0x00}
et de déclarer l’AID séparément : AID = {0xF0, 0x46, 0x52, 0x55, 0x47, 0x41, 0x4c}.
Sans oublier d’ajouter la taille de l’AID à la commande SELECT AID*/
private static final byte[] SELECT_AID = {0x00,
(byte) 0xA4, 0x04,0x00,0x07,
(byte) 0xF0, 0x46, 0x52, 0x55, 0x47, 0x41, 0x4C};
private static final byte[] MY_UID = {0x01, 0x02, 0x03, 0x04, (byte) 0x90, 0x00};
private static final byte[] MY_ERROR = {0x6F, 0x00};
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
Log.d("HceService",">>> processCommandApdu...");
if (Arrays.equals(SELECT_AID, apdu)) {
return MY_UID;
} else return MY_ERROR;
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.pdf.cardemulation">
<!-- Demander la permission la permission à l'utilisateur pour l'utilisation du NFC -->
<uses-feature
android:name="android.hardware.nfc.hce"
android:required="true" />
<uses-permission
android:name="android.permission.NFC" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Déclaration de notre service HceService -->
<service
android:name=".HceService"
android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE" >
<intent-filter>
<action
android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
</intent-filter>
<!-- Fichier dans lequel est déclaré l’AID. Nous devons créer un dossier xml dans le dossier values
et créer un fichier apduservice.xml dans lequel nous allons déclarer l’AID de notre application -->
<meta-data
android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice" />
</service>
</application>
</manifest>
最后:
<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/membership_number"
android:category="other">
<aid-filter android:name="F046525547414c"/>
</aid-group>
</host-apdu-service>
答案 0 :(得分:0)
标签和卡片是一回事。
标签无法将数据发送到阅读器(例如电话设备)。 Reader将APDU命令发送到标签。标签为读者提供了对命令的响应。
也许你的Mifare Ultralight格式为NDEF
。 NDEF定义了交换命令和响应的协议以及数据如何存储在标记上。
您可以在Android上使用HCE
(主机卡仿真)重现相同内容。
<强>更新强>
为什么你有随机UID? 请查看文档https://developer.android.com/guide/topics/connectivity/nfc/hce.html#ProtocolParams
在交换的第一部分,HCE设备将呈现其UID; 应假设HCE设备具有随机UID。这意味着 每次点击,呈现给读者的UID都是随机的 生成UID。因此,NFC读者不应该依赖于此 HCE设备的UID作为认证或识别的一种形式。