2009-10-12 16:52:26 +02:00
|
|
|
/**
|
|
|
|
* Public platform independent Near Field Communication (NFC) library
|
|
|
|
*
|
|
|
|
* Copyright (C) 2009, Roel Verdult
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU Lesser General Public License as published by the
|
|
|
|
* Free Software Foundation, either version 3 of the License, or (at your
|
|
|
|
* option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
|
* more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @file nfc-list.c
|
|
|
|
* @brief
|
|
|
|
*/
|
2009-05-27 14:18:21 +02:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
2009-11-04 11:14:17 +01:00
|
|
|
#include <nfc.h>
|
2009-11-02 12:34:58 +01:00
|
|
|
|
2009-11-09 12:23:33 +01:00
|
|
|
#include "nfc-messages.h"
|
2009-11-02 12:34:58 +01:00
|
|
|
#include "bitutils.h"
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 18:49:24 +01:00
|
|
|
#define MAX_DEVICE_COUNT 16
|
|
|
|
|
2009-11-09 12:23:33 +01:00
|
|
|
static nfc_device_t* pnd;
|
2009-07-16 14:09:06 +02:00
|
|
|
static byte_t abtFelica[5] = { 0x00, 0xff, 0xff, 0x00, 0x00 };
|
2009-05-27 14:18:21 +02:00
|
|
|
|
|
|
|
int main(int argc, const char* argv[])
|
2009-08-28 18:54:04 +02:00
|
|
|
{
|
2009-11-24 18:49:24 +01:00
|
|
|
size_t szFound;
|
|
|
|
int i;
|
2009-11-18 12:52:18 +01:00
|
|
|
nfc_target_info_t nti;
|
2009-11-24 18:49:24 +01:00
|
|
|
nfc_device_desc_t *pnddDevices;
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 18:49:24 +01:00
|
|
|
// Display libnfc version
|
2009-11-20 14:43:18 +01:00
|
|
|
const char* acLibnfcVersion = nfc_version();
|
|
|
|
printf("%s use libnfc %s\n", argv[0], acLibnfcVersion);
|
|
|
|
|
2009-11-24 18:49:24 +01:00
|
|
|
// Lazy way to open an NFC device
|
|
|
|
/*
|
2009-11-09 12:23:33 +01:00
|
|
|
pnd = nfc_connect(NULL);
|
2009-11-24 18:49:24 +01:00
|
|
|
*/
|
2009-09-04 15:24:34 +02:00
|
|
|
|
|
|
|
// If specific device is wanted, i.e. an ARYGON device on /dev/ttyUSB0
|
|
|
|
/*
|
2009-10-02 11:52:02 +02:00
|
|
|
nfc_device_desc_t ndd;
|
|
|
|
ndd.pcDriver = "ARYGON";
|
|
|
|
ndd.pcPort = "/dev/ttyUSB0";
|
|
|
|
ndd.uiSpeed = 115200;
|
2009-09-04 15:24:34 +02:00
|
|
|
|
2009-11-09 12:23:33 +01:00
|
|
|
pnd = nfc_connect(&ndd);
|
2009-09-04 15:24:34 +02:00
|
|
|
*/
|
2009-11-24 18:49:24 +01:00
|
|
|
if (!(pnddDevices = malloc (MAX_DEVICE_COUNT * sizeof (*pnddDevices))))
|
|
|
|
{
|
|
|
|
fprintf (stderr, "malloc() failed\n");
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nfc_list_devices (pnddDevices, MAX_DEVICE_COUNT, &szFound);
|
|
|
|
|
|
|
|
if (szFound == 0)
|
|
|
|
{
|
|
|
|
INFO("%s", "No device found.");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < szFound; i++)
|
|
|
|
{
|
|
|
|
pnd = nfc_connect(&(pnddDevices[i]));
|
|
|
|
|
2009-08-28 18:54:04 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
if (pnd == NULL)
|
|
|
|
{
|
|
|
|
ERR("%s", "Unable to connect to NFC device.");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
nfc_initiator_init(pnd);
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Drop the field for a while
|
|
|
|
nfc_configure(pnd,NDO_ACTIVATE_FIELD,false);
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Let the reader only try once to find a tag
|
|
|
|
nfc_configure(pnd,NDO_INFINITE_SELECT,false);
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Configure the CRC and Parity settings
|
|
|
|
nfc_configure(pnd,NDO_HANDLE_CRC,true);
|
|
|
|
nfc_configure(pnd,NDO_HANDLE_PARITY,true);
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Enable field so more power consuming cards can power themselves up
|
|
|
|
nfc_configure(pnd,NDO_ACTIVATE_FIELD,true);
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
printf("Connected to NFC reader: %s\n\n",pnd->acName);
|
2009-08-28 18:54:04 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Poll for a ISO14443A (MIFARE) tag
|
|
|
|
if (nfc_initiator_select_tag(pnd,NM_ISO14443A_106,NULL,0,&nti))
|
2009-05-27 14:18:21 +02:00
|
|
|
{
|
2009-11-24 19:05:31 +01:00
|
|
|
printf("The following (NFC) ISO14443A tag was found:\n\n");
|
|
|
|
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(nti.nai.abtAts,nti.nai.szAtsLen);
|
|
|
|
}
|
2009-05-27 14:18:21 +02:00
|
|
|
}
|
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Poll for a Felica tag
|
|
|
|
if (nfc_initiator_select_tag(pnd,NM_FELICA_212,abtFelica,5,&nti) || nfc_initiator_select_tag(pnd,NM_FELICA_424,abtFelica,5,&nti))
|
|
|
|
{
|
|
|
|
printf("The following (NFC) Felica tag was found:\n\n");
|
|
|
|
printf("%18s","ID (NFCID2): "); print_hex(nti.nfi.abtId,8);
|
|
|
|
printf("%18s","Parameter (PAD): "); print_hex(nti.nfi.abtPad,8);
|
|
|
|
}
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Poll for a ISO14443B tag
|
|
|
|
if (nfc_initiator_select_tag(pnd,NM_ISO14443B_106,(byte_t*)"\x00",1,&nti))
|
2009-08-28 18:54:04 +02:00
|
|
|
{
|
2009-11-24 19:05:31 +01:00
|
|
|
printf("The following (NFC) ISO14443-B tag was found:\n\n");
|
|
|
|
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(nti.nbi.abtInf,nti.nbi.szInfLen);
|
|
|
|
}
|
|
|
|
printf("PARAMS: %02x %02x %02x %02x\n",nti.nbi.btParam1,nti.nbi.btParam2,nti.nbi.btParam3,nti.nbi.btParam4);
|
2009-08-28 18:54:04 +02:00
|
|
|
}
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Poll for a Jewel tag
|
|
|
|
if (nfc_initiator_select_tag(pnd,NM_JEWEL_106,NULL,0,&nti))
|
|
|
|
{
|
|
|
|
// No test results yet
|
|
|
|
printf("jewel\n");
|
|
|
|
}
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
nfc_disconnect(pnd);
|
|
|
|
}
|
2009-11-24 18:49:24 +01:00
|
|
|
|
|
|
|
free (pnddDevices);
|
2009-11-24 14:03:48 +01:00
|
|
|
return 0;
|
2009-05-27 14:18:21 +02:00
|
|
|
}
|