IsoDep APDU SELECT返回6FXX

时间:2014-12-16 16:29:33

标签: android cordova phonegap-plugins nfc apdu

我正在尝试向chariotsolutions phongap-nfc插件实现IsoDep读取功能,到目前为止(即使我是Java / android和cordova / phonegap的完全新手)我已设法使其与cordova一起工作,连接到卡,发出APDU命令并将其返回到Web视图。 (对我来说好吗?)

嗯,简单的问题是,到目前为止我没有通过选择应用程序获得9000响应。

我正在使用LG L Fino@4.4.2。

增加NFCplugin.java + import nfc.tech.IsoDep,NFCa,NFCb

.... else if (action.equalsIgnoreCase(ISODEP)) {
        registerIsoDep(callbackContext);    

    } else if (action.equalsIgnoreCase(READISODEP)){
        readIsoDep(callbackContext);

    } else .....

这应该是标签监听器 - 我想是这样的: - )

private void registerIsoDep(CallbackContext callbackContext) throws JSONException {

    addTechList(new String[]{IsoDep.class.getName()});
    callbackContext.success();

}

这会读取IsoDep标签,发现必须在前一个函数的回调中调用它(将返回到Js部分中的那个)

private void readIsoDep(final CallbackContext callbackContext) throws JSONException {

    final Tag tag = savedIntent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    cordova.getThreadPool().execute(new Runnable() {
        @Override
        public void run() {
            IsoDep isoDep = IsoDep.get(tag);

            try {

                isoDep.connect();

                isoDep.setTimeout(5000);

                byte[] SELECT = { 
                    (byte) 0x00, // CLA Class           
                    (byte) 0xA4, // INS Instruction     
                    (byte) 0x04, // P1  Parameter 1
                    (byte) 0x00, // P2  Parameter 2
                    (byte) 0x07, // Length
                    (byte) 0xA0, (byte) 0x00, 
                    (byte) 0x00, (byte) 0x00, 
                    (byte) 0x04, (byte) 0x10, 
                    (byte) 0x10, // AID
                    (byte) 0x00 // Lenght
                };

                try {
                    byte[] result = isoDep.transceive(SELECT);

                    isoDep.close();

                    callbackContext.success(result[0] + "|" + result[1]);

                }catch (IOException e) {
                    callbackContext.error("error" + e);
                }

            } catch (IOException e) {
                callbackContext.error("error" + e);
            }
        }
    });

}

Cordova实施

,addIDDiscoverListener: function(callback, win, fail) {
        document.addEventListener("tag", callback, false);
        cordova.exec(win, fail, "NfcPlugin", "registerIsoDep", []);
    }

};

var isoDep = {
     readIsoDep: function(win, fail) {
         cordova.exec(win, fail, "NfcPlugin", "readIsoDep", []);
    }

}

最后“app.js”

 nfc.addIDDiscoverListener(function(nfcEvent) {

        //listenes for the isodep tag

        isoDep.readIsoDep(function(tag) {

            console.log(tag); //returns ADPU response codes

        }, function(reason) {
            console.log('error!   ' + reason);
        });

    },
    function() {
        console.log('registered reader');
    },
    function(reason) {
        console.log('error!   ' + reason);
    });

我的问题是,无论我选择哪个app id,无论是MasterCard(A0000000041010)还是PPES(近距离支付系统环境),我都会收到此错误。由于这是我第一次尝试做Java,我不知道它是一个实现问题还是命令问题(应该没问题)大部分代码都是通过查看chariot解决方案代码编写的,字面意思是这应该有用,这个在这里它应该也可能在这里(“cordova执行runnable” - 我知道它做了什么,只是假设它应该也在我的代码中)。

此外可能还有另一个小错误 - 只有在我退出应用程序并重新启动它之前它才会读取该卡。

PS:我已经阅读了大量的SO帖子,用谷歌搜索了几天,并尝试了很多东西(也学了几个)但是没有一个能够帮助我。

PSS。:是的,当它完成时,我想将它合并到原始项目中。

感谢任何帮助,对不起,我很抱歉。

1 个答案:

答案 0 :(得分:1)

您看到的6F XX不是状态字。事实上,当{SELECT(通过DF名称)命令成功时,6F ...正是接收的内容。 6F是FCI模板的标记。

当您尝试检索状态字时,实际上是在读取从transceive()方法获得的数组的前两个字节。但是,响应APDU看起来像

+---------+--------+--------+
|  DATA   |  SW1   |  SW2   |
| n bytes | 1 byte | 1 byte |
+---------+--------+--------+

因此,您需要检查result最后两个字节作为状态字:

result[result.length - 2] + "|" + result[result.length - 1]