<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.rifidi.net/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.rifidi.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nurban</id>
		<title>RifidiWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.rifidi.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nurban"/>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/Special:Contributions/Nurban"/>
		<updated>2026-06-10T05:23:12Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.1</generator>

	<entry>
		<id>http://wiki.rifidi.net/index.php/Edge_Management</id>
		<title>Edge Management</title>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/Edge_Management"/>
				<updated>2015-11-19T23:07:55Z</updated>
		
		<summary type="html">&lt;p&gt;Nurban: /* Restlet Tuning/Confguration (Jetty) as of Rifidi 3.4 (coming winter 2015) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
Starting in 3.1 Edge Management is now accessible though Restful Services (leveraging [http://restlet.com/ Restlet plugin]. Restlet allows all Rifidi Edge Management operations available through workbench to be accessible via Restful Services.Prior to Rifidi 3.1 Edge Management is available through RMI (currently used by Rifidi Workbench if looking for code examples). &lt;br /&gt;
&lt;br /&gt;
The types of operations available through Restful Services include:&lt;br /&gt;
*All &amp;quot;session&amp;quot; commands (for stopping and starting reader/sensor sessions)&lt;br /&gt;
*ExecuteCommand and deleteCommand  (for commands supported by a sensor such as a tag read)&lt;br /&gt;
*Readers (for getting a list of readers/sensors available on Edge Server instance)&lt;br /&gt;
*Commands (for issuing command line operations such as saving the Edge Server Configuration currently in memory)&lt;br /&gt;
*Get and Set Properties (for setting and getting sensor properties such as Setting the LLRP Reader Configuration dynamically)&lt;br /&gt;
*Create Reader (for creating a new reader connection)&lt;br /&gt;
*Managing Rifidi Applications (for stopping/starting, listing and deploying Rifidi Apps)&lt;br /&gt;
&lt;br /&gt;
Additional features can be found on [http://restlet.com/ Restlet User Guide ]&lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
&lt;br /&gt;
In rifidiserver.ini  - A full list of Rifidi Edge configuration parameters can be found [[Edge_Server_Configuration]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Port can be set&lt;br /&gt;
-Dorg.rifidi.restlet.port=8111&lt;br /&gt;
#Restlet starts by default this can be changed &lt;br /&gt;
-Dorg.rifidi.restlet.enabled=true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Source for Restful Rifidi Management Commands - https://transcends.svn.cloudforge.com/rifidi/rifidi/trunk/org.rifidi.edge/src/org/rifidi/edge/rest/&lt;br /&gt;
&lt;br /&gt;
=Configuration (HTTP over SSL) - Available as of version 3.1.1= &lt;br /&gt;
&lt;br /&gt;
A full list of Rifidi Edge configuration parameters can be found [[Edge_Server_Configuration]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#SSL Port can be set&lt;br /&gt;
-Dorg.rifidi.restlet.ssl.port=8183&lt;br /&gt;
#Restlet starts by default this can be changed &lt;br /&gt;
-Dorg.rifidi.restlet.ssl.enabled=true&lt;br /&gt;
#Keystore Path&lt;br /&gt;
-Dorg.rifidi.restlet.ssl.keystorepath=\config\serverX.jks&lt;br /&gt;
#Key store password&lt;br /&gt;
-Dorg.rifidi.restlet.ssl.keystorepassword=password&lt;br /&gt;
#Key Password&lt;br /&gt;
-Dorg.rifidi.restlet.ssl.keypassword=password&lt;br /&gt;
#Key store Type&lt;br /&gt;
-Dorg.rifidi.restlet.ssl.keystoretype=JKS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note: Link to how to configure/setup certificates with REST - http://restlet.com/learn/guide/2.3/core/security/https&lt;br /&gt;
==REST HTTP over SSL Example Application==&lt;br /&gt;
link to https java client example - https://transcends.svn.cloudforge.com/rifidi/rifidi/trunk/org.rifidi.edge.rest/src/org/rifidi/edge/rest/test/HttpsTestClient.java&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user can add this jvm parameter to see detailed messages if getting any &lt;br /&gt;
trouble when running this example:&lt;br /&gt;
-Djavax.net.debug=all&lt;br /&gt;
&lt;br /&gt;
In order t0 successful get the https response from stand alone java &lt;br /&gt;
example, user must import the certificate into JVM:&lt;br /&gt;
&lt;br /&gt;
open command windows as administrator and execute keytool -import, like:&lt;br /&gt;
&lt;br /&gt;
keytool -import -alias localhost -keystore &amp;quot;C:\Program Files &lt;br /&gt;
(x86)\Java\jdk1.6.0_45\jre\lib\security\cacerts&amp;quot; -file &lt;br /&gt;
&amp;quot;D:\tmp\cert\localhost.cer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if requested, default password is: changeit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Restlet Logging= &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*1. Add an entry to the rifidiserver.ini (if using windows; when using linux you add this JVM argument in the rifidi-server executable):&lt;br /&gt;
-Djava.util.logging.config.file=d:/myLogging.properties&lt;br /&gt;
&lt;br /&gt;
*2. Create logging properties file, for example like the below myLogging.properties&lt;br /&gt;
The entry in that file that determines where the log file will show up is the following: java.util.logging.FileHandler.pattern=d:/restlet.log&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
myLogging.properties&lt;br /&gt;
# ================================&lt;br /&gt;
    # ==                            ==&lt;br /&gt;
    # ==   Web Logging Properties   ==&lt;br /&gt;
    # ==                            ==&lt;br /&gt;
    # ================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # ------------------&lt;br /&gt;
    # General properties&lt;br /&gt;
    # ------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # This defines a whitespace separated list of class names for handler classes to load and register as handlers on&lt;br /&gt;
    # the root Logger (the Logger named &amp;quot;&amp;quot;). Each class name must be for a Handler class which has a default constructor.&lt;br /&gt;
    # Note that these Handlers may be created lazily, when they are first used.&lt;br /&gt;
    handlers=java.util.logging.FileHandler&lt;br /&gt;
	# ------------------&lt;br /&gt;
    # Loggers properties&lt;br /&gt;
    # ------------------&lt;br /&gt;
&lt;br /&gt;
    .level=WARNING&lt;br /&gt;
    org.mortbay.level=WARNING&lt;br /&gt;
    org.restlet.level=INFO&lt;br /&gt;
    com.noelios.level=WARNING&lt;br /&gt;
&lt;br /&gt;
    com.noelios.web.WebComponent.www.level=INFO&lt;br /&gt;
    com.noelios.web.WebComponent.www.handlers=com.noelios.restlet.util.AccessLogFileHandler&lt;br /&gt;
    com.noelios.web.WebComponent.www.useParentHandlers=false&lt;br /&gt;
	# -------------------------&lt;br /&gt;
    # ConsoleHandler properties&lt;br /&gt;
    # -------------------------&lt;br /&gt;
&lt;br /&gt;
    # Specifies the default level for the Handler  (defaults to Level.INFO).&lt;br /&gt;
    # java.util.logging.ConsoleHandler.level=WARNING&lt;br /&gt;
&lt;br /&gt;
    # Specifies the name of a Filter class to use (defaults to no Filter).&lt;br /&gt;
    # java.util.logging.ConsoleHandler.filter=&lt;br /&gt;
&lt;br /&gt;
    # Specifies the name of a Formatter class to use (defaults to java.util.logging.SimpleFormatter).&lt;br /&gt;
    # java.util.logging.ConsoleHandler.formatter=&lt;br /&gt;
&lt;br /&gt;
    # The name of the character set encoding to use (defaults to the default platform encoding).&lt;br /&gt;
    # java.util.logging.ConsoleHandler.encoding=&lt;br /&gt;
	&lt;br /&gt;
	# ------------------------------&lt;br /&gt;
    # General FileHandler properties&lt;br /&gt;
    # ------------------------------&lt;br /&gt;
&lt;br /&gt;
    # Specifies the default level for the Handler  (defaults to Level.ALL).&lt;br /&gt;
    # java.util.logging.FileHandler.level=ALL&lt;br /&gt;
&lt;br /&gt;
    # Specifies the name of a Filter class to use (defaults to no Filter).&lt;br /&gt;
    # java.util.logging.FileHandler.filter=&lt;br /&gt;
&lt;br /&gt;
    # Specifies the name of a Formatter class to use (defaults to java.util.logging.XMLFormatter)&lt;br /&gt;
    java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter&lt;br /&gt;
&lt;br /&gt;
    # The name of the character set encoding to use (defaults to the default platform encoding).&lt;br /&gt;
    # java.util.logging.FileHandler.encoding=&lt;br /&gt;
&lt;br /&gt;
    # Specifies an approximate maximum amount to write (in bytes) to any one file.&lt;br /&gt;
    # If this is zero, then there is no limit. (Defaults to no limit).&lt;br /&gt;
    java.util.logging.FileHandler.limit=10000000&lt;br /&gt;
&lt;br /&gt;
    # Specifies how many output files to cycle through (defaults to 1).&lt;br /&gt;
    java.util.logging.FileHandler.count=100&lt;br /&gt;
&lt;br /&gt;
    # Specifies a pattern for generating the output file name. (Defaults to &amp;quot;%h/java%u.log&amp;quot;).&lt;br /&gt;
    # A pattern consists of a string that includes the following special components that will be replaced at runtime:&lt;br /&gt;
    #    &amp;quot;/&amp;quot; the local pathname separator&lt;br /&gt;
    #    &amp;quot;%t&amp;quot; the system temporary directory&lt;br /&gt;
    #    &amp;quot;%h&amp;quot; the value of the &amp;quot;user.home&amp;quot; system property&lt;br /&gt;
    #    &amp;quot;%g&amp;quot; the generation number to distinguish rotated logs&lt;br /&gt;
    #    &amp;quot;%u&amp;quot; a unique number to resolve conflicts&lt;br /&gt;
    #    &amp;quot;%%&amp;quot; translates to a single percent sign &amp;quot;%&amp;quot;&lt;br /&gt;
    java.util.logging.FileHandler.pattern=d:/restlet.log&lt;br /&gt;
&lt;br /&gt;
    # Specifies whether the FileHandler should append onto any existing files (defaults to false).&lt;br /&gt;
    # java.util.logging.FileHandler.append=&lt;br /&gt;
	# -------------------------&lt;br /&gt;
    # LogFileHandler properties&lt;br /&gt;
    # -------------------------&lt;br /&gt;
&lt;br /&gt;
    # Specifies the default level for the Handler  (defaults to Level.ALL).&lt;br /&gt;
    # org.restlet.engine.log.AccessLogFileHandler.level=ALL&lt;br /&gt;
&lt;br /&gt;
    # Specifies the name of a Filter class to use (defaults to no Filter).&lt;br /&gt;
    # org.restlet.engine.log.AccessLogFileHandler.filter=&lt;br /&gt;
&lt;br /&gt;
    # Specifies the name of a Formatter class to use (defaults to java.util.logging.XMLFormatter)&lt;br /&gt;
    org.restlet.engine.log.AccessLogFileHandler.formatter=com.noelios.restlet.util.AccessLogFormatter&lt;br /&gt;
&lt;br /&gt;
    # The name of the character set encoding to use (defaults to the default platform encoding).&lt;br /&gt;
    # org.restlet.engine.log.AccessLogFileHandler.encoding=&lt;br /&gt;
&lt;br /&gt;
    # Specifies an approximate maximum amount to write (in bytes) to any one file.&lt;br /&gt;
    # If this is zero, then there is no limit. (Defaults to no limit).&lt;br /&gt;
    org.restlet.engine.log.AccessLogFileHandler.limit=10000000&lt;br /&gt;
&lt;br /&gt;
    # Specifies how many output files to cycle through (defaults to 1).&lt;br /&gt;
    org.restlet.engine.log.AccessLogFileHandler.count=100&lt;br /&gt;
&lt;br /&gt;
    # Specifies a pattern for generating the output file name. (Defaults to &amp;quot;%h/java%u.log&amp;quot;).&lt;br /&gt;
    # A pattern consists of a string that includes the following special components that will be replaced at runtime:&lt;br /&gt;
    #    &amp;quot;/&amp;quot; the local pathname separator&lt;br /&gt;
    #    &amp;quot;%t&amp;quot; the system temporary directory&lt;br /&gt;
    #    &amp;quot;%h&amp;quot; the value of the &amp;quot;user.home&amp;quot; system property&lt;br /&gt;
    #    &amp;quot;%g&amp;quot; the generation number to distinguish rotated logs&lt;br /&gt;
    #    &amp;quot;%u&amp;quot; a unique number to resolve conflicts&lt;br /&gt;
    #    &amp;quot;%%&amp;quot; translates to a single percent sign &amp;quot;%&amp;quot; .pattern=/home/prod/data/log/WebComponent-www-%u-%g.log&lt;br /&gt;
&lt;br /&gt;
    # Specifies whether the FileHandler should append onto any existing files (defaults to false).&lt;br /&gt;
    # org.restlet.util.AccessLogFileHandler.append=&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Restlet Tuning/Confguration (Jetty) as of Rifidi 3.4 (coming winter 2015)= &lt;br /&gt;
&lt;br /&gt;
As of Rifidi 3.4 Jetty was made the default HTTP container for Restlet to allow for extended performance and configuration of the REST interface.&lt;br /&gt;
&lt;br /&gt;
The parameters can for configured in the Rifidi Server (ini) configuration&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
*-Dorg.rifidi.restlet.threadPool.minThreads=8	Thread pool minimum threads&lt;br /&gt;
*-Dorg.rifidi.restlet.threadPool.maxThreads=200	Thread pool max threads&lt;br /&gt;
&lt;br /&gt;
Full list of Jetty parameters using the same naming convention can be found here  - http://restlet.com/technical-resources/restlet-framework/javadocs/snapshot/jse/ext/org/restlet/ext/jetty/JettyServerHelper.html&lt;br /&gt;
&lt;br /&gt;
=Commands=&lt;br /&gt;
&lt;br /&gt;
==Command Code Snippet - start session - example how to use Rifidi API in a Java App==&lt;br /&gt;
All Rifidi Management API Command Logic here - https://transcends.svn.cloudforge.com/rifidi/rifidi/trunk/org.rifidi.edge/src/org/rifidi/edge/rest/SensorManagerServiceRestletImpl.java&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
sensorManagerService.startSession((String) request&lt;br /&gt;
	.getAttributes().get(&amp;quot;readerID&amp;quot;), (String) request&lt;br /&gt;
		.getAttributes().get(&amp;quot;sessionID&amp;quot;));&lt;br /&gt;
	response.setEntity(self.generateReturnString(self&lt;br /&gt;
		.generateSuccessMessage()), MediaType.TEXT_XML);&lt;br /&gt;
} catch (Exception e) {&lt;br /&gt;
	response.setEntity(e.getMessage(), MediaType.TEXT_PLAIN);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Command Basic Flow Example==&lt;br /&gt;
#Create a Reader - http://localhost:8111/createreader/LLRP/IpAddress=127.0.0.1;Port=5084&lt;br /&gt;
#Create a Session (on a reader/sensor)  - http://localhost:8111/createsession/LLRP_1&lt;br /&gt;
#Create a Command (on a reader/sensor)) -/createcommand/{commandType}/{properties} &lt;br /&gt;
*Note: some readers do not require create/executing a command as there is only one command hence for convenience is part of the create session/start session  (Thinkify, CSL and Generic adapter (for handhelds/async push calls) are some examples of this)&lt;br /&gt;
#Set Command Properties - http://localhost:8111/setproperties/LLRP_Configure_1/Duration=2130&lt;br /&gt;
#Execute Command (on a given reader/sensor and session) - http://localhost:8111/executecommand/LLRP_1/1/LLRP_Configure_1/-1&lt;br /&gt;
#Start Session (to begin processing reads using associate command/reader/sensor configuration)  - http://localhost:8111/startsession/LLRP_1/1&lt;br /&gt;
#Save Configuartion (optional -  to save/persist config in case of a server restart) - http://localhost:8111/save&lt;br /&gt;
&lt;br /&gt;
=Command Example=&lt;br /&gt;
&lt;br /&gt;
Note: localhost can be substituted with IP address/Host name of Rifidi Edge Server. Port can be changed in Rifidi configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==commandtypes command example==&lt;br /&gt;
&lt;br /&gt;
*commandtypes - returns a list of available command types&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;commandtypes&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/commandtypes&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
&amp;lt;commands&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;LLRP-ADD_ROSPEC-File&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the LLRP reader via an XML file. Any changes made to the reader are determined by the contents of the file. To generate xml code for the commands you want to submit, check out LLRP Commander here: http://www.fosstrak.org/llrp/index.html&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;LLRP&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;ThingMagic-Poll&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Poll the ThingMagic reader for its tags. For monitoring of the read zone, submit this command for recurring execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;ThingMagic&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Alien-Push-Start&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the Alien reader to send back tags using the autonomous mode. To monitor a read zone, configure an Alien autonomous reader to listen. Then submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Alien&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;LLRP-Configure&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the LLRP reader to collect tags. By default, this command will cause the LLRP reader to push back tag reads automatically. If you would rather use the Poll mode, you will need to use the LLRP Poll command. To use the LLRP Configure command, submit it for a one-time execution&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;LLRP&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;LLRP-Push-Stop&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Command the LLRP reader to stop sending back tags. To use, supply the RO Spec that is currently executing on the reader, and submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;LLRP&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Awid2010-Poll&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the Awid reader to send back tags using the Gen 2 Portal ID command. To monitor a read zone, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Awid2010&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Thingmagic6-Push&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Sets the Thingmagic to push tags back to the edge server&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Thingmagic6&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Awid3014-Poll&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the Awid reader to send back tags using the Gen 2 Portal ID command. To monitor a read zone, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Awid3014&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Awid3014-Push-Stop&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Command the Awid reader to stop sending back tags. To use, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Awid3014&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Alien-Poll&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Poll the Alien reader for its tag list. For monitoring of the read zone, submit this command for recurring execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Alien&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;LLRP-Poll&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Poll the LLRP reader for its tags. For monitoring of the read zone, first use the LLRP Configure command to configure the LLRP reader for Poll Mode. Then submit this command for recurring execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;LLRP&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Awid-Mask-Poll&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the Awid reader to send back tags using the Gen 2 Portal ID With Mask command. To monitor a read zone and read a specific memory bank, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Awid2010&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Alien-Push-Stop&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Command the Alien reader to stop sending back tags in autonomous mode. To use, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Alien&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Awid2010-Push-Stop&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Command the Awid reader to stop sending back tags. To use, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Awid2010&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;command&amp;gt;&lt;br /&gt;
&amp;lt;factoryID&amp;gt;Awid-Read-Block-Data&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
Configure the Awid reader to send back memory bank tags using the Read Block Data commmand. To monitor a read zone and read a specific memory bank, submit this command for a one-time execution.&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;readerFactoryID&amp;gt;Awid2010&amp;lt;/readerFactoryID&amp;gt;&lt;br /&gt;
&amp;lt;/command&amp;gt;&lt;br /&gt;
&amp;lt;/commands&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==readertypes command example==&lt;br /&gt;
&lt;br /&gt;
*readertypes - returns a list of available reader/sensor types (such as LLRP, Alien, BarCode etc..)&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;readertypes&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/readertypes&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;sensors&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Generic&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;A generic Rifidi Adapter.&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Opticon&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi Adapter for the Opticon Barcode Sensor&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Alien-Autonomous&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi Alien autonomous adapter is an endpoint to passively receive tag reads from an Alien reader operating in autonomous mode. You cannot send any commands on the alien autonomous session&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Awid2010&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi Awid adapater supports the Awid TCP/IP protocol on the 2010 and 3014&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Thingmagic6&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;Sensor plugin for Thingmagic 6 readers&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;LLRP&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi LLRP adapter supports any reader that exposes a Low Level Reader Protocol (LLRP) interface. LLRP is a standard from EPCglobal.&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Awid3014&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi Awid adapater supports the Awid TCP/IP protocol on the 2010 and 3014&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi Alien adapter supports the Alien ALR protocol on the 9900, 9800, 8800 readers.&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Thinkify50&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;Sensor plugin for Thinkify TR50 readers&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;ThingMagic&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
         &amp;lt;description&amp;gt;The Rifidi ThingMagic adapater supports the ThingMagic RQL protocol on the Mercury 4 and Mercury 5 readers&amp;lt;/description&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
   &amp;lt;/sensors&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==createreader command example==&lt;br /&gt;
&lt;br /&gt;
Note: The command is atomic so either all the parameters/properties in request are valid hence the reader/sensor adapter instance is created or the call fails therefore the reader/adapter instance is not created&lt;br /&gt;
&lt;br /&gt;
*createreader/{readerType}/{properties} -creates a reader/sensor configuration&lt;br /&gt;
&lt;br /&gt;
*Special characters: See how to send special characters in properties' values http://wiki.rifidi.net/index.php?title=Rifidi_App_API#Properties_with_special_characters&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;createreader&amp;quot; command like this (splitting all property key/value pairs by a semicolon):&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createreader/LLRP/IpAddress=127.0.0.1;Port=5084&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;readerID&amp;gt;LLRP_1&amp;lt;/readerID&amp;gt; Note: added in in 4.0 release&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response fail (if there is at least one non valid property, the reader is not created):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createreader/LLRP/IpAddress=127.0.0.2;Port=5084;fakeProp=1234;anotherProp=ABC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Fail&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid properties: fakeProp=1234|anotherProp=ABC&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==createreader overriding default readerID command example==&lt;br /&gt;
&lt;br /&gt;
The reader id is important for applications' read zones to appropriate operate, and this id is used to link read zones with sensors. This command enables one to set the readerId versus the system generating one (default behavior).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: To override the default reader id, there must be included the property readerID, in order to assign a specific reader id and override the default. &lt;br /&gt;
Note: The command is atomic so either all the parameters/properties in request are valid hence the reader/sensor adapter instance is created or the call fails therefore the reader/adapter instance is not created&lt;br /&gt;
&lt;br /&gt;
*createreader/{readerType}/{properties} -creates a reader/sensor configuration&lt;br /&gt;
&lt;br /&gt;
*Special characters: See how to send special characters in properties' values http://wiki.rifidi.net/index.php?title=Rifidi_App_API#Properties_with_special_characters&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;createreader&amp;quot; command like this (splitting all property key/value pairs by a semicolon):&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createreader/LLRP/IpAddress=127.0.0.1;Port=5084;readerID=myReaderID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;readerID&amp;gt;LLRP_1&amp;lt;/readerID&amp;gt; Note: added in in 4.0 release&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response fail (if there is at least one non valid property, the reader is not created):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createreader/LLRP/IpAddress=127.0.0.2;Port=5084;fakeProp=1234;anotherProp=ABC;readerID=myReaderID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Fail&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid properties: fakeProp=1234|anotherProp=ABC&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==deletereader command example (released in 3.2)==&lt;br /&gt;
&lt;br /&gt;
Note: The command is atomic so either all the parameters/properties in request are valid hence the reader/sensor adapter instance is created or the call fails therefore the reader/adapter instance is not created&lt;br /&gt;
&lt;br /&gt;
*deletereader/{readerID} -deletes a reader/sensor configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/deletereader/LLRP_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response fail (if there is at least one non valid property, the reader is not created):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/deletereader/LLRP&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Fail&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid readerID: LLRP&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==readers command example==&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;readers&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
*readers - returns a list of readers/senors managed by the Edge Server&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/readers  &lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;sensors&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;serviceID&amp;gt;Alien_1&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
      &amp;lt;sensor&amp;gt;&lt;br /&gt;
         &amp;lt;serviceID&amp;gt;Alien_2&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
      &amp;lt;/sensor&amp;gt;&lt;br /&gt;
   &amp;lt;/sensors&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==getproperties command example (to get reader properties)==&lt;br /&gt;
&lt;br /&gt;
*getproperties/{readerID} - returns the reader/sensor properties&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;getproperties&amp;quot; command like this, to get a reader properties:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/getproperties/LLRP_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;attributes&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;ReconnectionInterval&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;500&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;Port&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;5084&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;IpAddress&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;192.168.1.48&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;MaxNumConnectionAttempts&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;DisplayName&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;null&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;ReaderConfigPath&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;config/SET_READER_CONFIG.llrp&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
   &amp;lt;/attributes&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getproperties command example (to get command properties)==&lt;br /&gt;
&lt;br /&gt;
*getproperties/{commandID} - returns the command properties&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;getproperties&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/getproperties/LLRP_Configure_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;attributes&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;ROSpecID&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;AntennaIDs&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;Duration&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;1000&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;entry&amp;gt;&lt;br /&gt;
         &amp;lt;key&amp;gt;TriggerType&amp;lt;/key&amp;gt;&lt;br /&gt;
         &amp;lt;value&amp;gt;PUSH&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/entry&amp;gt;&lt;br /&gt;
   &amp;lt;/attributes&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setproperties command example (to set reader properties)==&lt;br /&gt;
&lt;br /&gt;
*setproperties/{readerID}/{properties}&amp;quot; - sets the reader/sensor properties&lt;br /&gt;
Note: if there is an existing session for updated reader properties to take effect the session will need to be deleted and recreated so the properties are moved to the session &lt;br /&gt;
&lt;br /&gt;
*Special characters: See how to send special characters in properties' values http://wiki.rifidi.net/index.php?title=Rifidi_App_API#Properties_with_special_characters&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) setproperties&amp;quot; like this (splitting all property key/value pairs by a semicolon):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/setproperties/Alien_1/MaxNumConnectionAttempts=11;DisplayName=Alien_Name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response fail (valid properties are set, ignoring not valid ones):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/setproperties/LLRP_1/IpAddress=127.0.0.15;Port=4567;att1=aa;att2=bbb;attt3=YY&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;state&amp;gt;Warning&amp;lt;/state&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid properties: att1=aa|att2=bbb|attt3=YY&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setproperties command example (to set command properties)==&lt;br /&gt;
&lt;br /&gt;
*setproperties/{commandID}/{properties}&amp;quot; - sets the command properties&lt;br /&gt;
&lt;br /&gt;
*Special characters: See how to send special characters in properties' values http://wiki.rifidi.net/index.php?title=Rifidi_App_API#Properties_with_special_characters&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) setproperties&amp;quot; like this (splitting all property key/value pairs by a semicolon):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response success&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/setproperties/LLRP_Configure_1/Duration=2130&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;response&amp;gt;&amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response fail (valid properties are set, ignoring not valid ones):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/setproperties/LLRP_Configure_1/Duration=7500;cc=4;other=67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;state&amp;gt;Warning&amp;lt;/state&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid properties: cc=4|other=67&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==commands command example==&lt;br /&gt;
&lt;br /&gt;
*commands - returns a list of available commands&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;commands&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/commands&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;commands&amp;gt;&lt;br /&gt;
      &amp;lt;command&amp;gt;&lt;br /&gt;
         &amp;lt;commandID&amp;gt;LLRP_Configure_1&amp;lt;/commandID&amp;gt;&lt;br /&gt;
         &amp;lt;factoryID&amp;gt;LLRP-Configure&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
      &amp;lt;/command&amp;gt;&lt;br /&gt;
   &amp;lt;/commands&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==createcommand example==&lt;br /&gt;
&lt;br /&gt;
Note: The command is atomic so either all the parameters/properties in request are valid hence the command instance is created or the call fails therefore the rcommand instance is not created&lt;br /&gt;
&lt;br /&gt;
*createcomamnd/{commandType}/{properties} - creates a command to be executed on a reader session&lt;br /&gt;
&lt;br /&gt;
*Special characters: See how to send special characters in properties' values http://wiki.rifidi.net/index.php?title=Rifidi_App_API#Properties_with_special_characters&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;createcommand&amp;quot; command like this (splitting all property key/value pairs by a semicolon):&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createcommand/LLRP-Configure/Duration=5000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;commandID&amp;gt;Alien_Poll_2&amp;lt;/commandID&amp;gt; Note: Added in 4.0 release&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response error (if there is at least one non valid property, the command is not created):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createcommand/LLRP-Configure/Duration=4000;propX=123;prop2=AB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Fail&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid properties: propX=123|prop2=AB&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==deletecommand command example (released in 3.2)==&lt;br /&gt;
&lt;br /&gt;
Note: The command is atomic so either all the parameters/properties in request are valid hence the reader/sensor adapter instance is created or the call fails therefore the reader/adapter instance is not created&lt;br /&gt;
&lt;br /&gt;
*deletecommand/{commandID} -deletes a reader/sensor configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/deletecommand/LLRP_Configure_1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response fail (if there is at least one non valid property, the reader is not created):&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/deletecommand/LLRP_Configure&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Fail&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Not valid commandID: LLRP_Configure&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==createsession command example==&lt;br /&gt;
&lt;br /&gt;
*createsession/{readerID} - creates a session (with corresponding reader/sensor configuration) and returns status code (such as successful)&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;createsession&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/createsession/LLRP_1&lt;br /&gt;
&lt;br /&gt;
Response: Success&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;sessionID&amp;gt;1&amp;lt;/sessionID&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Fail -already a session for sensor id&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
 &amp;lt;message&amp;gt;Fail&amp;lt;/message&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;&lt;br /&gt;
     java.lang.Exception: Reader Alien_1 already has a session.&lt;br /&gt;
   &amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsession command example==&lt;br /&gt;
&lt;br /&gt;
*startsession/{readerID}/{sessionID} - starts a session for a given reader/sensor and returns status code (such as successful)&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;startsession&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/startsession/LLRP_1/1&lt;br /&gt;
&lt;br /&gt;
Response: Success&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response: Fail&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Error&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;state&amp;gt;CONNECTING&amp;lt;/state&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Unable to start session, current state is CONNECTING  - See Rifidi Edge Sever Log for details&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==readerstatus command example==&lt;br /&gt;
&lt;br /&gt;
*readerstatus/{readerID} - retuns teh status of a given reader/sensor&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;readerstatus&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/readerstatus/LLRP_1&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;sensor&amp;gt;&lt;br /&gt;
      &amp;lt;serviceID&amp;gt;LLRP_1&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
      &amp;lt;factoryID&amp;gt;LLRP&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
   &amp;lt;/sensor&amp;gt;&lt;br /&gt;
   &amp;lt;sessions&amp;gt;&lt;br /&gt;
      &amp;lt;session&amp;gt;&lt;br /&gt;
         &amp;lt;ID&amp;gt;1&amp;lt;/ID&amp;gt;&lt;br /&gt;
         &amp;lt;status&amp;gt;PROCESSING&amp;lt;/status&amp;gt;&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;executingcommands&amp;gt;&lt;br /&gt;
            &amp;lt;executingcommand&amp;gt;&lt;br /&gt;
               &amp;lt;commandFactory&amp;gt;LLRP-Configure&amp;lt;/commandFactory&amp;gt;&lt;br /&gt;
              &amp;lt;commandID&amp;gt;LLRP_Configure_1&amp;lt;/commandID&amp;gt;&lt;br /&gt;
              &amp;lt;interval&amp;gt;0&amp;lt;/interval&amp;gt;&lt;br /&gt;
            &amp;lt;/executingcommand&amp;gt;&lt;br /&gt;
        &amp;lt;/executingcommands&amp;gt;&lt;br /&gt;
      &amp;lt;/session&amp;gt;&lt;br /&gt;
   &amp;lt;/sessions&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopsession command example==&lt;br /&gt;
&lt;br /&gt;
*stopsession/{readerID}/{sessionID} - stops a session for a given reader/sensor and returns status code (such as successful)&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;stopsession&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/stopsession/LLRP_1/1&lt;br /&gt;
&lt;br /&gt;
Response success:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Response fail:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Error&amp;lt;/message&amp;gt;&lt;br /&gt;
   &amp;lt;state&amp;gt;CREATED&amp;lt;/state&amp;gt;&lt;br /&gt;
   &amp;lt;description&amp;gt;Unable to stop session, current state is CREATED  - See Rifidi Edge Sever Log for details&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==executecommand command example==&lt;br /&gt;
&lt;br /&gt;
*executecommand/{readerID}/{sessionID}/{commandID}/{repeatInterval} - Executes a command for a given session&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;executecommand&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/executecommand/LLRP_1/1/LLRP_Configure_1/-1&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==deletesession command example==&lt;br /&gt;
&lt;br /&gt;
*deletesession/{readerID}/{sessionID} - deletes a session and returns status code (such as successful)&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;deletesession&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/deletesession/LLRP_1/1&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==save command example==&lt;br /&gt;
&lt;br /&gt;
*save - Saves the current state of the Edge Server configuration (such as created readers/sensors, modified properties etc..&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;save&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/save&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;message&amp;gt;Success&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ping - Used by failover feature==&lt;br /&gt;
*ping -  Returns a date/timestamp&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;ping&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/ping&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;timestamp&amp;gt;1414610247969&amp;lt;/timestamp&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==currenttags example (to be released in Rifidi 3.4 targeting Winter 2015==&lt;br /&gt;
*currenttags/{readerID} -  Returns a list of tags on a given reader&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;currenttags&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/currenttags/LLRP_1 &lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
   &amp;lt;currenttags&amp;gt;&lt;br /&gt;
        &amp;lt;tag&amp;gt;3088F9F16B1C87544D54DD07&amp;lt;/tag&amp;gt;&lt;br /&gt;
        &amp;lt;tag&amp;gt;30615D9FE491056264DC8A79&amp;lt;/tag&amp;gt;&lt;br /&gt;
        &amp;lt;tag&amp;gt;30E8AF452F8DD97AD0A59B9F&amp;lt;/tag&amp;gt;&lt;br /&gt;
        &amp;lt;tag&amp;gt;30A90E7816B03459349C6386&amp;lt;/tag&amp;gt;&lt;br /&gt;
   &amp;lt;/currenttags&amp;gt;&lt;br /&gt;
&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==readermetadata - Used by Web Administration Dashboard for Dynamic Reader &amp;amp; Command Properties/Wizard (released in 3.2)==&lt;br /&gt;
*readermetadata-  Returns reader metadata&lt;br /&gt;
&lt;br /&gt;
Request (via HTTP Post/Get) &amp;quot;readermetadata&amp;quot; command like this:&lt;br /&gt;
&lt;br /&gt;
http://localhost:8111/readermetadata&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;lt;response&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;&lt;br /&gt;
 &amp;lt;readers&amp;gt;&lt;br /&gt;
  &amp;lt;reader&amp;gt;&lt;br /&gt;
   &amp;lt;properties&amp;gt;&lt;br /&gt;
    &amp;lt;property&amp;gt;&lt;br /&gt;
     &amp;lt;name&amp;gt;ReconnectionInterval&amp;lt;/name&amp;gt;&lt;br /&gt;
     &amp;lt;displayName&amp;gt;Reconnection Interval&amp;lt;/displayName&amp;gt;&lt;br /&gt;
     &amp;lt;defaultvalue&amp;gt;500&amp;lt;/defaultvalue&amp;gt;&lt;br /&gt;
     &amp;lt;description&amp;gt;&lt;br /&gt;
     Upon connection failure, the time to wait between two connection attempts (ms)&lt;br /&gt;
     &amp;lt;/description&amp;gt;&lt;br /&gt;
     &amp;lt;type&amp;gt;java.lang.Integer&amp;lt;/type&amp;gt;&lt;br /&gt;
     &amp;lt;minvalue&amp;gt;0&amp;lt;/minvalue&amp;gt;&lt;br /&gt;
     &amp;lt;category&amp;gt;connection&amp;lt;/category&amp;gt;&lt;br /&gt;
     &amp;lt;writable&amp;gt;true&amp;lt;/writable&amp;gt;&lt;br /&gt;
     &amp;lt;ordervalue&amp;gt;4.0&amp;lt;/ordervalue&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
   &amp;lt;property&amp;gt;&lt;br /&gt;
     &amp;lt;name&amp;gt;Port&amp;lt;/name&amp;gt;&lt;br /&gt;
     &amp;lt;displayName&amp;gt;Port&amp;lt;/displayName&amp;gt;&lt;br /&gt;
     &amp;lt;defaultvalue&amp;gt;8090&amp;lt;/defaultvalue&amp;gt;&lt;br /&gt;
     &amp;lt;description&amp;gt;Port of the Reader&amp;lt;/description&amp;gt;&lt;br /&gt;
     &amp;lt;type&amp;gt;java.lang.Integer&amp;lt;/type&amp;gt;&lt;br /&gt;
     &amp;lt;maxvalue&amp;gt;65535&amp;lt;/maxvalue&amp;gt;&lt;br /&gt;
     &amp;lt;minvalue&amp;gt;0&amp;lt;/minvalue&amp;gt;&lt;br /&gt;
     &amp;lt;category&amp;gt;connection&amp;lt;/category&amp;gt;&lt;br /&gt;
     &amp;lt;writable&amp;gt;true&amp;lt;/writable&amp;gt;&lt;br /&gt;
     &amp;lt;ordervalue&amp;gt;1.0&amp;lt;/ordervalue&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nurban</name></author>	</entry>

	<entry>
		<id>http://wiki.rifidi.net/index.php/TagStreamerSpecification</id>
		<title>TagStreamerSpecification</title>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/TagStreamerSpecification"/>
				<updated>2015-07-28T18:37:54Z</updated>
		
		<summary type="html">&lt;p&gt;Nurban: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This document describes a possible use case for TagStreamer 2.0 for the purpose of demonstrating how it would work.  The basic idea is to define a Scenario that describes the flow of input data through processing points and BatchPattern which describe the input data in general. The processing points of the Scenario are called path items.  They consist of either a reader or a GPI Listener and a time to wait before moving on to the next path item.  It is important to note that the scenario and the data are decoupled. The BatchPattern describes the speed which data will put into the Scenario and how many tags will be generated. The Tag Generator uses that information and executes the BatchPattern one activated. &lt;br /&gt;
&lt;br /&gt;
In the below scenario, a batch item – a group of tags – moves into the entry point of the scenario by being processed by reader 1.   Reader 1 adds the tags to its antenna for a variable amount of time, between 4 and 8 seconds.  Then the tags wait for 5 seconds before moving on to the next path item.  &lt;br /&gt;
&lt;br /&gt;
The next path item is a GPI Listener that is tied to Reader 2.  Because this particular Batch Item is set to trigger GPI Listeners, the GPI Listener will toggle one of Reader 2's GPI ports.  The batch item now waits for 5 more seconds.  Now the tags in the batch are seen by reader 2's antenna for 3 seconds and then wait for anywhere between 10 and 20 seconds before moving on to Reader 3.&lt;br /&gt;
&lt;br /&gt;
Once the tags are seen by reader 3, this iteration of the scenario is over.  The TagGenerator can execute a BatchPattern more than once. This will be defined as the iteration of the BatchPattern. &lt;br /&gt;
&lt;br /&gt;
[[Image:TagStreamerSpec.png]]&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
A TagStreamer usecase consists of two main components -- the Scenario and the Input Data. Both are decoupled so that neither depends on the other part. &lt;br /&gt;
&lt;br /&gt;
# Scenario - The Scenario describes the path through which a tag batch flows.  It is made up of path items.  It also contains a variable that controls how many times the scenario is repeated.  If the variable is 0, the scenario is run infinitely.  If it is positive, it is run n times.&lt;br /&gt;
## PathItem - A path item consists of either a reader or a GPI Listener and a time to wait.&lt;br /&gt;
###Reader - An RFID reader which tags appear on&lt;br /&gt;
###GPI Listener - If a Batch Item which is set to trigger a GPI event passes through a GPI Listener, it will trigger a GPI event on the GPI Listener's reader.&lt;br /&gt;
###Time - A time is used either to describe the amount of time that a batch item should wait on a Path Item, or the amount of time a batch item should wait after being processed by the path item.  For example, in the above use case, if the tag batch moved to reader 1, it is processed by the reader  for 4-8 seconds (i.e. It is added to the reader's antenna for this amount of time).  Then it waits for 5 seconds before it proceeds to the next path item.  It can be a random amount of time with a min value and a max value. If it's not a random value both values should be equal.&lt;br /&gt;
#BatchPattern - A way to describe BathItems generated at the runtime.  Each batch items flows through the Scenario by starting at the entry point and being processed sequentially at each Path Item.&lt;br /&gt;
##BatchItem - A batch item contains a list of tags, a boolean that describes whether or not it should trigger GPI Listeners and a time value that describes the amount of time it should wait before being processed by the first path item.&lt;br /&gt;
### GPI Trigger - A boolean value that defines whether or not the asociated batch item should cause GPI Listerns to fire a GPI event.&lt;br /&gt;
### Tags - A list of RFID tags to be added to readers.  They are defined by an ID, a Generation( Gen1 or Gen2), and type (e.g. DOD-96).&lt;br /&gt;
&lt;br /&gt;
==XML==&lt;br /&gt;
===Scenario.xml===&lt;br /&gt;
This XML describes the PathItems and the way Data moves through the scenario to the various components like RFID Readers &amp;amp; GPI Listeners.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scenario id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;readerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;/readerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;gpiListenerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;gpiListenerID&amp;gt;0&amp;lt;/gpiListenerID&amp;gt;&lt;br /&gt;
        &amp;lt;/gpiListenerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;readerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;/readerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;readerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;/readerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
&amp;lt;/scenario&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Component.xml===&lt;br /&gt;
This XML describes the various components (ie RFID Readers &amp;amp; GPI Listeners) in the scenario&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;componentList id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
         &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10101&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5084&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
            &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10102&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5085&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader2&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
    &amp;lt;gpiListenerComponents id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;0&amp;lt;/port&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;signalValue&amp;gt;true&amp;lt;/signalValue&amp;gt;&lt;br /&gt;
    &amp;lt;/gpiListenerComponents&amp;gt;&lt;br /&gt;
&amp;lt;/componentList&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BatchPattern.xml===&lt;br /&gt;
The BatchPattern describes the input data generated at the runtime by the BatchGenerators. This will create BatchItems wich certain tags and flow through the scenario.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;batchPattern id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;scenario&amp;gt;3&amp;lt;/scenario&amp;gt;	&lt;br /&gt;
	&amp;lt;interation&amp;gt;250&amp;lt;/iteration&amp;gt;&lt;br /&gt;
	&amp;lt;burstNumber&amp;gt;50&amp;lt;/busrtNumber&amp;gt;&lt;br /&gt;
	&amp;lt;burstInterval&amp;gt;4000&amp;lt;/burstInterval&amp;gt;&lt;br /&gt;
        &amp;lt;isGPITrigger&amp;gt;true&amp;lt;/isGPITrigger&amp;gt;&lt;br /&gt;
	&amp;lt;tagPattern count=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;type&amp;gt;Custom&amp;lt;/type&amp;gt;&lt;br /&gt;
		&amp;lt;prefix&amp;gt;eef&amp;lt;/prefix&amp;gt;&lt;br /&gt;
		&amp;lt;gen&amp;gt;2&amp;lt;/gen&amp;gt;	&lt;br /&gt;
	&amp;lt;/tagPattern&amp;gt;&lt;br /&gt;
	&amp;lt;tagPattern count=&amp;quot;90&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;type&amp;gt;DOD&amp;lt;/type&amp;gt;&lt;br /&gt;
		&amp;lt;/prefix&amp;gt;&lt;br /&gt;
		&amp;lt;gen&amp;gt;2&amp;lt;/gen&amp;gt;&lt;br /&gt;
	&amp;lt;/tagPattern&amp;gt;&lt;br /&gt;
&amp;lt;/batchPattern&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nurban</name></author>	</entry>

	<entry>
		<id>http://wiki.rifidi.net/index.php/How_to_Contribute_to_the_Rifidi_project</id>
		<title>How to Contribute to the Rifidi project</title>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/How_to_Contribute_to_the_Rifidi_project"/>
				<updated>2015-01-30T21:46:05Z</updated>
		
		<summary type="html">&lt;p&gt;Nurban: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Rifidi Edge Server is open source. This means that if you find bugs or have ideas for useful features, you have the ability to extend the edge server yourself! We will gladly welcome contributions of any sort (code, documentation, testing, etc) and encourage you to submit these back. To get involved with the community:&lt;br /&gt;
# '''Visit''' our [http://forums.rifidi.net forums]. This is the best place to talk to our developers and users of Rifidi.&lt;br /&gt;
# '''Submit''' feature requests and bug reports. We have a [http://forums.rifidi.net bug tracking system] that manages outstanding feature requests and bugs. Before you submit bug reports here, we ask that you visit us on the forums first and make sure that there isn't a known solution for your question already&lt;br /&gt;
# '''Contribute''' to our wiki. We gladly welcome any documentation in the form of HOWTOs, example code, tutorials, or any other form that you find helpful.&lt;br /&gt;
&lt;br /&gt;
For more information, please send emails to support@transcends.co&lt;/div&gt;</summary>
		<author><name>Nurban</name></author>	</entry>

	<entry>
		<id>http://wiki.rifidi.net/index.php/Rifidi:Source_Code</id>
		<title>Rifidi:Source Code</title>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/Rifidi:Source_Code"/>
				<updated>2015-01-07T22:19:30Z</updated>
		
		<summary type="html">&lt;p&gt;Nurban: /* Organization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
This page explains how to download and run the source code for the Rifidi products.  However, please keep in mind that the code in this repository is not guaranteed to be stable. If you are interested in our latest stable release, visit our sourceforge page: http://sourceforge.net/projects/rifidi/.&lt;br /&gt;
=Quick Instructions=&lt;br /&gt;
The following are the basic steps needed to begin running Rifidi from source.  If you have trouble or need more explanation, please see the more detailed instructions on this page.&lt;br /&gt;
# Download the Eclipse for plugin developers (3.5 is what we are using)&lt;br /&gt;
# Install the subclipse plugin&lt;br /&gt;
# Add this svn to the list of repositories: emulator, prototyper - https://transcends.svn.cloudforge.com/emulator, edge, workbench - https://transcends.svn.cloudforge.com/rifidi&lt;br /&gt;
# Check out the following projects from rifidi/trunk: org.rifidi.binary, org.rifidi.emulator.target, org.rifidi.ui.ide&lt;br /&gt;
# Open up the target file in org.rifidi.emulator.target and click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
# Open up the .product file in org.rifidi.ui.ide and click &amp;quot;launch an eclipse application&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Rifidi Source Code=&lt;br /&gt;
For those who need to see the source code for the Rifidi products, you will have to check out the code from svn.  This section explains how to check out and run the code from source.&lt;br /&gt;
==Organization==&lt;br /&gt;
In general the code for Rifidi is organized into Eclipse plugins or bundles.  Eclipse handles the loading and execution of the plugins.  For more detailed information about how our source code is organized, please see [[Development and Release Process#Concepts]].&lt;br /&gt;
* '''SVN Structure''' - There are three main folders in the Rifidi directory on &amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; (the main svn repository for Rifidi).  The ''trunk'' folder contains the code that is being developed.  It is ''not'' guaranteed to be stable.  The ''tags'' folder contains tagged versions of the source for each of the plugins.  The source in these plugins should be relatively stable.  The ''branches'' folder contains plugins that have been branched so that larger changes can be made on plugins without holding up other developers.  These changes can then later be merged back in.  For more details about our SVN, see [[Development and Release Process#SVN Structure]]&lt;br /&gt;
* Target Platform - A target platform is the base set of plugins that an Eclipse application needs to run.  In order to provide a more stable environment and to ensure a clean separation between the base plugins that Rifidi needs and the base plugins that your Eclipse IDE needs, we provide a target platform for each of the Rifidi products.  You can find these in the trunk.  They will be named something like &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;.  For more information see [[Development and Release Process#Target Platforms]].&lt;br /&gt;
* org.rifidi.binary - As the source code for Rifidi gets larger it begins to get harder to maintain a stable set of plugins.  In order to simplify things, there is a folder in the svn into which stable binaries of each of the plugins used in the rifidi project will be placed.  This folder is used in conjunction with the target platform.&lt;br /&gt;
* Product File - In Eclipse, a product file is used to define the needed eclipse plugins.  Running this file will create a new Eclipse 'Run Configuration' in your IDE.  You can then tweak this run configuration as needed.&lt;br /&gt;
* Source Code Plugins - A stable binary version of each of the plugins is contained in the org.rifidi.binary folder.  However, if you wish to view the source of a particular plugin or run a plugin from source, you must download the code from either the version in the trunk or a tagged version in the tags directory.&lt;br /&gt;
&lt;br /&gt;
==Downloading the Code==&lt;br /&gt;
&lt;br /&gt;
Our code is hosted at https://transcends.svn.cloudforge.com/rifidi and https://transcends.svn.cloudforge.com/emulator.  The svn repository allows anonymous read access.  Because the svn repository is the same one that developers submit to, it contains the latest Rifidi code.&lt;br /&gt;
&lt;br /&gt;
The following steps explain how to check out and run Rifidi Emulator.  The other products in the Rifidi Suite follow similar steps.  If you need help with them, you can ask questions on IRC or our forums.&lt;br /&gt;
&lt;br /&gt;
===Prerequisites===&lt;br /&gt;
&lt;br /&gt;
The Rifidi Emulator is written in java and consists of Eclipse plugins. At this point it is easiest to compile and build it inside of the eclipse environment.  &lt;br /&gt;
&lt;br /&gt;
====Install Eclipse====&lt;br /&gt;
Note that you need the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of eclipse.  Rifidi will not run on other versions.&lt;br /&gt;
* If you do not already have eclipse, or if you have a different version, you will need to get this version&lt;br /&gt;
** Go to http://www.eclipse.org/downloads/ and download the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of Eclipse to a convenient location.&lt;br /&gt;
** Unzip the package.&lt;br /&gt;
** Double click on the execution file to get it started [[Image:Rifidi_from_source-1-opening_eclipse.png |none|thumb|800px|Double click on the executable to open up eclipse]]&lt;br /&gt;
* If you have not used eclipse before, you will be required to select a workspace when eclipse is opening.&lt;br /&gt;
** After eclipse opens go to the workbench[[Image:Rifidi_from_source-2-wokbench.png |none|thumb|800px|Open up the workbench]]&lt;br /&gt;
* If you have an existing workspace, you will need to create a new one.&lt;br /&gt;
** Go to file -&amp;gt; switch workspace -&amp;gt; other [[Image:Rifidi_from_source-3-switch_workspace.png |none|thumb|800px|Open up the workbench]] &lt;br /&gt;
** Select a new directory for your Rifidi workspace.&lt;br /&gt;
&lt;br /&gt;
====Install Subclipse====&lt;br /&gt;
&lt;br /&gt;
Subclipse is an eclipse plugin that manages svn commands.&lt;br /&gt;
&lt;br /&gt;
* Follow the instructions at http://subclipse.tigris.org/install.html.&lt;br /&gt;
* In step 6 of the above instructions, don't install the Optional Integrations.  Only the subclipse plugin is needed&lt;br /&gt;
&lt;br /&gt;
===Add Repository===&lt;br /&gt;
&lt;br /&gt;
* Open the 'SVN Repository Exploring' perspective&lt;br /&gt;
** Window -&amp;gt; Open Perspective -&amp;gt; Other [[Image:Rifidi_from_source-4-svn_rep_explore1.png |none|thumb|800px|Open up the perspective picker]]&lt;br /&gt;
** SVN Repository Exploring [[Image:Rifidi_from_source-5-svn_rep_explore2.png |none|thumb|400px|Open up the SVN Repository Explorer]]&lt;br /&gt;
* Add the rifidi repository&lt;br /&gt;
** Click 'Add SVN Repository' button&lt;br /&gt;
** Add ' https://transcends.svn.cloudforge.com/rifidi '[[Image:Rifidi_from_source-6-add_rep.png |none|400px|thumb|Add the repository]]&lt;br /&gt;
&lt;br /&gt;
===Check Out Code===&lt;br /&gt;
&lt;br /&gt;
* Check out all the projects in the rifidi/trunk folder of the repository&lt;br /&gt;
** Highlight the folders you would like to check out. For Emulator you will need&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.emulator.taget3.5.2&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt;&lt;br /&gt;
** Right click them and select checkout [[Image:Rifidi_from_source-7-checkout1.png |none|800px|thumb|Select the projects]]&lt;br /&gt;
** Select Finish. [[Image:Rifidi_from_source-8-checkout2.png |none|400px|thumb|Checkout projects]]&lt;br /&gt;
&lt;br /&gt;
===Set The Target Platform===&lt;br /&gt;
* Open up the .target file in &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;&lt;br /&gt;
* Click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Running Rifidi==&lt;br /&gt;
&lt;br /&gt;
The last step to get Rifidi running is to create a run configuration.&lt;br /&gt;
&lt;br /&gt;
A run configuration is the set of plugins that will be loaded when you run the application.  Plugins can come from one of two places:&lt;br /&gt;
#Workspace - these are the plugins that you have in the source tree on the left&lt;br /&gt;
#Target Environment - These are the plugins defined by the target environment that you are using that the time.&lt;br /&gt;
&lt;br /&gt;
Because there is a product file  for emulator defined in the &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt; plugin, the easiest way to create a new run configuration is by running the product file.  This will automatically create a new run configuration&lt;br /&gt;
&lt;br /&gt;
To Create a new Run Configuration: &lt;br /&gt;
* Switch to the Java perspective in the same way that you switched to the repository exploring view [[Image:Rifidi_from_source-9-java_view.png  |none|400px|thumb|Run Rifidi]]&lt;br /&gt;
* Right click on Rifidi.product in the org.rifidi.ui.ide project&lt;br /&gt;
* Click on &amp;quot;Run as eclipse application&amp;quot; [[Image:Rifidi_from_source-10_run_eclipse.png  |none|thumb|800px|Run Rifidi]]&lt;br /&gt;
* From now on, you can start Rifidi via the green triangle button at the top of eclipse&lt;br /&gt;
&lt;br /&gt;
If there was an error when starting the application, follow the step below to edit the run configuration:&lt;br /&gt;
&lt;br /&gt;
To Edit a Run Configuration:&lt;br /&gt;
* Run -&amp;gt; Open Run Dialog -&amp;gt; Eclipse Application -&amp;gt; Rifidi.product.  This is the run configuration.&lt;br /&gt;
* Go to the Tab Plug-ins.  The selected plugins are the ones that will be run.  Notice that there are two sections: &amp;quot;workspace&amp;quot; and &amp;quot;target platform&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Add Required Plug-ins&amp;quot; [[Image:Rifidi_from_source-11_add_plugins.png  |none|thumb|600px|Add required plugins]]&lt;br /&gt;
* check any plugins specifically required for the application to run (for example, the emulator requires the readers to be included).  Make sure that the plugin is coming from the place &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.miiny.com&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt; deals singapore&amp;lt;/span&amp;gt;] that you intended (i.e. workspace or target platform).&lt;br /&gt;
* click the Button &amp;quot;Validate Plug-ins&amp;quot; to make sure everything is set up correctly&lt;br /&gt;
* click the Button &amp;quot;Apply&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Run&amp;quot; and start the Project&lt;br /&gt;
&lt;br /&gt;
==Updating the code==&lt;br /&gt;
&lt;br /&gt;
Now that you have downloaded the code into an eclipse workspace, it is easy to get changes to the code as soon as we add them to the svn.  &lt;br /&gt;
&lt;br /&gt;
To update the code:&lt;br /&gt;
&lt;br /&gt;
* Open up the Team Synchronizing Perspective in eclipse&lt;br /&gt;
* Click the button that says &amp;quot;Synchronize&amp;quot;.&lt;br /&gt;
* Select all projects.&lt;br /&gt;
* Install any updates by selecting all the updates show, right clicking and choosing 'update'&lt;br /&gt;
&lt;br /&gt;
Now that you have the new code, just hit the green run button on the toolbar at the top (Eclipse automatically compiles the code for you, so you don't have to worry about that).&lt;br /&gt;
&lt;br /&gt;
==Switching Branches==&lt;br /&gt;
If you need to run code from another branch or tag, please see [[Switching Branches]].&lt;br /&gt;
&lt;br /&gt;
==Viewing Source and Running From Trunk==&lt;br /&gt;
By default all of the rifidi plugins you are running in eclipse are pre-compiled, binary plugins contained in the &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt; folder.  If you want to view or edit the source for a particular plugin, you will need to check out the plugin from the trunk.  Once it is checked out make sure to edit your run configuration so that the application will use the plugin from the workspace and not from the target platform. &lt;br /&gt;
&lt;br /&gt;
For example, suppose I want to view the source for the Alien reader plugin.  I need to follow the steps above to check out and run rifidi emulator.  In addition, I need to check out the &amp;lt;code&amp;gt;org.rifidi.emulator.readers.alien&amp;lt;/code&amp;gt; plugin.  This is the code for the alien reader.  In addition, I need to edit the run configuration to make sure that my workspace alien reader plugin is being used instead of the target platform alien reader plugin.&lt;br /&gt;
&lt;br /&gt;
=Reporting Bugs=&lt;br /&gt;
&lt;br /&gt;
To report bugs, please use the forum at&lt;br /&gt;
&lt;br /&gt;
 http://forums.rifidi.net&lt;br /&gt;
&lt;br /&gt;
or drop by our IRC channel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#rifidi on irc.freenode.org.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also visit us online at http://www.rifidi.net&lt;/div&gt;</summary>
		<author><name>Nurban</name></author>	</entry>

	<entry>
		<id>http://wiki.rifidi.net/index.php/Rifidi:Source_Code</id>
		<title>Rifidi:Source Code</title>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/Rifidi:Source_Code"/>
				<updated>2015-01-07T22:17:13Z</updated>
		
		<summary type="html">&lt;p&gt;Nurban: /* Organization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
This page explains how to download and run the source code for the Rifidi products.  However, please keep in mind that the code in this repository is not guaranteed to be stable. If you are interested in our latest stable release, visit our sourceforge page: http://sourceforge.net/projects/rifidi/.&lt;br /&gt;
=Quick Instructions=&lt;br /&gt;
The following are the basic steps needed to begin running Rifidi from source.  If you have trouble or need more explanation, please see the more detailed instructions on this page.&lt;br /&gt;
# Download the Eclipse for plugin developers (3.5 is what we are using)&lt;br /&gt;
# Install the subclipse plugin&lt;br /&gt;
# Add this svn to the list of repositories: emulator, prototyper - https://transcends.svn.cloudforge.com/emulator, edge, workbench - https://transcends.svn.cloudforge.com/rifidi&lt;br /&gt;
# Check out the following projects from rifidi/trunk: org.rifidi.binary, org.rifidi.emulator.target, org.rifidi.ui.ide&lt;br /&gt;
# Open up the target file in org.rifidi.emulator.target and click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
# Open up the .product file in org.rifidi.ui.ide and click &amp;quot;launch an eclipse application&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Rifidi Source Code=&lt;br /&gt;
For those who need to see the source code for the Rifidi products, you will have to check out the code from svn.  This section explains how to check out and run the code from source.&lt;br /&gt;
==Organization==&lt;br /&gt;
In general the code for Rifidi is organized into Eclipse plugins or bundles.  Eclipse handles the loading and execution of the plugins.  For more detailed information about how our source code is organized, please see [[Development and Release Process#Concepts]].&lt;br /&gt;
* '''SVN Structure''' - There are three main folders in the Rifidi directory on &amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; (the main svn repository for Rifidi).  The ''trunk'' folder contains the code that is being developed.  It is ''not'' guaranteed to be stable.  The ''tags'' folder contains tagged versions of the source for each of the plugins.  The source in these plugins should be relatively stable.  The ''branches'' folder contains plugins that have been branched so that larger changes can be made on plugins without holding up other developers.  These changes can then later be merged back in.  For more details about our SVN, see [[Development and Release Process#SVN Structure]]&lt;br /&gt;
* Target Platform - A target platform is the base set of &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.com.sg/ac_service.html &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;ac repair&amp;lt;/span&amp;gt;] plugins that an Eclipse application needs to run.  In order to provide a more stable environment and to ensure a clean separation between the base plugins that Rifidi needs and the base plugins that your Eclipse IDE needs, we provide a target platform for each of the Rifidi products.  You can find these in the trunk.  They will be named something like &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;.  For more information see [[Development and Release Process#Target Platforms]].&lt;br /&gt;
* org.rifidi.binary - As the source code for Rifidi gets larger it begins to get harder to maintain a stable set of plugins.  In order to simplify things, there is a folder in the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.com.sg/refrg_service.html&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt; refrigerator repair&amp;lt;/span&amp;gt;] svn into which stable binaries of each of the plugins used in the rifidi project will be placed.  This folder is used in conjunction with the target platform.&lt;br /&gt;
* Product File - In Eclipse, a product file is used to define the needed eclipse plugins.  Running this file will create a new Eclipse 'Run Configuration' in your IDE.  You can then tweak this run configuration as needed.&lt;br /&gt;
* Source Code Plugins - A stable binary version of each of the plugins is &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://jamumassagesingapore.com/services/dejamu/post-natal&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt; jamu postnatal massage&amp;lt;/span&amp;gt;] contained in the org.rifidi.binary folder.  However, if you wish to view the source of a particular plugin or run a plugin from source, you must download the code from either the version in the trunk or a tagged version in the tags directory.&lt;br /&gt;
&lt;br /&gt;
==Downloading the Code==&lt;br /&gt;
&lt;br /&gt;
Our code is hosted at https://transcends.svn.cloudforge.com/rifidi and https://transcends.svn.cloudforge.com/emulator.  The svn repository allows anonymous read access.  Because the svn repository is the same one that developers submit to, it contains the latest Rifidi code.&lt;br /&gt;
&lt;br /&gt;
The following steps explain how to check out and run Rifidi Emulator.  The other products in the Rifidi Suite follow similar steps.  If you need help with them, you can ask questions on IRC or our forums.&lt;br /&gt;
&lt;br /&gt;
===Prerequisites===&lt;br /&gt;
&lt;br /&gt;
The Rifidi Emulator is written in java and consists of Eclipse plugins. At this point it is easiest to compile and build it inside of the eclipse environment.  &lt;br /&gt;
&lt;br /&gt;
====Install Eclipse====&lt;br /&gt;
Note that you need the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of eclipse.  Rifidi will not run on other versions.&lt;br /&gt;
* If you do not already have eclipse, or if you have a different version, you will need to get this version&lt;br /&gt;
** Go to http://www.eclipse.org/downloads/ and download the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of Eclipse to a convenient location.&lt;br /&gt;
** Unzip the package.&lt;br /&gt;
** Double click on the execution file to get it started [[Image:Rifidi_from_source-1-opening_eclipse.png |none|thumb|800px|Double click on the executable to open up eclipse]]&lt;br /&gt;
* If you have not used eclipse before, you will be required to select a workspace when eclipse is opening.&lt;br /&gt;
** After eclipse opens go to the workbench[[Image:Rifidi_from_source-2-wokbench.png |none|thumb|800px|Open up the workbench]]&lt;br /&gt;
* If you have an existing workspace, you will need to create a new one.&lt;br /&gt;
** Go to file -&amp;gt; switch workspace -&amp;gt; other [[Image:Rifidi_from_source-3-switch_workspace.png |none|thumb|800px|Open up the workbench]] &lt;br /&gt;
** Select a new directory for your Rifidi workspace.&lt;br /&gt;
&lt;br /&gt;
====Install Subclipse====&lt;br /&gt;
&lt;br /&gt;
Subclipse is an eclipse plugin that manages svn commands.&lt;br /&gt;
&lt;br /&gt;
* Follow the instructions at http://subclipse.tigris.org/install.html.&lt;br /&gt;
* In step 6 of the above instructions, don't install the Optional Integrations.  Only the subclipse plugin is needed&lt;br /&gt;
&lt;br /&gt;
===Add Repository===&lt;br /&gt;
&lt;br /&gt;
* Open the 'SVN Repository Exploring' perspective&lt;br /&gt;
** Window -&amp;gt; Open Perspective -&amp;gt; Other [[Image:Rifidi_from_source-4-svn_rep_explore1.png |none|thumb|800px|Open up the perspective picker]]&lt;br /&gt;
** SVN Repository Exploring [[Image:Rifidi_from_source-5-svn_rep_explore2.png |none|thumb|400px|Open up the SVN Repository Explorer]]&lt;br /&gt;
* Add the rifidi repository&lt;br /&gt;
** Click 'Add SVN Repository' button&lt;br /&gt;
** Add ' https://transcends.svn.cloudforge.com/rifidi '[[Image:Rifidi_from_source-6-add_rep.png |none|400px|thumb|Add the repository]]&lt;br /&gt;
&lt;br /&gt;
===Check Out Code===&lt;br /&gt;
&lt;br /&gt;
* Check out all the projects in the rifidi/trunk folder of the repository&lt;br /&gt;
** Highlight the folders you would like to check out. For Emulator you will need&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.emulator.taget3.5.2&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt;&lt;br /&gt;
** Right click them and select checkout [[Image:Rifidi_from_source-7-checkout1.png |none|800px|thumb|Select the projects]]&lt;br /&gt;
** Select Finish. [[Image:Rifidi_from_source-8-checkout2.png |none|400px|thumb|Checkout projects]]&lt;br /&gt;
&lt;br /&gt;
===Set The Target Platform===&lt;br /&gt;
* Open up the .target file in &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;&lt;br /&gt;
* Click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Running Rifidi==&lt;br /&gt;
&lt;br /&gt;
The last step to get Rifidi running is to create a run configuration.&lt;br /&gt;
&lt;br /&gt;
A run configuration is the set of plugins that will be loaded when you run the application.  Plugins can come from one of two places:&lt;br /&gt;
#Workspace - these are the plugins that you have in the source tree on the left&lt;br /&gt;
#Target Environment - These are the plugins defined by the target environment that you are using that the time.&lt;br /&gt;
&lt;br /&gt;
Because there is a product file  for emulator defined in the &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt; plugin, the easiest way to create a new run configuration is by running the product file.  This will automatically create a new run configuration&lt;br /&gt;
&lt;br /&gt;
To Create a new Run Configuration: &lt;br /&gt;
* Switch to the Java perspective in the same way that you switched to the repository exploring view [[Image:Rifidi_from_source-9-java_view.png  |none|400px|thumb|Run Rifidi]]&lt;br /&gt;
* Right click on Rifidi.product in the org.rifidi.ui.ide project&lt;br /&gt;
* Click on &amp;quot;Run as eclipse application&amp;quot; [[Image:Rifidi_from_source-10_run_eclipse.png  |none|thumb|800px|Run Rifidi]]&lt;br /&gt;
* From now on, you can start Rifidi via the green triangle button at the top of eclipse&lt;br /&gt;
&lt;br /&gt;
If there was an error when starting the application, follow the step below to edit the run configuration:&lt;br /&gt;
&lt;br /&gt;
To Edit a Run Configuration:&lt;br /&gt;
* Run -&amp;gt; Open Run Dialog -&amp;gt; Eclipse Application -&amp;gt; Rifidi.product.  This is the run configuration.&lt;br /&gt;
* Go to the Tab Plug-ins.  The selected plugins are the ones that will be run.  Notice that there are two sections: &amp;quot;workspace&amp;quot; and &amp;quot;target platform&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Add Required Plug-ins&amp;quot; [[Image:Rifidi_from_source-11_add_plugins.png  |none|thumb|600px|Add required plugins]]&lt;br /&gt;
* check any plugins specifically required for the application to run (for example, the emulator requires the readers to be included).  Make sure that the plugin is coming from the place &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.miiny.com&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt; deals singapore&amp;lt;/span&amp;gt;] that you intended (i.e. workspace or target platform).&lt;br /&gt;
* click the Button &amp;quot;Validate Plug-ins&amp;quot; to make sure everything is set up correctly&lt;br /&gt;
* click the Button &amp;quot;Apply&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Run&amp;quot; and start the Project&lt;br /&gt;
&lt;br /&gt;
==Updating the code==&lt;br /&gt;
&lt;br /&gt;
Now that you have downloaded the code into an eclipse workspace, it is easy to get changes to the code as soon as we add them to the svn.  &lt;br /&gt;
&lt;br /&gt;
To update the code:&lt;br /&gt;
&lt;br /&gt;
* Open up the Team Synchronizing Perspective in eclipse&lt;br /&gt;
* Click the button that says &amp;quot;Synchronize&amp;quot;.&lt;br /&gt;
* Select all projects.&lt;br /&gt;
* Install any updates by selecting all the updates show, right clicking and choosing 'update'&lt;br /&gt;
&lt;br /&gt;
Now that you have the new code, just hit the green run button on the toolbar at the top (Eclipse automatically compiles the code for you, so you don't have to worry about that).&lt;br /&gt;
&lt;br /&gt;
==Switching Branches==&lt;br /&gt;
If you need to run code from another branch or tag, please see [[Switching Branches]].&lt;br /&gt;
&lt;br /&gt;
==Viewing Source and Running From Trunk==&lt;br /&gt;
By default all of the rifidi plugins you are running in eclipse are pre-compiled, binary plugins contained in the &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt; folder.  If you want to view or edit the source for a particular plugin, you will need to check out the plugin from the trunk.  Once it is checked out make sure to edit your run configuration so that the application will use the plugin from the workspace and not from the target platform. &lt;br /&gt;
&lt;br /&gt;
For example, suppose I want to view the source for the Alien reader plugin.  I need to follow the steps above to check out and run rifidi emulator.  In addition, I need to check out the &amp;lt;code&amp;gt;org.rifidi.emulator.readers.alien&amp;lt;/code&amp;gt; plugin.  This is the code for the alien reader.  In addition, I need to edit the run configuration to make sure that my workspace alien reader plugin is being used instead of the target platform alien reader plugin.&lt;br /&gt;
&lt;br /&gt;
=Reporting Bugs=&lt;br /&gt;
&lt;br /&gt;
To report bugs, please use the forum at&lt;br /&gt;
&lt;br /&gt;
 http://forums.rifidi.net&lt;br /&gt;
&lt;br /&gt;
or drop by our IRC channel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#rifidi on irc.freenode.org.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also visit us online at http://www.rifidi.net&lt;/div&gt;</summary>
		<author><name>Nurban</name></author>	</entry>

	<entry>
		<id>http://wiki.rifidi.net/index.php/Development_and_Release_Process</id>
		<title>Development and Release Process</title>
		<link rel="alternate" type="text/html" href="http://wiki.rifidi.net/index.php/Development_and_Release_Process"/>
				<updated>2015-01-07T22:08:09Z</updated>
		
		<summary type="html">&lt;p&gt;Nurban: /* About Target Platforms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document describes the development and release processes for the products in the Rifidi Suite as well as various conventions that developers should be following.  This document is intended for developers who are fairly familiar with the Rifidi code base, especially with eclipse and OSGi concepts.&lt;br /&gt;
=Goals=&lt;br /&gt;
# Standardize the development and release processes for Rifidi Developers&lt;br /&gt;
# Enable a relatively lightweight release process that is able to be extended later by a fully automatic build tool like maven&lt;br /&gt;
# Define a common set of conventions to use when checking in, checking out, and tagging code.&lt;br /&gt;
&lt;br /&gt;
This document is not intended to be a &amp;quot;how to&amp;quot; guide for eclipse, but rather to define some common operating procedures around how code is developed and released in the Rifidi project&lt;br /&gt;
&lt;br /&gt;
=Concepts=&lt;br /&gt;
==Target Platforms==&lt;br /&gt;
===About Target Platforms===&lt;br /&gt;
A target platform is the set of base plugins that your application depends on.  Normally when you build a project in eclipse that uses eclipse functionality (SWT, JFace, etc), eclipse gets that functionality from the plugins and features folder located in you eclipse installation.  Therefore it is using your eclipse base installation as your target platform.  However, it is possible to define your own target platform for the application you are building rather than relying on the default one.  Doing this is useful for several reasons&lt;br /&gt;
# It creates a separation between the plugins you use in your developing environment and the plugins used by your application.  This means that you can, for example, upgrade the eclipse you use as your IDE without upgrading the plugins used by your application.  Also, you can add plugins to your application without using them in your IDE.  For example suppose you want to use the GEF bundles in your application, but you don't want them inside your eclipse development environment.&lt;br /&gt;
# A closely related advantage is that you can limit the plugins that are available to your application.  If you use the base eclipse installation as your target platform, all of the plugins are available to your application.  This makes it easy for application developers to simply add dependencies as they like.  However, because an added dependency often means changes to other things, such as build processes, adding bundle dependencies should require some deliberation.  Having a target platform simply makes bundle dependencies more explicit.&lt;br /&gt;
# It is possible to place more than just eclipse base plugins in the custom target platform.  You can put bundles in there that you have built that are required for you application.  This means that you could put, for example, tagged, stable versions of all of the plugins in your application in your target platform.  Then when you need to modify a plugin, you can check out the source code from svn.  Because eclipse will look in your workspace before it looks in your target platform, it will find that plugin first.  This means developers only have to check out code for bundles that they want to modify, which forces him to think about the code that he wants to write.  It also means that, because the code in the target platform is tagged and stable, that if one developer checks in code with a change in it that breaks another plugin, that other developers can continue developing with the stable bundles in the target platform.&lt;br /&gt;
&lt;br /&gt;
===Target Platforms in Rifidi===&lt;br /&gt;
Each major Rifidi project in the Rifidi suite should have its own target platform.  For example, there is a target platform called &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;.  There should be a directory in the target platform called &amp;lt;code&amp;gt;rifidi&amp;lt;/code&amp;gt; where all the bundle binaries that are required for that particular project. In addition there are various target platforms used for deploying products, such as &amp;lt;code&amp;gt;org.rifidi.rcp.target&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Bundle Versioning==&lt;br /&gt;
All bundles in OSGi have version numbers, with the following form 1.2.3, where 1 is the major version, 2 is the minor version, and 3 is the point version.  The Rifidi project uses the following conventions:&lt;br /&gt;
# The '''major''' version should be increased only if there is a major API change for the bundle.  A major version change usually involve a change that would break another plugin, for example, changing a method signature. A good rule of thumb is that if bundle X depends on bundle Y and bundle X was modified as a result of the changes to bundle Y, then bundle Y had a major API change.  For example, suppose bundle Y has a method called &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt;.  Suppose bundle X, for some reason, needs to pass in a string to &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt;.  So you modify &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt; to become &amp;lt;code&amp;gt;foo(String string)&amp;lt;/code&amp;gt;.  This was a major change in bundle Y.&lt;br /&gt;
# The '''minor''' version should be increased if there is a minor API change.  A minor API change is something that would not break existing compatibility with dependent bundles.  For example, adding a method signature to a class, or adding more functionality to the bundle in the form of classes is a minor API change.  The key difference between a minor and a major API change is that a minor API change will not cause other bundles that depend on it to break.&lt;br /&gt;
# The '''point''' version should be increased for small internal changes and bug fixes.  These changes do not involve the bundle's API.&lt;br /&gt;
&lt;br /&gt;
Note that it is not necessary to change the version numbers any time you submit.  It is only necessary to modify the version numbers if the changes are relatively well tested and stable.  For example, you might want to make some changes then submit the changes back to the trunk for another developer to look at, test, or modify. ''If you don't expect &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss supplements&amp;lt;/span&amp;gt;] to make any further changes to the code, then you should modify then version number''&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
In OSGi there are two ways of specifying dependencies.  &lt;br /&gt;
#'''Require-Bundle''' should be used for dependencies to bundles that contain code which is written for the Rifidi project. Usually, this is anything that begins with &amp;lt;code&amp;gt;org.rifidi.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
#'''Import-Package''' should be used for for dependencies to bundles that do not contain code that is maintained by the Rifidi project, for example, to third party libraries such as log4j, cajo, or eclipse base plugins such as SWT or GEF.  It is also possible to find certain third party libraries that have already been made into a plugin at the eclipse [http://www.eclipse.org/orbit/overview.php eclipse orbit project].  &lt;br /&gt;
&lt;br /&gt;
The advantage to using Import-Package over Require-Bundle is that Import-Package is more flexible.  The plugin is more flexible because it could use any loaded OSGi bundle that exposes that particular plugin with the given version constraints.  In addition, because importing packages is more granular than requiring bundles, it makes the developer think a little more about the dependencies his is using.&lt;br /&gt;
&lt;br /&gt;
In both Require-Bundle and Import-Package dependencies, the minimum version ''must'' be specified.  It is also recommended that the maximum version be specified as well.  This is because it is possible for more than one bundle with the same name but different versions to be loaded by OSGi during runtime.  So if an incorrect version of a bundle is already loaded, but the bundle that requires that bundle does not specify the version it needs, bad things might happen.  &lt;br /&gt;
&lt;br /&gt;
A good way to specify versions is to have the minimum version be inclusive and the maximum version be exclusive.  For example, if the minimum version is set to 2.2.0 inclusive and the maximum version is 2.3.0 exclusive, then any version starting with 2.2 is acceptable.  This makes sense, because we have adopted a versioning scheme where the minor version number signifies a minor API change.&lt;br /&gt;
&lt;br /&gt;
==SVN Structure==&lt;br /&gt;
There are four repositories used in Rifidi:&lt;br /&gt;
* &amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; - main repository for Rifidi development&lt;br /&gt;
* &amp;lt;code&amp;gt;rep-internal&amp;lt;/code&amp;gt; - repository to hold code that is necessary, but that should not be released&lt;br /&gt;
* &amp;lt;code&amp;gt;rep-edge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt; - repository to hold projects for playing around with&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rep-edge&amp;lt;/code&amp;gt; are the main repositories for Rifidi development. They have the following structure:&lt;br /&gt;
&lt;br /&gt;
*'''org.rifidi.binary'''&lt;br /&gt;
*: A project containing all the bundles as binaries for rifidi.  It is used so that you don't have to check out the code when developing or releasing&lt;br /&gt;
* '''readme''' &lt;br /&gt;
*:a project that contains a text file that describes what all the bundles in trunk are used for&lt;br /&gt;
* '''rifidi'''&lt;br /&gt;
*: The code for the Rifidi project&lt;br /&gt;
** '''branches'''&lt;br /&gt;
*: If a developer want to add a major feature that requires alot of time, and he wants to check the code into the svn before he is ready to integrate the code back into the trunk, he can check the code into the branches directory&lt;br /&gt;
** '''tags'''&lt;br /&gt;
**: When a stable version of a bundle is reached, the code should be placed in a sub directory that has the name of the bundle's version.  See [[Development and Release Process#Tags| Tags]] for a description of when to create a new tag&lt;br /&gt;
*** '''org.rifidi.bundle.a'''&lt;br /&gt;
**** 1.0.0 - contains eclipse project&lt;br /&gt;
**** 1.1.0 - contains eclipse project&lt;br /&gt;
**** 2.0.0 - contains eclipse project&lt;br /&gt;
*** '''org.rifidi.bundle.b'''&lt;br /&gt;
**** 1.0.0 - contains eclipse project&lt;br /&gt;
** '''trunk'''&lt;br /&gt;
**: The trunk contains the latest code for each bundle.  It might be unstable.  All changes to code should be made to the bundles located in the trunk&lt;br /&gt;
*** org.rifidi.bundle.a - contains eclipse project&lt;br /&gt;
*** org.rifidi.bundle.b - contains eclipse project&lt;br /&gt;
&lt;br /&gt;
==Tags==&lt;br /&gt;
The purpose of tagging a bundle is to save the code at a stable point so that future changes can be reversed if they introduce a bug that older versions did not have.  A new tag ''must'' be created in svn when either the major or the minor version number of the plugin is incremented.  It is not required to create a new tag when the point version number is incremented, but it is ok to do so.&lt;br /&gt;
&lt;br /&gt;
==Product File==&lt;br /&gt;
A product file defines the required plugins for a particular project.  It is used to build the project.  It is important to keep this file updated as new plugins are added or old ones are removed.&lt;br /&gt;
&lt;br /&gt;
=Processes=&lt;br /&gt;
This section defines a few procedures that should be followed when developing code for the Rifidi project&lt;br /&gt;
==Setting up a development environment==&lt;br /&gt;
# Download the target platform for the project you are working with.  For example, if you are developing a plugin for emulator, you would download the target platform for emulator&lt;br /&gt;
# Download &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
# Download any bundles that you need to modify.  For example, if you are making changes to the alien reader, download &amp;lt;code&amp;gt;org.rifidi.emulator.reader.alien&amp;lt;/code&amp;gt;&lt;br /&gt;
# Set the target platform as the target platform for the workspace&lt;br /&gt;
# Clean the workspace&lt;br /&gt;
&lt;br /&gt;
==Modifying an Existing Bundle==&lt;br /&gt;
Suppose you have modified an existing bundle and the changes are relatively stable and tested, and you are ready to integrate them back in with the rest of the project.&lt;br /&gt;
&lt;br /&gt;
# If the changes you have made require a version change make sure that is done&lt;br /&gt;
# If you had to change the major or the minor version number, create a new svn tag for the plugin.&lt;br /&gt;
# Export the bundle as a binary bundle using the export wizard on the Manifest.MF file for the plugin&lt;br /&gt;
# Add the bundle to &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
# Submit bundle changes and target platform changes back to trunk.&lt;br /&gt;
&lt;br /&gt;
If you have made changes to a bundle but are not ready to integrate them back with the rest of the project, you can do one of two things:&lt;br /&gt;
# Submit them back to the trunk, but don't change the version numbers.  This is ok to do because everyone else should be using tagged stable bundles in the target platform.&lt;br /&gt;
# Create a folder in the branches directory and put it there.  Only do this if multiple developers are modifying the same plugin at the same time.&lt;br /&gt;
&lt;br /&gt;
==Creating a new Bundle==&lt;br /&gt;
To create a new bundle called &amp;lt;code&amp;gt;org.rifidi.xyz&amp;lt;/code&amp;gt;:&lt;br /&gt;
# Create a new plugin project with the name &amp;lt;code&amp;gt;org.rifidi.xyz&amp;lt;/code&amp;gt;&lt;br /&gt;
# In the Manifest.MF file&lt;br /&gt;
## Add 'Pramari, LLC' as the provider&lt;br /&gt;
## Give the bundle a name such as 'Rifidi xyz'.  It is important that the first word is 'Rifidi' so that all bundles created as a part of the Rifidi project are easy to locate when there are alot of bundles installed as part of an eclipse installation.&lt;br /&gt;
# Write the code for the plugin&lt;br /&gt;
# Follow the steps for [[Development and Release Process#Modifying and Existing Bundle| Modifying and Existing Bundle]]&lt;br /&gt;
# If you tagged the bundle and added it to the target platform, then make sure you add the new bundle and its dependencies to the product file&lt;br /&gt;
# Add an entry to the readme project at the top level of the svn&lt;br /&gt;
&lt;br /&gt;
==Releasing a Product==&lt;br /&gt;
# Download the rifidi build target platform and set it as the target platform for your workspace&lt;br /&gt;
# Download the project that contains the product file for the project you are trying to build&lt;br /&gt;
# Export the project using the export wizard&lt;/div&gt;</summary>
		<author><name>Nurban</name></author>	</entry>

	</feed>