Android智能卡读卡器通过USB错误:PROCEDURE BYTE CONFLICT

时间:2017-03-11 18:09:48

标签: java android usb smartcard smartcard-reader

我正在使用通过USB连接到Android设备的GEMALTO 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 Select命令。

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与描述程序字节冲突:

收到长度为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 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 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00]

任何人都可以帮助我吗?我不明白我做错了什么。

2 个答案:

答案 0 :(得分:1)

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

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

  • 此外,here表示某些USB端口可能存在问题。尝试将您的阅读器连接到USB设备到Android设备。

更新

您的智能卡读卡器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 交换级别。在这些情况下,您不必关心软件中的协议。

答案 1 :(得分:0)