如何使用智能手机在NFC天线上模拟NFC标签(非卡)

时间:2016-06-09 09:45:00

标签: java android nfc

我使用小型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>

1 个答案:

答案 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作为认证或识别的一种形式。