This tutorial describes how to send data to and receive data from NFC Forum type 4 tags.
The NFC
Tag Extension API can be used to exchange data with type 4 tags using
the CIso14443Connection::ExchangeData() method.
Before you begin, refer to the following:
nfcconnection.h, MNfcConnection
iso14443connection.h, CIso14443Connection
nfctag.h, MNfcTag
Follow the steps in Discovering NFC Tags to detect the type 4 tag.
Create a
new instance of the CIso14443Connection class.
CIso14443Connection* iIso14443Connection; iIso14443Connection = CIso14443Connection::NewL(iNfcServer);
Open the
connection to the tag using MNfcTag::OpenConnection() and pass the instance of CIso14443Connection class.
MNfcTag* iTag; iTag->OpenConnection(*iIso14443Connection);
Exchange
data using the CIso14443Connection::ExchangeData() method. The ExchangeData() method exchanges Application
Protocol Data Unit (APDU) commands with the target ISO 14443 tag.
void CNfcTagHandler::ExchangeData()
{
// Exchange data with the tag.
iIso14443Connection->ExchangeData( iStatus, iTransmitData, iReceivedData );
SetActive();
}The following example illustrates how to exchange data with an ISO 14443 tag:
#include <e32base.h>
#include <iso14443connection.h> // CIso14443Connection
#include <nfctag.h> // MNfcTag
#include <nfctagconnectionlistener.h> // MNfcTagConnectionListener
class CNfcTagHandler : public CActive,
public MNfcTagConnectionListener
{
public:
...
public: // From MNfcTagConnectionListener
// This method is called when tag is detected
void TagDetected( MNfcTag* aNfcTag );
// This method is called when the tag is removed from near field.
void TagLost();
public:
void ExchangeData();
private:
CIso14443Connection* iIso14443Connection;
RNfcServer iNfcServer;
MNfcTag* iTag;
RBuf8 iTransmitData;
RBuf8 iReceivedData;
};
void CNfcTagHandler::TagDetected( MNfcTag* aTag )
{
TInt error = KErrNone;
iTag = aTag;
// Create connection if not created yet.
if ( !iIso14443Connection )
{
TRAP(err, iIso14443Connection = CIso14443Connection::NewL( iNfcServer ));
}
// Checking the tag type.
if ( aTag->HasConnectionMode( TNfcConnectionInfo::ENfc14443P4 ) )
{
// Open the connection to tag.
error = aTag->OpenConnection( *iIso14443Connection );
}
// Checking errors is omitted for clarity.
}
void CNfcTagHandler::TagLost()
{
// Deleting aTag has to be handled since its ownership is transferred to
// the class implementing MNfcTagConnectionListener interface.
delete iTag;
iTag = NULL;
}
void CNfcTagHandler::ExchangeData()
{
//Exchange data with the tag.
iIso14443Connection->ExchangeData( iStatus, iTransmitData, iReceivedData );
SetActive();
}