Поиск…


Смарт-карта отправляет и принимает

Для соединения, вот фрагмент, который поможет вам понять:

//Allows you to enumerate and communicate with connected USB devices.
UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
//Explicitly asking for permission
final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();

UsbDevice device = deviceList.get("//the device you want to work with");
if (device != null) {
    mUsbManager.requestPermission(device, mPermissionIntent);
}

Теперь вам нужно понять, что в java сообщение происходит с использованием пакета javax.smarcard, который недоступен для Android, поэтому взгляните сюда, чтобы получить представление о том, как вы можете общаться или отправлять / получать APDU (команда смарт-карты).

Теперь, как сказано в ответе, упомянутом выше

Вы не можете просто отправить команду APDU (команда смарт-карты) поверх конечной точки массового вывода и ожидать получения APDU ответа в конечной точке массового ввода. Для получения конечных точек см. Фрагмент кода ниже:

UsbEndpoint epOut = null, epIn = null;
UsbInterface usbInterface;

UsbDeviceConnection connection = mUsbManager.openDevice(device);

    for (int i = 0; i < device.getInterfaceCount(); i++) {
        usbInterface = device.getInterface(i);
        connection.claimInterface(usbInterface, true);

        for (int j = 0; j < usbInterface.getEndpointCount(); j++) {
            UsbEndpoint ep = usbInterface.getEndpoint(j);

            if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                    // from host to device
                    epOut = ep;

                } else if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
                    // from device to host
                    epIn = ep;
                }
            }
        }
    }

Теперь у вас есть конечные точки для массового ввода и массового вывода для отправки и приема блоков APDU и блоков ответа APDU:

Для отправки команд см. Фрагмент кода ниже:

public void write(UsbDeviceConnection connection, UsbEndpoint epOut, byte[] command) {
    result = new StringBuilder();
    connection.bulkTransfer(epOut, command, command.length, TIMEOUT);
    //For Printing logs you can use result variable
    for (byte bb : command) {
        result.append(String.format(" %02X ", bb));
    }
}

И для получения / чтения ответа см. Фрагмент кода ниже:

public int read(UsbDeviceConnection connection, UsbEndpoint epIn) {
result = new StringBuilder();
final byte[] buffer = new byte[epIn.getMaxPacketSize()];
int byteCount = 0;
byteCount = connection.bulkTransfer(epIn, buffer, buffer.length, TIMEOUT);

//For Printing logs you can use result variable
if (byteCount >= 0) {
    for (byte bb : buffer) {
        result.append(String.format(" %02X ", bb));
    }

    //Buffer received was : result.toString()
} else {
    //Something went wrong as count was : " + byteCount
}

return byteCount;
}

Теперь, если вы видите этот ответ, первая команда, которую нужно отправить, это:

PC_to_RDR_IccPowerOn для активации карты.

которую вы можете создать, прочитав раздел 6.1.1 документа Doc для устройств USB Device.

Теперь давайте возьмем пример этой команды, такой как здесь: 62000000000000000000 Как вы можете отправить это:

write(connection, epOut, "62000000000000000000");

Теперь, после того как вы успешно отправили команду APDU, вы можете прочитать ответ, используя:

read(connection, epIn);

И получить что-то вроде

80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1

Теперь ответ, полученный в коде здесь, будет в переменной result метода read() из кода



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow