Ricerca…


Smart card invia e ricevi

Per la connessione, ecco uno snippet per aiutarti a capire:

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

Ora devi capire che in Java la comunicazione avviene usando il pacchetto javax.smarcard che non è disponibile per Android, quindi dai un'occhiata qui per avere un'idea di come puoi comunicare o inviare / ricevere APDU (comando smartcard).

Ora come detto nella risposta di cui sopra

Non è possibile semplicemente inviare un APDU (comando smartcard) sull'endpoint bulk-out e prevedere di ricevere un APDU di risposta sull'endpoint bulk-in. Per ottenere gli endpoint, consulta lo snippet di codice riportato di seguito:

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

Ora disponi degli endpoint bulk-in e bulk-out per inviare e ricevere comandi APDU e blocchi di risposta APDU:

Per l'invio di comandi, guarda il frammento di codice qui sotto:

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

E per ricevere / leggere una risposta, vedi il frammento di codice qui sotto:

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

Ora se vedi questa risposta qui il primo comando da inviare è:

PC_to_RDR_IccPowerOn comando per attivare la scheda.

che è possibile creare leggendo la sezione 6.1.1 del documento Specifiche della classe dispositivo USB qui.

Ora facciamo un esempio di questo comando come quello qui: 62000000000000000000 Come puoi inviare questo è:

write(connection, epOut, "62000000000000000000");

Ora dopo aver inviato correttamente il comando APDU, puoi leggere la risposta usando:

read(connection, epIn);

E ricevere qualcosa come

80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1

Ora la risposta ricevuta nel codice qui sarà nella variabile result del metodo read() dal codice



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow