[英]How simulate NFC tag (not card) with smartphone on NFC antenna
我使用一個小的NFC天線,該天線通過USB接口連接到PC上,並在標准輸出(如鍵盤)上傳遞讀取數據。 因此,我放置了一個小的不干膠標簽(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>
標簽和卡片是一回事。
標簽無法將數據發送到閱讀器(例如電話設備)。 讀取器將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用作身份驗證或識別的形式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.