libnfc interface More...
#include <stdint.h>
#include <stdbool.h>
#include <nfc/nfc-types.h>
Go to the source code of this file.
Functions | |
NFC_EXPORT void | nfc_list_devices (nfc_device_desc_t pnddDevices[], size_t szDevices, size_t *pszDeviceFound) |
Probe for discoverable supported devices (ie. only available for some drivers). | |
NFC_EXPORT nfc_device_t * | nfc_connect (nfc_device_desc_t *pndd) |
Connect to a NFC device. | |
NFC_EXPORT void | nfc_disconnect (nfc_device_t *pnd) |
Disconnect from a NFC device. | |
NFC_EXPORT bool | nfc_configure (nfc_device_t *pnd, const nfc_device_option_t ndo, const bool bEnable) |
Configure advanced NFC device settings. | |
NFC_EXPORT bool | nfc_initiator_init (nfc_device_t *pnd) |
Initialize NFC device as initiator (reader). | |
NFC_EXPORT bool | nfc_initiator_poll_targets (nfc_device_t *pnd, const nfc_target_type_t *pnttTargetTypes, const size_t szTargetTypes, const byte_t btPollNr, const byte_t btPeriod, nfc_target_t *pntTargets, size_t *pszTargetFound) |
Polling for NFC targets. | |
NFC_EXPORT bool | nfc_initiator_select_dep_target (nfc_device_t *pnd, const nfc_modulation_t nmInitModulation, const byte_t *pbtPidData, const size_t szPidDataLen, const byte_t *pbtNFCID3i, const size_t szNFCID3iDataLen, const byte_t *pbtGbData, const size_t szGbDataLen, nfc_target_info_t *pti) |
Select a target and request active or passive mode for DEP (Data Exchange Protocol). | |
NFC_EXPORT bool | nfc_initiator_deselect_target (nfc_device_t *pnd) |
Deselect a selected passive or emulated tag. | |
NFC_EXPORT bool | nfc_initiator_transceive_bits (nfc_device_t *pnd, const byte_t *pbtTx, const size_t szTxBits, const byte_t *pbtTxPar, byte_t *pbtRx, size_t *pszRxBits, byte_t *pbtRxPar) |
Transceive raw bit-frames. | |
NFC_EXPORT bool | nfc_initiator_transceive_bytes (nfc_device_t *pnd, const byte_t *pbtTx, const size_t szTxLen, byte_t *pbtRx, size_t *pszRxLen) |
Send raw data to target then retrieve raw data from target. | |
NFC_EXPORT bool | nfc_target_init (nfc_device_t *pnd, byte_t *pbtRx, size_t *pszRxBits) |
Initialize NFC device as an emulated tag. | |
NFC_EXPORT bool | nfc_target_receive_bits (nfc_device_t *pnd, byte_t *pbtRx, size_t *pszRxBits, byte_t *pbtRxPar) |
Receive bit-frames. | |
NFC_EXPORT bool | nfc_target_receive_bytes (nfc_device_t *pnd, byte_t *pbtRx, size_t *pszRxLen) |
Receive bytes and APDU frames. | |
NFC_EXPORT bool | nfc_target_send_bits (nfc_device_t *pnd, const byte_t *pbtTx, const size_t szTxBits, const byte_t *pbtTxPar) |
Send raw bit-frames. | |
NFC_EXPORT bool | nfc_target_send_bytes (nfc_device_t *pnd, const byte_t *pbtTx, const size_t szTxLen) |
Send bytes and APDU frames. | |
NFC_EXPORT const char * | nfc_strerror (const nfc_device_t *pnd) |
Return the PCD error string. | |
NFC_EXPORT int | nfc_strerror_r (const nfc_device_t *pnd, char *pcStrErrBuf, size_t szBufLen) |
Renders the PCD error in pcStrErrBuf for a maximum size of szBufLen chars. | |
NFC_EXPORT void | nfc_perror (const nfc_device_t *pnd, const char *pcString) |
Display the PCD error a-la perror. | |
NFC_EXPORT const char * | nfc_device_name (nfc_device_t *pnd) |
Returns the device name. | |
NFC_EXPORT const char * | nfc_version (void) |
Returns the library version. |
libnfc interface
Provide all usefull functions (API) to handle NFC devices.
Definition in file nfc.h.
NFC_EXPORT bool nfc_configure | ( | nfc_device_t * | pnd, | |
const nfc_device_option_t | ndo, | |||
const bool | bEnable | |||
) |
Configure advanced NFC device settings.
pnd | nfc_device_t struct pointer that represent currently used device | |
ndo | nfc_device_option_t struct that contains options to set to device | |
bEnable | boolean |
Configures parameters and registers that control for example timing, modulation, frame and error handling. There are different categories for configuring the PN53X chip features (handle, activate, infinite and accept). These are defined to organize future settings that will become available when they are needed.
NFC_EXPORT nfc_device_t* nfc_connect | ( | nfc_device_desc_t * | pndd | ) |
Connect to a NFC device.
pndd | Device description if specific device is wanted, NULL otherwise |
If pndd is NULL, the first available NFC device is claimed by libnfc. It will automatically search the system using all available drivers to determine a device is free.
If pndd is passed then libnfc will try to claim the right device using information provided by this struct.
When it has successfully claimed a NFC device, memory is allocated to save the device information. It will return a pointer to a nfc_device_t struct. This pointer should be supplied by every next function of libnfc that should perform an action with this device.
NFC_EXPORT const char* nfc_device_name | ( | nfc_device_t * | pnd | ) |
NFC_EXPORT void nfc_disconnect | ( | nfc_device_t * | pnd | ) |
Disconnect from a NFC device.
pnd | nfc_device_t struct pointer that represent currently used device |
Initiator is disconnected and the device, including allocated nfc_device_t struct, is released.
NFC_EXPORT bool nfc_initiator_deselect_target | ( | nfc_device_t * | pnd | ) |
Deselect a selected passive or emulated tag.
pnd | nfc_device_t struct pointer that represent currently used device |
After selecting and communicating with a passive tag, this function could be used to deactivate and release the tag. This is very useful when there are multiple tags available in the field. It is possible to use the nfc_initiator_select_passive_target() function to select the first available tag, test it for the available features and support, deselect it and skip to the next tag until the correct tag is found.
NFC_EXPORT bool nfc_initiator_init | ( | nfc_device_t * | pnd | ) |
Initialize NFC device as initiator (reader).
pnd | nfc_device_t struct pointer that represent currently used device |
The NFC device is configured to function as RFID reader. After initialization it can be used to communicate to passive RFID tags and active NFC devices. The reader will act as initiator to communicate peer 2 peer (NFCIP) to other active NFC devices.
NFC_EXPORT bool nfc_initiator_poll_targets | ( | nfc_device_t * | pnd, | |
const nfc_target_type_t * | pnttTargetTypes, | |||
const size_t | szTargetTypes, | |||
const byte_t | btPollNr, | |||
const byte_t | btPeriod, | |||
nfc_target_t * | pntTargets, | |||
size_t * | pszTargetFound | |||
) |
Polling for NFC targets.
pnd | nfc_device_t struct pointer that represent currently used device | |
pnttTargetTypes | array of desired target types | |
szTargetTypes | pnttTargetTypes count | |
btPollNr | specifies the number of polling |
btPeriod | indicates the polling period in units of 150 ms | |
pntTargets | pointer on array of 2 nfc_target_t (over)writables struct | |
pszTargetFound | found targets count |
NFC_EXPORT bool nfc_initiator_select_dep_target | ( | nfc_device_t * | pnd, | |
const nfc_modulation_t | nmInitModulation, | |||
const byte_t * | pbtPidData, | |||
const size_t | szPidDataLen, | |||
const byte_t * | pbtNFCID3i, | |||
const size_t | szNFCID3iDataLen, | |||
const byte_t * | pbtGbData, | |||
const size_t | szGbDataLen, | |||
nfc_target_info_t * | pnti | |||
) |
Select a target and request active or passive mode for DEP (Data Exchange Protocol).
pnd | nfc_device_t struct pointer that represent currently used device | |
nmInitModulation | Desired modulation (NM_ACTIVE_DEP or NM_PASSIVE_DEP for active, respectively passive mode) | |
pbtPidData | passive initiator data, 4 or 5 bytes long, (optional, only for NM_PASSIVE_DEP, can be NULL) | |
szPidDataLen | size of pbtPidData | |
pbtNFCID3i | the NFCID3, 10 bytes long, of the initiator (optional, can be NULL) | |
szNFCID3iDataLen | size of pbtNFCID3i | |
pbtGbData | generic data of the initiator, max 48 bytes long, (optional, can be NULL) | |
szGbDataLen | size of pbtGbData | |
pnti | is a nfc_target_info_t struct pointer where target information will be put. |
The NFC device will try to find the available target. The standards (ISO18092 and ECMA-340) describe the modulation that can be used for reader to passive communications.
NFC_EXPORT bool nfc_initiator_transceive_bits | ( | nfc_device_t * | pnd, | |
const byte_t * | pbtTx, | |||
const size_t | szTxBits, | |||
const byte_t * | pbtTxPar, | |||
byte_t * | pbtRx, | |||
size_t * | pszRxBits, | |||
byte_t * | pbtRxPar | |||
) |
Transceive raw bit-frames.
pbtTx | contains a byte array of the frame that needs to be transmitted. | |
szTxBits | contains the length in bits. |
pbtTxPar | parameter contains a byte array of the corresponding parity bits needed to send per byte. |
The NFC reader will transmit low-level messages where only the modulation is handled by the PN53X chip. Construction of the frame (data, CRC and parity) is completely done by libnfc. This can be very useful for testing purposes. Some protocols (e.g. MIFARE Classic) require to violate the ISO14443-A standard by sending incorrect parity and CRC bytes. Using this feature you are able to simulate these frames.
NFC_EXPORT bool nfc_initiator_transceive_bytes | ( | nfc_device_t * | pnd, | |
const byte_t * | pbtTx, | |||
const size_t | szTxLen, | |||
byte_t * | pbtRx, | |||
size_t * | pszRxLen | |||
) |
Send raw data to target then retrieve raw data from target.
The reader will transmit the supplied bytes (pbtTx) to the target in raw mode: PN53x will not handle input neither output data. It waits for the response and stores the received bytes in the pbtRx byte array. The parity bits are handled by the PN53X chip. The CRC can be generated automatically or handled manually. Using this function, frames can be communicated very fast via the NFC reader to the tag.
Tests show that on average this way of communicating is much faster than using the regular driver/middle-ware (often supplied by manufacturers).
NFC_EXPORT void nfc_list_devices | ( | nfc_device_desc_t | pnddDevices[], | |
size_t | szDevices, | |||
size_t * | pszDeviceFound | |||
) |
Probe for discoverable supported devices (ie. only available for some drivers).
pnddDevices | Array of nfc_device_desc_t previously allocated by the caller. | |
szDevices | size of the pnddDevices array. | |
pszDeviceFound | number of devices found. |
NFC_EXPORT const char* nfc_strerror | ( | const nfc_device_t * | pnd | ) |
NFC_EXPORT int nfc_strerror_r | ( | const nfc_device_t * | pnd, | |
char * | pcStrErrBuf, | |||
size_t | szBufLen | |||
) |
NFC_EXPORT bool nfc_target_init | ( | nfc_device_t * | pnd, | |
byte_t * | pbtRx, | |||
size_t * | pszRxBits | |||
) |
Initialize NFC device as an emulated tag.
This functionality allows the NFC device to act as an emulated tag. There seems to be quite some options available for this feature. Not all of the PN53X modulations are tested and documented at the moment. At the moment it could best be seen as a preliminary functionality.
NFC_EXPORT bool nfc_target_receive_bits | ( | nfc_device_t * | pnd, | |
byte_t * | pbtRx, | |||
size_t * | pszRxBits, | |||
byte_t * | pbtRxPar | |||
) |
Receive bit-frames.
This function makes it possible to receive (raw) bit-frames. It returns all the messages that are stored in the FIFO buffer of the PN53X chip. It does not require to send any frame and thereby could be used to snoop frames that are transmitted by a nearby reader. Check out the NDO_ACCEPT_MULTIPLE_FRAMES configuration option to avoid losing transmitted frames.
NFC_EXPORT bool nfc_target_receive_bytes | ( | nfc_device_t * | pnd, | |
byte_t * | pbtRx, | |||
size_t * | pszRxLen | |||
) |
NFC_EXPORT bool nfc_target_send_bits | ( | nfc_device_t * | pnd, | |
const byte_t * | pbtTx, | |||
const size_t | szTxBits, | |||
const byte_t * | pbtTxPar | |||
) |
NFC_EXPORT bool nfc_target_send_bytes | ( | nfc_device_t * | pnd, | |
const byte_t * | pbtTx, | |||
const size_t | szTxLen | |||
) |