【问题标题】:How send NfcA command to the MIFARE card?如何向 MIFARE 卡发送 NfcA 命令?
【发布时间】:2015-07-22 11:30:59
【问题描述】:

我正在编写一个 Android 应用程序。我正在尝试将NfcA 低级命令(在我的情况下:HALT 和 WAKE-UP)发送到我的 Mifare Plus S 卡。 NfcA 技术用于“低级”访问 ISO 14443 A 类标签(即 ISO 14443-3 中提到的专有协议)。

这是我的代码的一部分:

protected void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        UID = Utils.byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
    }
    NfcA nfca = null;
    try {
        Log.e(TAG, "WakeUpCMD and HaltCMD");
        nfca = NfcA.get(tagFromIntent);
        nfca.connect();
        Short s = nfca.getSak();
        byte[] a = nfca.getAtqa();
        byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
        byte[] WakeUpCMD = {0x35, 0x32, 0x00};
        byte[] data = null;
        try {
            data = nfca.transceive(HaltCMD);
            length = data.length;
        }
        catch (Exception e){
            Log.e(TAG, "HALT complete "+Utils.byteArrayToHexString(data));
        }
        Log.e(TAG, "Tag is connected: "+nfca.isConnected());
        //Log.e(TAG, "Response from tag "+Utils.byteArrayToHexString(data));
        nfca.setTimeout(100);
        data = nfca.transceive(WakeUpCMD);
        Log.e(TAG, "Response from tag"+Utils.byteArrayToHexString(data));
        nfca.close();
    } catch (Exception e) {
        Log.e(TAG, "Error when reading tag");

    }
} 

WAKE-UP 命令由 PCD 发送,将已进入HALT 状态的 PICC 重新置于READY 状态。然后他们将参与进一步的防碰撞和选择程序。

|b7| |b6| |b5| |b4| |b3| |b2| |b1|

|1  |  | 0 |  | 1|  | 0|  | 0|  | 1|  | 0| {‘52’} = WAKE-UP

HALT 命令由四个字节组成,应使用标准帧传输。 传输的第一位

S | ‘50’ | ‘00’ | CRC_A | E

如果 PICC 在HALT 帧结束后的 1 毫秒内以任何调制响应,则该响应应解释为“未确认”。

这是我尝试发送到我的卡的 ISO 14443-3 中的两个命令的描述。

当我启动我的应用程序时,我收到“标签丢失”异常。你能帮助我吗?怎么了?如何发送这些命令?

【问题讨论】:

    标签: android nfc mifare


    【解决方案1】:

    似乎您在使用NfcA.transceive() 发送命令代码之前将其转换为以空字符结尾的 ASCII 字符串:

    byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
    byte[] WakeUpCMD = {0x35, 0x32, 0x00};
    
    • 0x35 0x30 0x30 0x30"5000"
    • 0x35 0x32"52"

    这没有任何意义,因为命令(50 00 用于 HLTA,52 用于 WUPA)已经是命令值的十六进制表示。

    因此,对于 HLTA 命令,您需要发送50 00

    data = nfca.transceive(new byte[] { (byte)0x50, (byte)0x00 });
    

    请注意,NFC 控制器(或 NFC 堆栈)将自动添加 S(通信开始)、E(通信结束)和 CRC_A。

    对于 WUPA 命令,您可以尝试发送52

    data = nfca.transceive(new byte[] { (byte)0x52 });
    

    但是,NFC 堆栈很可能不允许您使用收发方法发送 7 位命令。相反,堆栈可能会自动将此命令值用作一个完整字节并添加 CRC_A。

    关于发送 ISO/IEC 14443-3 初始化和防冲突命令的一般说明

    发送此类命令可能有效,也可能无效(取决于 NFC 堆栈实现和 NFC 控制器)。一般来说,我强烈建议您发送此类命令。特别是 HLTA 命令会混淆某些设备上 NFC 堆栈的内部状态保持,并会导致意外结果。 通常情况下,您不需要交换此类命令,因为防碰撞、初始化和激活由 NFC 设备自动处理。

    【讨论】:

    • 谢谢。这些命令可以帮助我在不重新附加的情况下使用我的卡(例如:当我总是将它戴在我的手机壳中并且我需要使用它时)。我尝试唤醒我的卡,然后我希望安卓应用会找到新的意图。
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多