到目前为止,我正在尝试对chariotsolutions phongap-nfc插件实施IsoDep读取功能(即使我是Java / android和cordova / phonegap的完全新手),我仍设法使其可以与cordova一起使用,连接至卡,进行发行APDU命令并将其返回到Web视图。 (为我万岁,对吗?)

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

我正在使用LG L [email protected]

添加到NFCplugin.java +导入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);
            }
        }
    });

}


科尔多瓦实施

,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);
    });


我的问题是,无论我选择哪个应用程序ID是具有上述之一的MasterCard(A0000000041010)还是PPES(邻近支付系统环境),都会出现此错误。由于这是我第一次尝试使用Java,因此我不知道这是实现问题还是命令问题(应该没问题),大部分代码是通过查看战车解决方案代码并从字面上认为是可行的编写的,因此在这里,所以它可能也应该在这里(“ cordova execute runnable”-我知道该做什么,只是假设它也应该在我的代码中)。

另外可能还有另一个小错误-它仅一次读取卡,直到我退出应用程序并重新启动。

PS .:我读了很多SO帖子,在地狱中搜寻了几天,尝试了很多东西(也学到了一些东西),但是没有一个能帮助我。

PSS:是的,完成后,我要将其合并到原始项目中。

感谢您的帮助,对于冗长的帖子,我们深表歉意。

最佳答案

您看到的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]

关于android - IsoDep APDU SELECT返回6FXX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27509354/

10-10 21:08