Appendix E. Examples of RFID communication

This appendix shows two examples how to communicate with RFID tag. In the first example the communication is done using PlainTagConnection interface. The second example is a reference example of the communication using target-specific connection provided by the API implementation.

PlainTagConnection example

/**
 * RFID reader MIDlet
 */
public class PlainTagMIDlet extends MIDlet implements TargetListener {

    private DiscoveryManager dm;
    
    public PlainTagMIDlet() {
        // Register TargetListener
        dm = DiscoveryManager.getInstance();
        try {
            dm.addTargetListener(this,TargetType.RFID_TAG);
        }
        catch (ContactlessException ce) {
            // handle exception
        }
    }

    // Target discovered
    public void targetDetected(TargetProperties[] props) {
        TargetProperties target = null;
        
        // Select target that has the right mapping
        for (int i = 0; i < props.length; i++) {
            if (props[i].getMapping().equals("MyMapping")) {
                target = props[i];
                break;
            }
            else {
                i++;
            }
        }
		
        // right target found 
        if (target != null) {
            // do the communication in separate thread
            MyThread thread = new MyThread(target);
            thread.start();
        }
    }
    . . .
}
	
/**
 * RFID reader thread
 */	
public class MyThread extends Thread {

    private TargetProperties target;
    
    public MyThread(TargetProperties target) {
        this.target = target;
    }
    
    public void run() {
        try {
            PlainTagConnection pconn = 
              (PlainTagConnection)Connector.open(target.getUrl());
            Vector input = new Vector();
            Vector output = new Vector();
            String cmd = new String( "read" );
            Integer sector = new Integer(2);
            Integer block = new Integer(1);
            byte[] key = {(byte)0x1, (byte)0x2, (byte)0x3,
                          (byte)0x4, (byte)0x5, (byte)0x6,
                          (byte)0x7};
            byte[] dataRead = new byte[16];
            byte[] accessBits = new byte[4];
            input.addElement( cmd );
            input.addElement( sector );
            input.addElement( block );
            input.addElement( key );
            output.addElement( dataRead );
            output.addElement( accessBits );
            output = pconn.transceive(input);          
            pconn.close();
            
            // Process the data
          }
          catch (IOException ioe) {
            // Handle exception
          }
          catch (ContactlessException ce) {
            // handle exception
          }
    }
}
	

Target-specific connection example

In this example the target-specific connection class used is only an imaginary example and not specified in this specification. It is only used to illustrate how the use of target-specific connection classes provided by the API implementation can make the communication with the RFID tag a bit easier.

/**
 * RFID reader MIDlet
 */
public class PlainTagMIDlet extends MIDlet implements TargetListener {

    private DiscoveryManager dm;
    
    public PlainTagMIDlet() {
        dm = DiscoveryManager.getInstance();
        try {
            dm.addTargetListener(this,TargetType.RFID_TAG);
        }
        catch (ContactlessException ce) {
            // handle exception
        }
    }

    public void targetDetected(TargetProperties[] props) {
        TargetProperties target = null;
		
        if (props.length > 1) {
            // Multiple targets found, exit
            return;
        }      
        target = props[0];

        // right target found 
        if (target != null) {
            // do the communication in separate thread
            MyThread thread = new MyThread(target);
            thread.start();
        }
    }
    . . . 
}
		

/**
 * RFID reader thread
 */	
public class MyThread extends Thread {

    private TargetProperties target;
    
    public MyThread(TargetProperties target) {
        this.target = target;
    }
    
    public void run() {

        Class[] connections = target.getConnectionNames();
        Class connClass = null;
        for (int i = 0; i < connections.length; i++) {
            if (connections[i].getName().equals
                    ("com.company.JSRTagConnection")) {
                // Right connection name found
                connClass = connections[i];
                break;
            }
            else {
                i++;
            }
        }
          
        if (connClass != null) {
            try {
                JSRTagConnection conn = (JSRTagConnection)
                    Connector.open(target.getUrl(connClass));
                int sector = 2;
                int block = 1;
                byte[] key = {(byte)0x1, (byte)0x2, (byte)0x3,
                    (byte)0x4, (byte)0x5, (byte)0x6,(byte)0x7};
                byte ret = conn.authenticate(sector, key);
                if (ret == 0) {
                    ret = conn.writeData(block, "Hello world");
                    String data = conn.readData(block);
                    // Process the data
                }
                conn.close();
            }
            catch (IOException ioe) {
                // Handle exception
            }
        }
    }
}