IsoDep iso = IsoDep.get(tag); iso.connect(); iso.setTimeOut(5000); // 5 sec time out iso.transceive(apduCommand); // now send your command
byte[] SELECT = { (byte) 0x00, // CLA Class (byte) 0xA4, // INS Instruction (byte) 0x04, // P1 Parameter 1 (byte) 0x00, // P2 Parameter 2 (byte) 0x0A, // Length 0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID }; Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); IsoDep tag = IsoDep.get(tagFromIntent); tag.connect(); byte[] result = tag.transceive(SELECT); if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) throw new IOException("could not select applet");
Log.d(TAG, "Ignore " + tech); } else if (tech.equals(android.nfc.tech.IsoDep.class.getName())) { android.nfc.tech.IsoDep isoDep = IsoDep.get(tag); isoDep.connect(); byte[] responseBytes = isoDep.transceive(command.getBytes()); Log.w(TAG, "Unable to decode HEX string " + isoApplicationString + " into binary data", e); isoDep.close(); isoDep.connect(); isoDep.close();
IsoDep isoDep = IsoDep.get(tag); if (isoDep != null) { try { isoDep.connect(); byte[] result = isoDep.transceive(command);
@Override public void onNewIntent(Intent intent) { if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { Tag tag = intent.getExtras().getParcelable(NfcAdapter.EXTRA_TAG); if (Arrays.asList(tag.getTechList()).contains("android.nfc.tech.IsoDep")) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); String passportNumber = preferences.getString(KEY_PASSPORT_NUMBER, null); String expirationDate = convertDate(preferences.getString(KEY_EXPIRATION_DATE, null)); String birthDate = convertDate(preferences.getString(KEY_BIRTH_DATE, null)); if (passportNumber != null && !passportNumber.isEmpty() && expirationDate != null && !expirationDate.isEmpty() && birthDate != null && !birthDate.isEmpty()) { BACKeySpec bacKey = new BACKey(passportNumber, birthDate, expirationDate); new ReadTask(IsoDep.get(tag), bacKey).execute(); mainLayout.setVisibility(View.GONE); loadingLayout.setVisibility(View.VISIBLE); } else { Snackbar.make(passportNumberView, R.string.error_input, Snackbar.LENGTH_SHORT).show(); } } } }
@Override public void run() { try { mIsoDep.connect(); mUiCallbacks.clearMessages(); mUiCallbacks.onOkay(mContext.getString(R.string.manual_connected)); mUiCallbacks.setUserSelectListener(this); try { synchronized(mDisconnectWaiter) { mDisconnectWaiter.wait(); } Log.d(TAG, "exiting manual select thread!"); } catch (InterruptedException e) { // should not happen Log.e(TAG, "interrupted exception!"); } } catch (TagLostException e) { mUiCallbacks.onError(mContext.getString(R.string.tag_lost_err)); } catch (IOException e) { mUiCallbacks.onError(e.getMessage()); } finally { try { mIsoDep.close(); } catch (IOException e) { } } }
/** * Tag comm */ private IsoDep mTagCom; @Override public byte[] transceive(final byte[] pCommand) throws CommunicationException { [...] byte[] response = null; [...] // send command to emv card response = mTagCom.transceive(pCommand); [...] return response; }
if (mIsoDep.isConnected()) { try { Log.d(TAG, "select app: " + mAid); mIsoDep.close(); } catch (IOException e) {
Log.d(TAG, "Ignore " + tech); } else if (tech.equals(android.nfc.tech.IsoDep.class.getName())) { android.nfc.tech.IsoDep isoDep = IsoDep.get(tag); if(isoDep == null) { throw new IllegalArgumentException("No IsoDep");
card.connect(); ... byte[] response = card.transceive(apduBytes);
@Override public void run() { boolean err = false; try { mIsoDep.connect(); Log.d(TAG, "select app: " + mAid); ResponseApdu rspApdu = sendAndRcv(new SelectApdu(mAidBytes), true); if (rspApdu.isStatus(SW_NO_ERROR)) { mUiCallbacks.onOkay(mContext.getString(R.string.select_app_ok, rspApdu.getSW1SW2())); } else { mUiCallbacks.onError( mContext.getString(R.string.select_app_err, rspApdu.getSW1SW2(), ApduParser.parse(false, rspApdu.toBytes()))); } mIsoDep.close(); } catch (TagLostException e) { mUiCallbacks.onError(mContext.getString(R.string.tag_lost_err)); err = true; } catch (IOException e) { mUiCallbacks.onError(e.getMessage()); err = true; } mUiCallbacks.onFinish(err); } }
private byte[] sendRequest (byte command, byte[] parameters) throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); Log.d(TAG, "Request : " + toHexString(wrapCommand(command, parameters))); byte[] recvBuffer = isoDep.transceive(wrapCommand(command, parameters)); Log.d(TAG, "Response: " + toHexString(recvBuffer)); while (true) { output.write(recvBuffer, 1, recvBuffer.length - 1); byte status = recvBuffer[0]; if (status == STATUS_OPERATION_OK) { break; } else if (status == STATUS_ADDITIONAL_FRAME) { Log.d(TAG, "Request : " + toHexString(wrapCommand(command, parameters))); recvBuffer = isoDep.transceive(wrapCommand(GET_ADDITIONAL_FRAME, null)); Log.d(TAG, "Response: " + toHexString(recvBuffer)); } else if (status == STATUS_PERMISSION_ERROR) { throw new DesfireException(status, "Permission denied"); } else { throw new DesfireException(status, "Unknown status code: " + Integer.toHexString(status & 0xFF)); } } return output.toByteArray(); }
tagTech = NfcV.get(tag); } else if (tech.equals(android.nfc.tech.IsoDep.class.getName())) { tagTech = IsoDep.get(tag); } else if (tech.equals(android.nfc.tech.MifareClassic.class.getName())) { tagTech = MifareClassic.get(tag);
@Override public void run() { try { mIsoDep.connect(); // select ppse if (selectPpse()) { if (mTestMode == Launcher.TEST_MODE_APP_SELECT) { selectApp(mAid); } else if (mPpseDdf != null) { // process each app found in ppse select response for (EMVApp app : mPpseDdf.getEMVApps()) { if (selectApp(app)) { if (initiateAppProcessing(app)) { readAppData(app); } } } } } mIsoDep.close(); } catch (TagLostException e) { mUiCallbacks .onError(mContext.getString(R.string.tag_lost_err)); } catch (IOException e) { mUiCallbacks.onError(e.getMessage()); } catch (TLVException e) { mUiCallbacks.onError(e.getMessage()); } }
protected ResponseApdu sendAndRcv(CommandApdu cmdApdu, boolean ascii) throws TagLostException, IOException { byte[] cmdBytes = cmdApdu.toBytes(); String cmdStr = CommandApdu.toString(cmdBytes, cmdApdu.getLc()); mUiCallbacks.onMessageSend(cmdStr, cmdApdu.getCommandName()); byte[] rsp = mIsoDep.transceive(cmdBytes); ResponseApdu rspApdu = new ResponseApdu(rsp); byte[] data = rspApdu.getData(); String parsed = null; String errMsg = "no error"; try { if (data.length > 0) { parsed = TLVUtil.prettyPrintAPDUResponse(data); } } catch (TLVException e) { parsed = null; errMsg = e.getMessage(); } mUiCallbacks.onMessageRcv(bytesToHexAndAscii(rsp, ascii), cmdApdu.getCommandName(), parsed); if (data.length > 0 && parsed == null) { mUiCallbacks.onError(errMsg); } /* Log.d(TAG, "response APDU: " + Util.bytesToHex(rsp)); if (data.length > 0) { Log.d(TAG, TLVUtil.prettyPrintAPDUResponse(data)); } */ return rspApdu; }
@Override public void onTagDiscovered(Tag tag) { doTapFeedback(); clearImage(); // maybe clear console or show separator, depends on settings if (mAutoClear) { clearMessages(); } else { addMessageSeparator(); } // get IsoDep handle and run xcvr thread IsoDep isoDep = IsoDep.get(tag); if (isoDep == null) { onError(getString(R.string.wrong_tag_err)); } else { ReaderXcvr xcvr = new PaymentReaderXcvr(isoDep, "", this, TEST_MODE_EMV_READ); new Thread(xcvr).start(); } }
@Override public void onTagDiscovered(Tag tag) { doTapFeedback(); clearImage(); // maybe clear console or show separator, depends on settings if (mAutoClear) { clearMessages(); } else { // two separators between taps/discoveries addMessageSeparator(); addMessageSeparator(); } // get IsoDep handle and run xcvr thread IsoDep isoDep = IsoDep.get(tag); if (isoDep == null) { onError(getString(R.string.wrong_tag_err)); } else { List<SmartcardApp> memberApps = mGrpToMembersMap.get(mSelectedGrpPos); new Thread(new BatchReaderXcvr(isoDep, memberApps, this)).start(); } }
IsoDep isoDep = IsoDep.get(tag); if (isoDep == null) { onError(getString(R.string.wrong_tag_err));