title: Libnfc How to read NFC card content?
body: <p>I'm trying to simply read an ISO 14443-2B ST SRx card content using ACR122 card reader.</p>
  
  <p>I've set up my environment with Libnfc and the proper reader driver.</p>
  
  <p>Right now I've managed to write a code that simply read the card UID and prints that out.
  There's no documentation at all, and I totally don't know where to start for reading card content. Any clue or code snippet?</p>
  
  <p>This is what I've done:</p>
  
  <pre><code>    // To compile this simple example:
  // $ gcc -o quick_start_example1 quick_start_example1.c -lnfc
  // ./quick_start_example1
  
  #include &lt;stdlib.h&gt;
  #include &lt;nfc/nfc.h&gt;
  
  void print_nfc_target(const nfc_target *pnt, bool verbose)
  {
    char *s;
    str_nfc_target(&amp;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(&amp;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) &lt; 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 &lt; res; n++) {
        print_nfc_target(&amp;ant2[n], true);
        printf("\n");
      }
  
      // Close NFC device
      nfc_close(pnd);
      // Release the context
      nfc_exit(context);
      exit(EXIT_SUCCESS);
  }
  </code></pre>
  
  <p>PS: I'm listing 2 times the targets because of a known bug ( <a href="http://www.libnfc.org/community/topic/1044/problem-with-init-of-iso14443b/" rel="nofollow">http://www.libnfc.org/community/topic/1044/problem-with-init-of-iso14443b/</a> )</p>