The following instructions show how to install the Fosstrak Reader RP Proxy:
Implement the following example ( ReaderProxyExample.java).
This example requires that there is a reader running that supports the HTTP/XML transport message binding of the Reader Protocol available at localhost:8000. If these settings are incorrect for your setup, you will need to adjust the following variables:
You might also want to consider using our existing Java implementation of a reader which includes a simulation engine.
import org.fosstrak.reader.rprm.core.EventType;
import org.fosstrak.reader.rprm.core.FieldName;
import org.fosstrak.reader.rp.proxy.DataSelector;
import org.fosstrak.reader.rp.proxy.NotificationChannel;
import org.fosstrak.reader.rp.proxy.ReaderDevice;
import org.fosstrak.reader.rp.proxy.Source;
import org.fosstrak.reader.rp.proxy.Trigger;
import org.fosstrak.reader.rp.proxy.factories.DataSelectorFactory;
import org.fosstrak.reader.rp.proxy.factories.NotificationChannelFactory;
import org.fosstrak.reader.rp.proxy.factories.ReaderDeviceFactory;
import org.fosstrak.reader.rp.proxy.factories.TriggerFactory;
import org.fosstrak.reader.rp.proxy.msg.Handshake;
public class ReaderProxyExample {
private static int MESSAGE_FORMAT = Handshake.FORMAT_XML;
private static int TRANSPORT_PROTOCOL = Handshake.HTTP;
private static final String COMMAND_CHANNEL_HOST = "localhost";
private static final int COMMAND_CHANNEL_PORT = 8000;
private static final String READ_TRIGGER_NAME = "ReadTrigger";
private static final String READ_TRIGGER_TYPE = Trigger.TIMER;
private static final String READ_TRIGGER_VALUE = "ms=2000";
private static final String NOTIFICATION_TRIGGER_NAME = "NotificationTrigger";
private static final String NOTIFICATION_TRIGGER_TYPE = Trigger.CONTINUOUS;
private static final String NOTIFICATION_TRIGGER_VALUE = "";
private static final String DATA_SELECTOR_NAME = "DataSelector";
private static final String[] EVENT_FILTERS = new String[] {EventType.EV_OBSERVED,
EventType.EV_LOST};
private static final String[] FIELD_NAMES = new String[] {FieldName.EVENT_TYPE,
FieldName.READER_NAME, FieldName.TAG_ID, FieldName.TAG_ID_AS_PURE_URI,
FieldName.TAG_ID_AS_TAG_URI, FieldName.SOURCE_NAME};
private static final String NOTIFICATION_CHANNEL_NAME = "NotificationChannel";
private static final String NOTIFICATION_CHANNEL_HOST = "localhost";
private static final int NOTIFICATION_CHANNEL_PORT = 9000;
private static final String NOTIFICATION_CHANNEL_MODE = "connect";
private static final String NOTIFICATION_CHANNEL_ADDRESS = "tcp://"
+ NOTIFICATION_CHANNEL_HOST + ":" + NOTIFICATION_CHANNEL_PORT + "?mode="
+ NOTIFICATION_CHANNEL_MODE;
public static void main(String[] args) throws Exception {
// create handshake
Handshake handshake = new Handshake();
handshake.setMessageFormat(MESSAGE_FORMAT);
handshake.setTransportProtocol(TRANSPORT_PROTOCOL);
// get reader device proxy
System.out.println("Get reader device proxy.");
ReaderDevice readerDevice = ReaderDeviceFactory.getReaderDevice(COMMAND_CHANNEL_HOST,
COMMAND_CHANNEL_PORT, handshake);
// get current source proxy
System.out.println("Get current source.");
Source source = readerDevice.getCurrentSource();
System.out.println("Name of current source is: " + source.getName());
// create read trigger
System.out.println("Create read trigger.");
Trigger readTrigger = TriggerFactory.createTrigger(READ_TRIGGER_NAME,
READ_TRIGGER_TYPE, READ_TRIGGER_VALUE, readerDevice);
// create notification trigger
System.out.println("Create notification trigger.");
Trigger notificationTrigger = TriggerFactory.createTrigger(NOTIFICATION_TRIGGER_NAME,
NOTIFICATION_TRIGGER_TYPE, NOTIFICATION_TRIGGER_VALUE, readerDevice);
// data selector
System.out.println("Create data selector.");
DataSelector dataSelector = DataSelectorFactory.createDataSelector(DATA_SELECTOR_NAME,
readerDevice);
System.out.println("Add event filters to data selector.");
dataSelector.addEventFilters(EVENT_FILTERS);
System.out.println("Add field names to data selector.");
dataSelector.addFieldNames(FIELD_NAMES);
//System.out.println("Add tag fields to data selector.");
//dataSelector.addTagFieldNames(TAG_FIELDS);
// create notification channel
System.out.println("Create notification channel.");
NotificationChannel notificationChannel = NotificationChannelFactory.createNotificationChannel(
NOTIFICATION_CHANNEL_NAME, NOTIFICATION_CHANNEL_ADDRESS, readerDevice);
System.out.println("Set data selector of notification channel.");
notificationChannel.setDataSelector(dataSelector);
System.out.println("Add notification trigger to notification channel.");
notificationChannel.addNotificationTriggers(new Trigger[] {notificationTrigger});
// add current source to notification channel
System.out.println("Add source to notification channel.");
notificationChannel.addSources(new Source[] {source});
// add read trigger to source
System.out.println("Add read trigger to source.");
source.addReadTriggers(new Trigger[] {readTrigger});
}
}
In order to process the notification messages from the reader, the proxy provides the class org.fosstrak.reader.rp.proxy.NotificationChannelEndPoint. The class that is interested in receiving the notification messages has to implement the interface org.fosstrak.reader.rp.proxy.NotificationChannelListener and has to be registered with the NotificationChannelEndPoint as shown below and in the example ( ReaderNotificationChannelListener.java).
import org.fosstrak.reader.rp.proxy.NotificationChannelListener;
import org.fosstrak.reader.rprm.core.msg.notification.Notification;
public class ReaderNotificationChannelListener implements NotificationChannelListener {
public void dataReceived(Notification notification) {
System.out.println("Notification received: " + notification);
// add your code to process notification message here
}
}
Code to create a NotificationChannelListener and to add a listener to it:
NotificationChannelListener notificationChannelListener = new ReaderNotificationChannelListener();
// create notification channel endpoint to receive messages
System.out.println("Create NotificationChannelEndpoint at port '" + NOTIFICATION_CHANNEL_PORT + "'.");
NotificationChannelEndPoint notificationChannelEndPoint = new
NotificationChannelEndPoint(NOTIFICATION_CHANNEL_PORT);
// add listerner to notification channel endpoint
notificationChannelEndPoint.addListener(notificationChannelListener);
Implement the following example
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.fosstrak.reader.proxy.configurator.ReaderConfigurator;
public class ReaderConfiguratorExample {
private static final String CONFIG_FILE_PATH = "./props/ReaderDeviceConfiguration.xml";
private static final Logger LOG = Logger.getLogger(ReaderConfiguratorExample.class);
public static void main(String[] args) throws Exception {
BasicConfigurator.configure();
LOG.info("Configurate reader device.");
ReaderConfigurator.initReaderDeviceConfiguration(CONFIG_FILE_PATH);
}
}
The corresponding properties ( ReaderDeviceConfiguration.xml) file looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<configurationDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ReaderDeviceConfiguration.xsd">
<readerDeviceConfiguration>
<!-- reader configuration -->
<readerConfig>
<commandChannelHost>localhost</commandChannelHost>
<commandChannelPort>8000</commandChannelPort>
<transportProtocol>HTTP</transportProtocol>
<transportFormat>XML</transportFormat>
</readerConfig>
<!-- read triggers -->
<triggers>
<timerTrigger name="ReadTrigger">
<value>2000</value>
</timerTrigger>
</triggers>
<!-- notification triggers -->
<triggers>
<continuousTrigger name="NotificationTrigger"/>
</triggers>
<!-- data selectors -->
<dataSelectors>
<dataSelector name="DataSelector">
<fieldNames>
<fieldName>eventType</fieldName>
<fieldName>readerName</fieldName>
<fieldName>tagID</fieldName>
<fieldName>tagIDasPureURI</fieldName>
<fieldName>tagIDasTagURI</fieldName>
<fieldName>sourceName</fieldName>
</fieldNames>
<eventFilters>
<eventFilter>evObserved</eventFilter>
<eventFilter>evLost</eventFilter>
</eventFilters>
</dataSelector>
</dataSelectors>
<!-- notification channels -->
<notificationChannels>
<notificationChannel name="NotificationChannel">
<notificationChannelHost>localhost</notificationChannelHost>
<notificationChannelPort>9000</notificationChannelPort>
<transportProtocol>TCP</transportProtocol>
<notificationChannelMode>connect</notificationChannelMode>
<sources>
<source>Shelf1</source>
</sources>
<notificationTriggers>
<triggerName>NotificationTrigger</triggerName>
</notificationTriggers>
<!-- dataSelector>DataSelector</dataSelector -->
</notificationChannel>
</notificationChannels>
<!-- sources -->
<sources>
<source name="Shelf1">
<triggerName>ReadTrigger</triggerName>
</source>
</sources>
</readerDeviceConfiguration>
</configurationDocument>