【问题标题】:Android Smartcard reader through USB Error: PROCEDURE BYTE CONFLICTAndroid 智能卡读卡器通过 USB 错误:PROCEDURE BYTE CONFLICT
【发布时间】:2017-03-11 18:09:48
【问题描述】:

我正在使用通过 USB 连接到 Android 设备的金雅拓 IDBRIDGE K30。

首先我要发送这样的 PC_to_RDR_IccPowerOff 消息。

byte[] data= new byte[]{
                    (byte) 0x62,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x00,
                    (byte) 0x00,
                    (byte) 0x00,
                    (byte) 0x00, (byte) 0x00};


            UsbInterface intf = _usbDevice.getInterface(0);
            UsbEndpoint outputEndpoint = intf.getEndpoint(1);
            UsbEndpoint inputEndpoint = intf.getEndpoint(0);
            intf.getEndpointCount();
            UsbDeviceConnection connection = _usbManager.openDevice(_usbDevice);

            connection.claimInterface(intf, forceClaim);

            //activate card for apdu
            final int dataTransferred = connection.bulkTransfer(inputEndpoint, data, data.length, TIMEOUT);

            Log.e(SIGNATURE_LOG, String.format("Written %s bytes to the dongle. Data written: %s", data.length, byteArrayToHexArrayString(data)));

作为回应,我得到了

收到长度为 64 且内容为:[80, 18, 00, 00, 00, 00, 00, 00, 00, 00, 3B, DF, 18, 00, 81, 31, FE, 58, 80, 31, 90, 52, 41, 01, 64, 05, C9, 03, AC, 73, B7, B1, D4, 44, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]

在此之后,我等待 5 秒,然后尝试使用 PC_to_RDR_XfrBlock 发送 APDU 选择命令。

byte[] data2= new byte[]{
                        (byte) 0x6F,
                        (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                        (byte) 0x00,
                        (byte) 0x01,
                        (byte) 0x00,
                        (byte) 0x00, (byte) 0x00,
                        (byte) 0x00,
                        (byte) 0x00,
                        (byte) 0x0C,
                        (byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00,
                        (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00,
                        (byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x4E,
                        (byte) 0x15,};

作为响应,我得到这是一个错误 F4,描述为 PROCEDURE BYTE CONFLICT:

收到长度为 64 且内容为:[80, 00, 00, 00, 00, 00, 01, 40, F4, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]

有人可以帮我吗?我不明白我做错了什么。

【问题讨论】:

    标签: java android usb smartcard smartcard-reader


    【解决方案1】:

    PROCEDURE BYTE CONFLICT 错误有点棘手,因为它发生在读卡器的固件中,并通过 CCID 上报给您。基本上这意味着读卡器通过 T=1 协议与智能卡对话,并且在读卡器和智能卡之间没有正确接收或发送一些 T=1 过程字节。在我看来,您在应用程序中无能为力。你可以做什么:

    • 如果您的智能卡支持 T=0 协议,请尝试强制执行它
    • 将您的阅读器更新到最新固件
    • 可能你的智能卡坏了,试试另一个相同类型的(或更新版本的)

    • 另外here 指出有时某些 USB 端口可能存在问题。尝试将您的阅读器连接到 Android 设备的 USB 集线器。

    更新

    您的智能卡读卡器GEMALTO IDBRIDGE K30 报告TPDU 交换级别(请参阅here)。由于在 TPDU 交换级别,发送到读卡器的所有数据按原样转发到智能卡,因此您必须在您的软件中处理 T=1 协议。通常,驱动程序会处理此任务,但在您的情况下,您将直接与 USB 级别的智能卡读卡器通信。所以中间没有司机。因此,您必须自己在代码中实现和处理 T=1 协议,或者找到现有的 Java 实现。 ISO-7816-3 是定义 T=1 协议的标准。不幸的是,它不是免费的,所以我不能提供它的链接(试试谷歌搜索)。您可以在开源Linux CCID driver 中找到现有的 C 语言 T=1 协议实现。

    如果你没有绑定GEMALTO IDBRIDGE K30阅读器,你可以得到另一个具有扩展APDU短APDU交换级别的阅读器。在这些情况下,您不必关心软件中的协议。

    【讨论】:

    • 感谢您的回复。我现在在我的 PC/Windows 上进行了尝试,阅读器使用了不同的软件。你确定我的申请没有做错吗?以及如何执行 T=0 协议?我在设备和阅读器之间有一条 miniusb 转 USB 电缆,这会导致问题吗?
    • 不,miniusb-to-usb-cable 应该不是问题,但是尝试在两者之间连接一个外部 USB 集线器。您可以通过PC_to_RDR_SetParameters 命令强制执行 T=0 协议。
    • 我尝试在两者之间使用外部 USB 集线器,但仍然遇到相同的错误。我使用的是 Card OS 5.3 智能卡。并在文档中写入。 “与智能卡的通信应使用 T1 协议”。它只支持 T=1 还是我仍然可以尝试 T=0?当我使用 PC_to_RDR_SetParameters 时,我在哪里设置 APDU?
    • 刚刚发现您的阅读器是 TPDU 阅读器。看看我更新的答案。
    【解决方案2】:
    猜你喜欢
    • 2017-04-19
    • 2012-12-22
    • 2017-11-10
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多