2010-01-15 11:18:11 +01:00
|
|
|
/*-
|
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/>
|
2010-01-15 11:18:11 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2009-10-12 16:52:26 +02:00
|
|
|
* @file nfc-list.c
|
2010-05-28 11:09:36 +02:00
|
|
|
* @brief List the first target present of each founded device
|
2009-10-12 16:52:26 +02:00
|
|
|
*/
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2010-01-15 11:18:11 +01:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif // HAVE_CONFIG_H
|
|
|
|
|
2009-12-07 22:13:36 +01:00
|
|
|
#ifdef HAVE_LIBUSB
|
|
|
|
#ifdef DEBUG
|
|
|
|
#include <sys/param.h>
|
|
|
|
#include <usb.h>
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2010-04-07 17:08:04 +02:00
|
|
|
#include <err.h>
|
2009-05-27 14:18:21 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2009-12-01 15:23:00 +01:00
|
|
|
#include <nfc/nfc.h>
|
|
|
|
#include <nfc/nfc-messages.h>
|
2010-04-10 00:08:17 +02:00
|
|
|
#include "nfc-utils.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;
|
2010-01-13 17:23:06 +01:00
|
|
|
size_t i;
|
2009-11-18 12:52:18 +01:00
|
|
|
nfc_target_info_t nti;
|
2010-07-22 18:13:02 +02:00
|
|
|
nfc_device_desc_t *pnddDevices = parse_device_desc(argc, argv, &szFound);
|
2010-04-16 22:39:56 +02:00
|
|
|
const char* acLibnfcVersion;
|
2009-05-27 14:18:21 +02:00
|
|
|
|
2010-07-22 15:41:20 +02:00
|
|
|
if (argc > 1 && szFound == 0) {
|
|
|
|
errx (1, "usage: %s [--device driver:port:speed]", argv[0]);
|
2010-04-07 17:08:04 +02:00
|
|
|
}
|
|
|
|
|
2009-11-24 18:49:24 +01:00
|
|
|
// Display libnfc version
|
2010-04-16 22:39:56 +02:00
|
|
|
acLibnfcVersion = nfc_version();
|
2009-11-20 14:43:18 +01:00
|
|
|
printf("%s use libnfc %s\n", argv[0], acLibnfcVersion);
|
|
|
|
|
2009-12-07 22:13:36 +01:00
|
|
|
#ifdef HAVE_LIBUSB
|
|
|
|
#ifdef DEBUG
|
|
|
|
usb_set_debug(4);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2010-01-12 12:50:09 +01:00
|
|
|
/* Lazy way to open an NFC device */
|
|
|
|
#if 0
|
|
|
|
pnd = nfc_connect(NULL);
|
|
|
|
#endif
|
2009-09-04 15:24:34 +02:00
|
|
|
|
2010-01-12 12:50:09 +01:00
|
|
|
/* If specific device is wanted, i.e. an ARYGON device on /dev/ttyUSB0 */
|
|
|
|
#if 0
|
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);
|
2010-01-12 12:50:09 +01:00
|
|
|
#endif
|
|
|
|
|
2010-07-22 15:41:20 +02:00
|
|
|
if (szFound == 0)
|
2009-11-24 18:49:24 +01:00
|
|
|
{
|
2010-07-22 15:41:20 +02:00
|
|
|
if (!(pnddDevices = malloc (MAX_DEVICE_COUNT * sizeof (*pnddDevices))))
|
|
|
|
{
|
|
|
|
fprintf (stderr, "malloc() failed\n");
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
2009-11-24 18:49:24 +01:00
|
|
|
|
2010-07-22 15:41:20 +02:00
|
|
|
nfc_list_devices (pnddDevices, MAX_DEVICE_COUNT, &szFound);
|
|
|
|
}
|
2009-11-24 18:49:24 +01:00
|
|
|
|
|
|
|
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-12-07 22:13:36 +01:00
|
|
|
printf("\nConnected 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
|
2010-07-21 12:37:37 +02:00
|
|
|
if (nfc_initiator_select_passive_target(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");
|
2010-04-10 00:08:17 +02:00
|
|
|
print_nfc_iso14443a_info (nti.nai);
|
2009-05-27 14:18:21 +02:00
|
|
|
}
|
|
|
|
|
2009-11-24 19:05:31 +01:00
|
|
|
// Poll for a Felica tag
|
2010-07-21 12:37:37 +02:00
|
|
|
if (nfc_initiator_select_passive_target(pnd,NM_FELICA_212,abtFelica,5,&nti) || nfc_initiator_select_passive_target(pnd,NM_FELICA_424,abtFelica,5,&nti))
|
2009-11-24 19:05:31 +01:00
|
|
|
{
|
|
|
|
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
|
2010-07-21 12:37:37 +02:00
|
|
|
if (nfc_initiator_select_passive_target(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
|
2010-07-21 12:37:37 +02:00
|
|
|
if (nfc_initiator_select_passive_target(pnd,NM_JEWEL_106,NULL,0,&nti))
|
2009-11-24 19:05:31 +01:00
|
|
|
{
|
|
|
|
// 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
|
|
|
}
|