簡體   English   中英

如何在NFC天線上使用智能手機模擬NFC標簽(非卡)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM