Channel.transmit(新的CommandAPDU(数组))再次单击该按钮时检索另一个值

时间:2017-06-14 10:35:41

标签: java

我已经实现了Android App - 服务器端应用程序。 Android应用程序与服务器通信以通过智能卡进行身份验证。当我单击App中的按钮时,会建立TCP连接并正在交换消息,直到协议结束为止。目前,当我再次单击应用程序中的按钮时,我遇到了问题。通过相同的过程 但是从智能卡中检索到的数据是不同的。

在SmartCard类中 - > forwardMessage():

- >第一个按钮点击Android应用程序 - >第一个clientSocket:

我正在获取此字节[0, -92, 2, 12, 2, 0, 2]数组,如屏幕截图所示,并在调用channel.transmit(new CommandAPDU(array));时收到正确的回复[-112,0]

- >在Android App中点击第二个按钮 - >第二个clientSocket(不运行服务器应用程序neu)

我正在获取此字节[0, -92, 2, 12, 2, 0, 2]数组,如屏幕截图所示,并在调用channel.transmit(new CommandAPDU(array));时收到正确的回复[106,-126]

此结果[106,-126]应该与第一个clientSocket [-112,0]之一相同。作为从智能卡检索到的数据[106,-126]的结果,协议没有被执行到最后。

我试图在SmartCard的disconnect()内调用Card类的disconnect(),但我

我感谢任何帮助!

第一个客户端数据

enter image description here

enter image description here

第二个clientsocket数据

enter image description here enter image description here

Android应用 - >服务器 - >读卡器

服务器类

public class Server {

    private final static int RECEIVE_BUFFER_LENGTH = 512;
    public final static int MESSAGE_MAXIMUM_LENGTH = 256;
    private final static int MESSAGE_HEADER_LENGTH = 8;
    private static InputStream bufferedInputStream = null;
    private static OutputStream outputStream = null;
    private static SmartCard smartCard = null;

    public static void main(String args[]) throws Exception {

        ServerSocket serverSocket = new ServerSocket(27015);

        System.out.println("SS construction of server socket");
        System.out.println("SS listenting for incoming connection on port 27015");

        while (true) {
            Socket clientSocket = serverSocket.accept();
            Server.bufferedInputStream = new BufferedInputStream(clientSocket.getInputStream());
            Server.outputStream = clientSocket.getOutputStream();
            Server.smartCard = new SmartCard();
            Server.handleConnection();

            Server.bufferedInputStream.close();
            Server.outputStream.close();
            Server.smartCard = null;
            clientSocket.close();
            System.out.println("Smart card instance was deleted ");
            System.out.println("--------------------- Finished  ---------------------------");
        }

    }


        private static void handleConnection() throws IOException {
        ByteBuffer receiveBuffer = ByteBuffer.allocate(Server.RECEIVE_BUFFER_LENGTH);
        int readBytes = 0;
        while (true) {
            readBytes = Server.bufferedInputStream.read(receiveBuffer.array(), receiveBuffer.position(),
                    receiveBuffer.remaining());
            System.out.println("readBytes: " + readBytes);
            if (readBytes < 0) {
                break;
            }
             //Here I am reading the received bytes and communicating with the Smart card.

            }
        }

    }


}

智能卡

public class SmartCard {
    public Card card;
    private String protocol;

    public void connect(String preferredProtocol) {
        Card cardTemp = null;
        this.protocol = preferredProtocol;
        try {

            TerminalFactory factory = TerminalFactory.getDefault();
            List<CardTerminal> terminals = factory.terminals().list();
            CardTerminal terminal = terminals.get(0);
            System.out.println("Reader name: " + terminal.getName());
            if (preferredProtocol.equals(ProtocolType.SC_T0.getProtocolName())) {
                cardTemp = terminal.connect(preferredProtocol);

            } else if (preferredProtocol.equals(ProtocolType.SC_T1.getProtocolName())) {
                cardTemp = terminal.connect(preferredProtocol);
            }
            System.out.println("SC connect --> SCARD Protocol " + preferredProtocol);
            this.card = cardTemp;

        } catch (CardException e) {
            e.printStackTrace();
        }

    }


    private boolean isConnect() {
        if (this.card != null) {
            return true;

        } else {
            return false;
        }

    }


    public void disconnect() throws CardException {
        if (this.isConnect()) {
            this.card = null;
            //this.card.disconnect(false);
            System.out.println("SC disconnect()");

        }
    }


    private void reconnect(String preferredProtocol) {
        if (!this.isConnect()) {
            this.connect(preferredProtocol);

        }
    }

        public byte[] requestATR() {
        ATR atr = this.card.getATR();
        if (atr.getBytes().length > 0xFF) {
            throw new IllegalArgumentException(
                    "Package too big, not supported with protocol -> Answer To Test byte array is too big!");
        }
        return atr.getBytes();
    }


    public byte[] forwardMessage(byte[] array) throws CardException {

        try {
            if (!this.isConnect()) {
                this.reconnect(this.protocol);
                System.out.println("SC reconnect()");

            }

            Cg2AapiServer.printData(array, array.length, SmartCard.OPERATOR, Cg2AapiServer.RECEIVE);

            CardChannel channel = this.card.getBasicChannel();

            System.out.println("data from  the client socket: " + Arrays.toString(array));

            ResponseAPDU responseAPDU = channel.transmit(new CommandAPDU(array));

            byte[] byteArray = responseAPDU.getBytes();

            System.out.println("retrieved data from the smart card: " + Arrays.toString(byteArray));

            if (responseAPDU.getBytes().length > 0xFF) {
                throw new IllegalArgumentException("Package too big, not supported with protocol.");
            }

            Cg2AapiServer.printData(responseAPDU.getBytes(), responseAPDU.getBytes().length, SmartCard.OPERATOR,
                    Cg2AapiServer.TRANSMIT);

            return responseAPDU.getBytes();

        } catch (CardException e) {
            e.printStackTrace();
        }

        return null;

    }


}   

1 个答案:

答案 0 :(得分:0)

为了让它工作,我必须将set /p方法添加到智能卡中的disconnect()方法,如下所示:

this.card.disconnect(false);