std::vector<uint8_t> NFCReaderUnit::transmitBits(const uint8_t *pbtTx, const size_t szTxBits) { const int MAX_FRAME_LEN = 264; uint8_t abtRx[MAX_FRAME_LEN]; int szRxBits; // Transmit the bit frame command, we don't use the arbitrary parity feature if ((szRxBits = nfc_initiator_transceive_bits(d_device, pbtTx, szTxBits, NULL, abtRx, sizeof(abtRx), NULL)) < 0) { LOG(ERRORS) << "NFC write bits error: " << std::string(nfc_strerror(d_device)); // THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, // "Writing bits to NFC reader failed: " + std::string(nfc_strerror(d_device))); return {}; } return std::vector<uint8_t>(std::begin(abtRx), std::begin(abtRx) + szRxBits / 8 + 1); }
const char * freefare_strerror (FreefareTag tag) { const char *p = "Unknown error"; if (nfc_device_get_last_error (tag->device) < 0) { p = nfc_strerror (tag->device); } else { if (tag->tag_info->type == MIFARE_DESFIRE) { if (MIFARE_DESFIRE (tag)->last_pcd_error) { p = mifare_desfire_error_lookup (MIFARE_DESFIRE (tag)->last_pcd_error); } else if (MIFARE_DESFIRE (tag)->last_picc_error) { p = mifare_desfire_error_lookup (MIFARE_DESFIRE (tag)->last_picc_error); } } } return p; }
bool NFCReaderUnit::connect() { if (isConnected()) { LOG(LogLevel::ERRORS) << EXCEPTION_MSG_CONNECTED; disconnect(); } bool connected = d_chip_connected = false; if (d_insertedChip && d_chips.find(d_insertedChip) != d_chips.end()) { if (d_chips[d_insertedChip].nm.nmt == NMT_ISO14443A) { nfc_target pnti; nfc_modulation modulation; modulation.nmt = NMT_ISO14443A; modulation.nbr = NBR_106; // prevent infinite wait. Setting this in connectToReader() did not work // for unkown reason. nfc_safe_call(nfc_device_set_property_bool, d_device, NP_INFINITE_SELECT, false); int ret = nfc_initiator_select_passive_target(d_device, modulation, d_chips[d_insertedChip].nti.nai.abtUid, d_chips[d_insertedChip].nti.nai.szUidLen, &pnti); if (ret > 0) { LOG(DEBUGS) << "Selected passive target."; d_chip_connected = connected = true; d_insertedChip->setChipIdentifier(getCardSerialNumber(d_chips[d_insertedChip])); } else if (ret == 0) { LOG(DEBUGS) << "No target found when selecting passive NFC target."; } else { LOG(ERRORS) << "NFC Error: " << nfc_strerror(d_device); } } } return connected; }
/** * @brief Display the PCD error a-la perror */ void nfc_perror (const nfc_device_t * pnd, const char *pcString) { fprintf (stderr, "%s: %s\n", pcString, nfc_strerror (pnd)); }
/** * @brief Renders the PCD error in pcStrErrBuf for a maximum size of szBufLen chars * @return Returns 0 upon success */ int nfc_strerror_r (const nfc_device_t * pnd, char *pcStrErrBuf, size_t szBufLen) { return (snprintf (pcStrErrBuf, szBufLen, "%s", nfc_strerror (pnd)) < 0) ? -1 : 0; }