Libnfc Как читать содержимое карты NFC?

Я пытаюсь просто прочитать содержимое карты ISO 14443-2B ST SRx с помощью устройства чтения карт ACR122.

Я настроил свою среду с помощью Libnfc и соответствующего драйвера для чтения.

Прямо сейчас мне удалось написать код, который просто считывает UID карты и распечатывает его. Там вообще нет документации, и я совершенно не знаю, с чего начать чтение содержимого карты. Любая подсказка или фрагмент кода?

Вот что я сделал:

    // To compile this simple example:
// $ gcc -o quick_start_example1 quick_start_example1.c -lnfc
// ./quick_start_example1

#include <stdlib.h>
#include <nfc/nfc.h>

void print_nfc_target(const nfc_target *pnt, bool verbose)
{
  char *s;
  str_nfc_target(&s, pnt, verbose);
  printf("%s", s);
  nfc_free(s);
}

int main(int argc, const char *argv[])
{
    nfc_device *pnd;
    nfc_target nt;

    // Allocate only a pointer to nfc_context
    nfc_context *context;

    // Initialize libnfc and set the nfc_context
    nfc_init(&context);
    if (context == NULL) {
      printf("Unable to init libnfc (malloc)\n");
      exit(EXIT_FAILURE);
    }

    // Display libnfc version
    const char *acLibnfcVersion = nfc_version();
    (void)argc;
    printf("%s uses libnfc %s\n", argv[0], acLibnfcVersion);

    // Open, using the first available NFC device
    pnd = nfc_open(context, NULL);

    if (pnd == NULL) {
      printf("ERROR: %s\n", "Unable to open NFC device.");
      exit(EXIT_FAILURE);
    }
    // Set opened NFC device to initiator mode
    if (nfc_initiator_init(pnd) < 0) {
      nfc_perror(pnd, "nfc_initiator_init");
      exit(EXIT_FAILURE);
    }

    printf("NFC reader: %s opened\n", nfc_device_get_name(pnd));

    nfc_target ant[1];
    nfc_modulation nm;
    nm.nmt = NMT_ISO14443B;
    nm.nbr = NBR_106;

    nfc_initiator_list_passive_targets(pnd,nm,ant,1);
    printf("%s\n",nfc_strerror(pnd)); // print Success

    nfc_target ant2[1];
    nfc_modulation nm2;
    nm2.nmt = NMT_ISO14443B2SR;
    nm2.nbr = NBR_106;

    int res = 0;
    int n = 0;
    res = nfc_initiator_list_passive_targets(pnd, nm2, ant2, 1);
    printf("%s\n",nfc_strerror(pnd)); // print Success

    // printf("Cart identifier: %s\n", nt.nti.nsi.abtUID);
    for (n = 0; n < res; n++) {
      print_nfc_target(&ant2[n], true);
      printf("\n");
    }

    // Close NFC device
    nfc_close(pnd);
    // Release the context
    nfc_exit(context);
    exit(EXIT_SUCCESS);
}

PS: я указываю 2 цели из-за известной ошибки ( http://www.libnfc.org/community/topic/1044/problem-with-init-of-iso14443b/ )


person d.lime    schedule 11.11.2014    source источник
comment
Вы нашли ответ? Я изо всех сил пытаюсь сделать то же самое   -  person Stefano Mtangoo    schedule 08.03.2016


Ответы (2)


Я написал небольшую вспомогательную программу для чтения тегов ST SRx с помощью LibNFC:

https://github.com/Depau/nfc-st-srx/

Для их записи все еще нужны некоторые изменения, но они успешно читаются.

person Depau    schedule 10.08.2019

Для начала (так я начал) получите книгу 3 EMV и читать команды для карточных транзакций, включая командные APDU и то, как они записываются, ответные APDU и то, как они обрабатываются, коды ответов, коды байтов состояния и т. д. Затем возьмите книги с 1 по 5, чтобы сопровождать вышеупомянутую книгу. Также получите книгу Реализация систем оплаты электронными картами Кристиана Раду, который проведет вас через каждый шаг, необходимый для изучения того, как разрабатывать приложения для карт EMV. Надеюсь, это поможет.

person Peter    schedule 22.12.2014
comment
Может быть, я что-то упустил, но бесконтактная память ST SR (ISO 14443-2B ST SRx, как специально указано в вопросе) совершенно не связана с APDU и платежными картами EMV. - person Michael Roland; 22.12.2014
comment
Не знал об этом, проверю. Но приведенный выше код является частью кода, который я использую в своих приложениях для чтения карт nfc, и именно здесь я начал изучать чтение карт nfc, поэтому я попросил @user1118094 проверить эти руководства. - person Peter; 22.12.2014