> now compile against upcomming libnfc devel version.
This commit is contained in:
parent
e80fb86547
commit
9f2f1ff7f6
120
src/lsnfc.c
120
src/lsnfc.c
@ -23,9 +23,9 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <libnfc.h>
|
||||
#include <nfc.h>
|
||||
|
||||
static dev_info* pdi;
|
||||
static nfc_device_t* pnd;
|
||||
static byte_t abtFelica[5] = { 0x00, 0xff, 0xff, 0x00, 0x00 };
|
||||
|
||||
#define ERR(x, ...) printf("ERROR: " x "\n", ## __VA_ARGS__ )
|
||||
@ -39,11 +39,11 @@ void print_hex(byte_t* pbtData, size_t szDate)
|
||||
|
||||
int main(int argc, const char* argv[])
|
||||
{
|
||||
tag_info ti;
|
||||
nfc_target_info_t nti;
|
||||
uint8_t tag_count = 0;
|
||||
|
||||
// Try to open the NFC device
|
||||
pdi = nfc_connect(NULL);
|
||||
pnd = nfc_connect(NULL);
|
||||
|
||||
// If specific device is wanted, i.e. an ARYGON device on /dev/ttyUSB0
|
||||
/*
|
||||
@ -52,33 +52,33 @@ int main(int argc, const char* argv[])
|
||||
ndd.pcPort = "/dev/ttyUSB0";
|
||||
ndd.uiSpeed = 115200;
|
||||
|
||||
pdi = nfc_connect(&ndd);
|
||||
pnd = nfc_connect(&ndd);
|
||||
*/
|
||||
|
||||
if (pdi == INVALID_DEVICE_INFO)
|
||||
if (pnd == NULL)
|
||||
{
|
||||
ERR("Unable to connect to NFC device.");
|
||||
return 1;
|
||||
}
|
||||
nfc_initiator_init(pdi);
|
||||
nfc_initiator_init(pnd);
|
||||
|
||||
// Drop the field for a while
|
||||
nfc_configure(pdi,DCO_ACTIVATE_FIELD,false);
|
||||
nfc_configure(pnd,NDO_ACTIVATE_FIELD,false);
|
||||
|
||||
// Let the reader only try once to find a tag
|
||||
nfc_configure(pdi,DCO_INFINITE_SELECT,false);
|
||||
nfc_configure(pnd,NDO_INFINITE_SELECT,false);
|
||||
|
||||
// Configure the CRC and Parity settings
|
||||
nfc_configure(pdi,DCO_HANDLE_CRC,true);
|
||||
nfc_configure(pdi,DCO_HANDLE_PARITY,true);
|
||||
nfc_configure(pnd,NDO_HANDLE_CRC,true);
|
||||
nfc_configure(pnd,NDO_HANDLE_PARITY,true);
|
||||
|
||||
// Enable field so more power consuming cards can power themselves up
|
||||
nfc_configure(pdi,DCO_ACTIVATE_FIELD,true);
|
||||
nfc_configure(pnd,NDO_ACTIVATE_FIELD,true);
|
||||
|
||||
bool no_more_tag = false;
|
||||
printf("device = %s\n",pdi->acName);
|
||||
printf("device = %s\n",pnd->acName);
|
||||
do {
|
||||
if (nfc_initiator_select_tag(pdi,IM_ISO14443A_106,NULL,0,&ti)) // Poll for a ISO14443A (MIFARE) tag
|
||||
if (nfc_initiator_select_tag(pnd,NM_ISO14443A_106,NULL,0,&nti)) // Poll for a ISO14443A (MIFARE) tag
|
||||
{
|
||||
printf(" ISO14443A: ");
|
||||
|
||||
@ -102,72 +102,72 @@ Gemplus MPCOS 00 02 98
|
||||
Innovision R&T Jewel 0C 00
|
||||
*/
|
||||
|
||||
if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x09)) {
|
||||
printf("NXP MIFARE Mini (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x08)) {
|
||||
printf("NXP MIFARE Classic 1K (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x02) && (ti.tia.btSak == 0x18)) {
|
||||
printf("NXP MIFARE Classic 4K (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x02) && (ti.tia.btSak == 0x38)) {
|
||||
printf("Nokia MIFARE Classic 4K - emulated - (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x44) && (ti.tia.btSak == 0x00)) {
|
||||
printf("NXP MIFARE Ultralight (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x03) && (ti.tia.abtAtqa[1] == 0x44) && (ti.tia.btSak == 0x20)) {
|
||||
printf("NXP MIFARE DESFire (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x03) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x28)) {
|
||||
printf("NXP JCOP31 (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x48) && (ti.tia.btSak == 0x20)) {
|
||||
if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x09)) {
|
||||
printf("NXP MIFARE Mini (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x08)) {
|
||||
printf("NXP MIFARE Classic 1K (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x02) && (nti.nai.btSak == 0x18)) {
|
||||
printf("NXP MIFARE Classic 4K (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x02) && (nti.nai.btSak == 0x38)) {
|
||||
printf("Nokia MIFARE Classic 4K - emulated - (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x44) && (nti.nai.btSak == 0x00)) {
|
||||
printf("NXP MIFARE Ultralight (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x03) && (nti.nai.abtAtqa[1] == 0x44) && (nti.nai.btSak == 0x20)) {
|
||||
printf("NXP MIFARE DESFire (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x03) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x28)) {
|
||||
printf("NXP JCOP31 (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x48) && (nti.nai.btSak == 0x20)) {
|
||||
/* @todo handle ATS to be able to know which one is it. */
|
||||
printf("NXP JCOP31 or JCOP41 (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x28)) {
|
||||
printf("NXP JCOP41 (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x88)) {
|
||||
printf("Infineon MIFARE Classic 1K (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x02) && (ti.tia.btSak == 0x98)) {
|
||||
printf("Gemplus MPCOS (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
} else if ((ti.tia.abtAtqa[0] == 0x0C) && (ti.tia.abtAtqa[1] == 0x00)) {
|
||||
printf("NXP JCOP31 or JCOP41 (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x28)) {
|
||||
printf("NXP JCOP41 (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x88)) {
|
||||
printf("Infineon MIFARE Classic 1K (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x02) && (nti.nai.btSak == 0x98)) {
|
||||
printf("Gemplus MPCOS (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else if ((nti.nai.abtAtqa[0] == 0x0C) && (nti.nai.abtAtqa[1] == 0x00)) {
|
||||
/* @note I'm not sure that Jewel can be detected using this modultation and I haven't Jewel tags to test. */
|
||||
printf("Innovision R&T Jewel (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n");
|
||||
printf("Innovision R&T Jewel (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n");
|
||||
} else {
|
||||
printf("Unknown tag type: ");
|
||||
printf("ATQA (SENS_RES): "); print_hex(ti.tia.abtAtqa,2);
|
||||
printf(", UID (NFCID%c): ",(ti.tia.abtUid[0]==0x08?'3':'1')); print_hex(ti.tia.abtUid,ti.tia.szUidLen);
|
||||
printf(", SAK (SEL_RES): "); print_hex(&ti.tia.btSak,1);
|
||||
if (ti.tia.szAtsLen)
|
||||
printf("ATQA (SENS_RES): "); print_hex(nti.nai.abtAtqa,2);
|
||||
printf(", UID (NFCID%c): ",(nti.nai.abtUid[0]==0x08?'3':'1')); print_hex(nti.nai.abtUid,nti.nai.szUidLen);
|
||||
printf(", SAK (SEL_RES): "); print_hex(&nti.nai.btSak,1);
|
||||
if (nti.nai.szAtsLen)
|
||||
{
|
||||
printf(", ATS (ATR): ");
|
||||
print_hex(ti.tia.abtAts,ti.tia.szAtsLen);
|
||||
print_hex(nti.nai.abtAts,nti.nai.szAtsLen);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
nfc_initiator_deselect_tag(pdi);
|
||||
nfc_initiator_deselect_tag(pnd);
|
||||
tag_count++;
|
||||
} else if (nfc_initiator_select_tag(pdi,IM_FELICA_212,abtFelica,5,&ti) || nfc_initiator_select_tag(pdi,IM_FELICA_424,abtFelica,5,&ti)) // Poll for a Felica tag
|
||||
} else if (nfc_initiator_select_tag(pnd,NM_FELICA_212,abtFelica,5,&nti) || nfc_initiator_select_tag(pnd,NM_FELICA_424,abtFelica,5,&nti)) // Poll for a Felica tag
|
||||
{
|
||||
printf(" Felica: ");
|
||||
printf("ID (NFCID2): "); print_hex(ti.tif.abtId,8);
|
||||
printf(", Parameter (PAD): "); print_hex(ti.tif.abtPad,8);
|
||||
printf("ID (NFCID2): "); print_hex(nti.nfi.abtId,8);
|
||||
printf(", Parameter (PAD): "); print_hex(nti.nfi.abtPad,8);
|
||||
printf("\n");
|
||||
nfc_initiator_deselect_tag(pdi);
|
||||
nfc_initiator_deselect_tag(pnd);
|
||||
tag_count++;
|
||||
} else if (nfc_initiator_select_tag(pdi,IM_ISO14443B_106,(byte_t*)"\x00",1,&ti)) // Poll for a ISO14443B tag
|
||||
} else if (nfc_initiator_select_tag(pnd,NM_ISO14443B_106,(byte_t*)"\x00",1,&nti)) // Poll for a ISO14443B tag
|
||||
{
|
||||
printf(" ISO14443B: ");
|
||||
printf("ATQB: "); print_hex(ti.tib.abtAtqb,12);
|
||||
printf(", ID: "); print_hex(ti.tib.abtId,4);
|
||||
printf(", CID: %02x\n",ti.tib.btCid);
|
||||
if (ti.tib.szInfLen>0)
|
||||
printf("ATQB: "); print_hex(nti.nbi.abtAtqb,12);
|
||||
printf(", ID: "); print_hex(nti.nbi.abtId,4);
|
||||
printf(", CID: %02x\n",nti.nbi.btCid);
|
||||
if (nti.nbi.szInfLen>0)
|
||||
{
|
||||
printf(", INF: "); print_hex(ti.tib.abtInf,ti.tib.szInfLen);
|
||||
printf(", INF: "); print_hex(nti.nbi.abtInf,nti.nbi.szInfLen);
|
||||
}
|
||||
printf(", PARAMS: %02x %02x %02x %02x\n",ti.tib.btParam1,ti.tib.btParam2,ti.tib.btParam3,ti.tib.btParam4);
|
||||
printf(", PARAMS: %02x %02x %02x %02x\n",nti.nbi.btParam1,nti.nbi.btParam2,nti.nbi.btParam3,nti.nbi.btParam4);
|
||||
printf("\n");
|
||||
nfc_initiator_deselect_tag(pdi);
|
||||
nfc_initiator_deselect_tag(pnd);
|
||||
tag_count++;
|
||||
} else if (nfc_initiator_select_tag(pdi,IM_JEWEL_106,NULL,0,&ti)) // Poll for a Jewel tag
|
||||
} else if (nfc_initiator_select_tag(pnd,NM_JEWEL_106,NULL,0,&nti)) // Poll for a Jewel tag
|
||||
{
|
||||
printf(" Jewel: No test results yet");
|
||||
nfc_initiator_deselect_tag(pdi);
|
||||
nfc_initiator_deselect_tag(pnd);
|
||||
tag_count++;
|
||||
} else {
|
||||
no_more_tag = true;
|
||||
@ -176,8 +176,8 @@ Innovision R&T Jewel 0C 00
|
||||
printf("%d tag(s) have been found.\n", tag_count);
|
||||
|
||||
// Disable field
|
||||
nfc_configure(pdi,DCO_ACTIVATE_FIELD,false);
|
||||
nfc_configure(pnd,NDO_ACTIVATE_FIELD,false);
|
||||
|
||||
nfc_disconnect(pdi);
|
||||
nfc_disconnect(pnd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user