2014-11-11 3 views
1

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

Я установил свою среду с 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/)

+0

Вы нашли ответ? Я стараюсь сделать то же самое –

+0

Нет ответа :( – user1118094

+0

Его неудачный –

ответ

-1

Для начала (это, как я начал), получите EMV book 3 и прочитайте о командах для транзакций с картой, включая команды APDU и как они написаны, ответные APDU и как они обрабатываются, коды ответов, коды байтов состояния и т. д. Затем получите книги 1 - 5, чтобы сопровождать вышеупомянутую книгу. Также получите книгу Implementing Electronic Card Payment Systems by Cristian Radu, которая поможет вам пройти каждый шаг, чтобы узнать, как разрабатывать приложения для карт EMV. Надеюсь, это поможет.

+0

Возможно, я что-то пропустил, но бесконтактная память SR ST («* ISO 14443-2B ST SRx *», как конкретно задано в вопросе), полностью не связана с APDU и Платежные карты EMV. –

+0

Не знаю, я проверю это. Но используемый выше код является частью кода am, используемого в моих приложениях для чтения nfc-карточек, и именно там я начал изучать чтение nfc-карт , поэтому я попросил @ user1118094 проверить эти учебные пособия. –