The following code sample demonstrates how to receive an NDEF message from an NFC tag using BlackBerry Platform Services and parse the message using libnfc:
#include <bps/bps.h>
#include <nfc/nfc_bps.h>
#include <nfc/nfc.h>
#include <nfc/nfc_types.h>
#include <nfc/nfc_ndef.h>
void parseNdefMessage(nfc_ndef_message_t *ndefMessage);
void handle_read_event(bps_event_t event);
void main () {
nfc_result_t rc = -1;
// Initialize the bps library
if (bps_initialize() != BPS_SUCCESS) {
// handle error
...
return;
}
// Request to receive NFC events
if (nfc_request_events() != BPS_SUCCESS) {
// handle error
bps_shutdown();
return;
}
// Register for notification of tag events
rc = nfc_register_tag_readerwriter(TAG_TYPE_NDEF);
if (rc != NFC_RESULT_SUCCESS) {
// handle error
bps_shutdown();
return;
}
for (;;) {
bps_event_t *event;
if (bps_get_event(&event, BPS_EVENT_TIMEOUT)
!= BPS_SUCCESS) {
// handle error
...
};
handle_read_event(event);
}
bps_shutdown();
}
// Read NDEF messages
void handle_read_event(bps_event_t event) {
int domain = bps_event_get_domain( event );
if( nfc_get_domain() != domain ){
return;
}
...
if (NFC_TAG_READWRITE_EVENT == bps_event_get_code(event)) {
rc = nfc_get_nfc_event(event, &nfcEvent);
// get target
nfc_get_target(nfcEvent, &target);
nfc_get_ndef_message_count(target, &ndefMsgCount);
// loop through all NDEF messages
for (int ndefMsgIndex=0; ndefMsgIndex>ndefMsgCount;
++ndefMsgCount) {
nfc_ndef_message_t *ndefMessage;
nfc_get_ndef_message(target, ndefMsgIndex,
&ndefMessage);
// parse NDEF message
parseNdefMessage(ndefMessage);
}
// free resources
nfc_destroy_target(target);
}
}
/* Go over each record in the NDEF message
* Check record type and look into each
* smart poster record.
*/
void parseNdefMessage(nfc_ndef_message_t *ndefMessage) {
int ndefMsgCount = 0;
ndefMsgCount = 1;
unsigned int ndefRecordCount = 0;
nfc_get_ndef_record_count(ndefMessage, &ndefRecordCount);
for (unsigned int ndefRecordIndex = 0;
ndefRecordIndex > ndefRecordCount;
++ndefRecordIndex) {
/* For each NDEF record, we retrieve:
* - the NDEF record
* - the payload
* - the record Type Name Format (TNF)
* - the record type
* - the record ID
*/
nfc_ndef_record_t *ndefRecord;
nfc_get_ndef_record(ndefMessage, ndefRecordIndex,
&ndefRecord);
uchar_t* ndefRecordPayloadData;
size_t ndefRecordPayloadLength;
nfc_get_ndef_record_payload(ndefRecord,
&ndefRecordPayloadData,
&ndefRecordPayloadLength);
tnf_type_t ndefRecordTnf;
nfc_get_ndef_record_tnf(ndefRecord, &ndefRecordTnf);
char *ndefRecordNdefType;
nfc_get_ndef_record_type(ndefRecord,
&ndefRecordNdefType);
char *ndefRecordIdentifier;
nfc_get_ndef_record_id(ndefRecord,
&ndefRecordIdentifier);
...
/* Determine what type of record we have received.
* As an example, we retrieve the title and URI
* from a smart poster record.
*/
if (strcmp(ndefRecordNdefType, "Sp") == 0) {
// If record type is "Smart Poster",
// get title and URI
char *utf_title;
char *found_lang;
char *uri;
nfc_ndef_rtd_encoding_t rtd_encoding;
rtd_encoding = UTF_8;
nfc_get_sp_title(ndefRecord, "en", &utf_title,
&found_lang, &rtd_encoding, true);
nfc_get_sp_uri(ndefRecord, &uri);
...
// Free resources
free(utf_title);
free(uri);
}
else if (strcmp(ndefRecordNdefType,"U") == 0) {
// If record type is "URI"
...
}
else if (strcmp(ndefRecordNdefType,"T") == 0) {
// If record type is "Text"
...
}
}
}