<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.transcends.co/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.transcends.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Redfern3141</id>
		<title>RifidiWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.transcends.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Redfern3141"/>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Special:Contributions/Redfern3141"/>
		<updated>2026-04-19T09:20:11Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.1</generator>

	<entry>
		<id>https://wiki.transcends.co/index.php/Talk:Cloud_Jumpstart</id>
		<title>Talk:Cloud Jumpstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Talk:Cloud_Jumpstart"/>
				<updated>2014-07-01T17:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Forgot to sign post.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Question: The content of this page suggests that the example uses Amazon SimpleDB, yet the code sample at the bottom of the page and in the SVN repo uses DynamoDB. Is that intentional, or just a mismatch? [[User:Redfern3141|Redfern3141]] ([[User talk:Redfern3141|talk]]) 10:43, 1 July 2014 (MST)&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Talk:Cloud_Jumpstart</id>
		<title>Talk:Cloud Jumpstart</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Talk:Cloud_Jumpstart"/>
				<updated>2014-07-01T17:41:57Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Created page with &amp;quot;Question: The content of this page suggests that the example uses Amazon SimpleDB, yet the code sample at the bottom of the page and in the SVN repo uses DynamoDB. Is that int...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Question: The content of this page suggests that the example uses Amazon SimpleDB, yet the code sample at the bottom of the page and in the SVN repo uses DynamoDB. Is that intentional, or just a mismatch?&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Alien_Autonomous_Edge_Server_Guide</id>
		<title>Alien Autonomous Edge Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Alien_Autonomous_Edge_Server_Guide"/>
				<updated>2014-06-30T22:13:05Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5879 by StevenCollins (talk) - Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Getting started==&lt;br /&gt;
&lt;br /&gt;
This guide will help you quickly get an Alien reader up and reading tags on Rifidi Edge.  The supported Alien readers are the 9800, the 9900, the 8800, and the 9600.  Other versions haven't been tested, but may still work.  &lt;br /&gt;
&lt;br /&gt;
*Start the edge server and the edge client.  Connect the client to the server.  &lt;br /&gt;
*Right click on the 'Edge Server' icon in the 'Edge Server View' and select 'New Reader'.&lt;br /&gt;
*Select 'Alien' from the drop-down and click 'Next'.  &lt;br /&gt;
*Type in the IP and port of the reader you wish to in their respective boxes.  If you are using an emulated Alien, you can check this in the emulator itself.  If you are connecting to a physical reader, you might need to use the discovery tool in the Alien software to find out what the IP and port are if you don't know them offhand.  &lt;br /&gt;
*Set the username and password of the reader.  The default is 'alien' and 'password', respectively.  &lt;br /&gt;
*Select the reconnect interval (in milliseconds).  If you want the Edge Server to keep trying to connect if the reader loses connection while running or if it can't connect to start with, you can set this value to what you want (in milliseconds).  If you are unsure, you can just leave it at the default 500.  &lt;br /&gt;
*Select the maximum number of times the server will try to connect to an unresponsive reader.  -1 means it will keep going until it gets a connection.  To turn this feature off, set it to 0.  &lt;br /&gt;
&lt;br /&gt;
==Setting up an Alien Autonomous server==&lt;br /&gt;
&lt;br /&gt;
To read Autonomously, the Alien requires an autonomous server be set up.  If you are unsure of how the Alien Autonomous mode works, consult the Alien documentation.  &lt;br /&gt;
&lt;br /&gt;
*Right click on the 'Edge Server' icon in the 'Edge Server View' and select 'New Reader'.  &lt;br /&gt;
*Select 'Alien Autonomous' from the drop-down and click 'Next'.  &lt;br /&gt;
*Type in the name you want the reader to show up as on the window, the number of readers you want to be able to connect to the autonomous server concurrently, and set up the port you want the server to listen on on the local machine, then press 'Finish'.&lt;br /&gt;
&lt;br /&gt;
==Reading Tags==&lt;br /&gt;
&lt;br /&gt;
Now that the reader is set up, its time to actually connect to it and read some tags.  &lt;br /&gt;
&lt;br /&gt;
*First, click on the reader icon that has appeared under the 'Edge Server'.  It probably looks something like 'Alien_1'.  Now look at the 'properties' tab at the bottom.  There are many properties here, some of which can be adjusted.  If you wish to adjust a property, type in the new value you want, press 'enter', then right click on the reader and select 'Commit Property Changes'.  If you wish to learn more about a specific property, consult the Alien documentation.  &lt;br /&gt;
*Right click the reader and press 'create session'.  If the IP is correct and the reader is turned on, the session should go to 'green'.  If something is wrong, it will stay yellow or go back to red.  Check and make sure the IP and port are correct and the reader is turned on if you have trouble connecting.  &lt;br /&gt;
*Now go to the bottom left window, the 'Command View'.  Right click on the 'Alien-Push-Start' folder and click 'create command template'.  &lt;br /&gt;
*Click on the command you just created, and set the options you wish in the same way you set the reader properties (just with the command instead).  You will need to set the AutoStopTimer value (check the Alien documentation if you wish to know more on how the Autonomous mode works), and you will also have to set the IP and port of the machine the autonomous listener server you created is on.  &lt;br /&gt;
*Now right click on the session you created under the reader and press 'submit job'.  Select the 'Alien-Push-Start' job you created, select 'One Time Execution', and press 'Finish'.  &lt;br /&gt;
*Congratulations!  You are now reading tags from an Alien reader.&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Alien_Example_Client</id>
		<title>Alien Example Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Alien_Example_Client"/>
				<updated>2014-06-30T22:12:37Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can see a list of possible alien commands by sending the 'help' command to the alien reader.  However, not all of these commands are implemented in rifidi.  See this [[Alien_9800#Supported Commands | List of supported commands]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  AlienExampleClient.java&lt;br /&gt;
 *&lt;br /&gt;
 *  Created:	Dec 6, 2007&lt;br /&gt;
 *  Project:	RiFidi Emulator - A Software Simulation Tool for RFID Devices&lt;br /&gt;
 *  				http://www.rifidi.org&lt;br /&gt;
 *  				http://rifidi.sourceforge.net&lt;br /&gt;
 *  Copyright:	Pramari LLC and the Rifidi Project&lt;br /&gt;
 *  License:	Lesser GNU Public License (LGPL)&lt;br /&gt;
 *  				http://www.opensource.org/licenses/lgpl-license.html&lt;br /&gt;
 *  Author:    Kyle Neumeier - kyle@pramari.com&lt;br /&gt;
 */&lt;br /&gt;
package sandbox;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This class shows how to create a program to talk to the alien reader.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Kyle Neumeier - kyle@pramari.com&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class AlienExampleClient {&lt;br /&gt;
&lt;br /&gt;
	public static final String IP_ADDRESS = new String(&amp;quot;127.0.0.1&amp;quot;);&lt;br /&gt;
	public static final int READER_PORT = 20000;&lt;br /&gt;
	private static Socket connection = null;&lt;br /&gt;
&lt;br /&gt;
	private static PrintWriter out = null;&lt;br /&gt;
	private static BufferedReader in = null;&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Initialize the connection and send username/password&lt;br /&gt;
	 * @throws IOException&lt;br /&gt;
	 * @throws InterruptedException&lt;br /&gt;
	 */&lt;br /&gt;
	private void  init() throws IOException, InterruptedException{&lt;br /&gt;
		connection = new Socket(&amp;quot;127.0.0.1&amp;quot;, READER_PORT);&lt;br /&gt;
&lt;br /&gt;
		in = new BufferedReader(new InputStreamReader(connection&lt;br /&gt;
				.getInputStream()));&lt;br /&gt;
		out = new PrintWriter(connection.getOutputStream());&lt;br /&gt;
&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
		System.out.println(readFromReader(in));&lt;br /&gt;
		out.write(&amp;quot;alien\n&amp;quot;);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		System.out.println(readFromReader(in));&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
		out.write(&amp;quot;password\n&amp;quot;);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		System.out.println(readFromReader(in));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Tear down the connection&lt;br /&gt;
	 * @throws IOException&lt;br /&gt;
	 */&lt;br /&gt;
	private void tearDown() throws IOException{&lt;br /&gt;
		out.write(&amp;quot;q&amp;quot;);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		connection.close();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Get tags back from the alien reader&lt;br /&gt;
	 * @return&lt;br /&gt;
	 * @throws IOException&lt;br /&gt;
	 */&lt;br /&gt;
	private String getTags() throws IOException{&lt;br /&gt;
		String command = &amp;quot;t&amp;quot;;&lt;br /&gt;
		out.write(command + &amp;quot;\n&amp;quot;);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		String returnVal = readFromReader(in);&lt;br /&gt;
		return returnVal;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * @param args&lt;br /&gt;
	 * @throws InterruptedException &lt;br /&gt;
	 * @throws IOException &lt;br /&gt;
	 */&lt;br /&gt;
	public static void main(String[] args) throws IOException, InterruptedException {&lt;br /&gt;
		AlienExampleClient client = new AlienExampleClient();&lt;br /&gt;
		client.init();&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
		String tags = client.getTags();&lt;br /&gt;
		System.out.println(tags);&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
		client.tearDown();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Read responses from the socket&lt;br /&gt;
	 * @param inBuf&lt;br /&gt;
	 * @return&lt;br /&gt;
	 * @throws IOException&lt;br /&gt;
	 */&lt;br /&gt;
	public static String readFromReader(BufferedReader inBuf) throws IOException{&lt;br /&gt;
		StringBuffer buf=new StringBuffer();&lt;br /&gt;
		int ch=inBuf.read();&lt;br /&gt;
		while((char)ch!='\0'){&lt;br /&gt;
			buf.append((char)ch);&lt;br /&gt;
			ch=inBuf.read();&lt;br /&gt;
		}&lt;br /&gt;
		return buf.toString();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/AWID_Edge_Server_Guide</id>
		<title>AWID Edge Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/AWID_Edge_Server_Guide"/>
				<updated>2014-06-30T22:11:23Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5882 by StevenCollins (talk) - Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Getting started==&lt;br /&gt;
&lt;br /&gt;
This guide will help you quickly get an Alien reader up and reading tags on Rifidi Edge.  The supported Alien readers are the 9800, the 9900, the 8800, and the 9600.  Other versions haven't been tested, but may still work.  &lt;br /&gt;
&lt;br /&gt;
*Start the edge server and the edge client.  Connect the client to the server.  &lt;br /&gt;
*Right click on the 'Edge Server' icon in the 'Edge Server View' and select 'New Reader'.&lt;br /&gt;
*Select 'AWID MPR-2010' if you want to connect to a 2010 and 'AWID MPR-3014' if you want to connect to a 3014 and click 'Next'.  &lt;br /&gt;
*Type in the IP and port of the reader you wish to in their respective boxes.  If you are using an emulated Awid, you can check this in the emulator itself.  If you are connecting to a physical reader, you might need to use the discovery tool in the Awid software to find out what the IP and port are if you don't know them offhand.   &lt;br /&gt;
*Select the reconnect interval (in milliseconds).  If you want the Edge Server to keep trying to connect if the reader loses connection while running or if it can't connect to start with, you can set this value to what you want (in milliseconds).  If you are unsure, you can just leave it at the default 500.  &lt;br /&gt;
*Select the maximum number of times the server will try to connect to an unresponsive reader.  -1 means it will keep going until it gets a connection.  To turn this feature off, set it to 0.  &lt;br /&gt;
&lt;br /&gt;
==Reading Tags==&lt;br /&gt;
&lt;br /&gt;
Now that the reader is set up, its time to actually connect to it and read some tags.  &lt;br /&gt;
&lt;br /&gt;
*First, click on the reader icon that has appeared under the 'Edge Server'.  It probably looks something like 'Awid_1'.  &lt;br /&gt;
*Right click the reader and press 'create session'.  If the IP is correct and the reader is turned on, the session should go to 'green'.  If something is wrong, it will stay yellow or go back to red.  Check and make sure the IP and port are correct and the reader is turned on if you have trouble connecting.  &lt;br /&gt;
*Now go to the bottom left window, the 'Command View'.  Find the correct folder for the reader you selected and right click on the 'Awidxxxx-Push-Start' command and select 'create command template'.  &lt;br /&gt;
*Now right click on the session you created under the reader and press 'submit job'.  Select the 'Awidxxxx-Push-Start' job you created, select 'One time Execution'.    &lt;br /&gt;
*Press 'Finish'.  Congratulations!  You are now reading tags from an Awid reader.  The reader will keep reading tags until you tell it to stop by sending an 'Awidxxxx-Push-Stop' command.&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Awid_MPR</id>
		<title>Awid MPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Awid_MPR"/>
				<updated>2014-06-30T22:11:07Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5883 by StevenCollins (talk) - Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The Awid MPR 2010 is produced by Applied Wireless ID.  It is a simple serial-based reader that can read Gen 1 and Gen 2 tags.  &lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
:MPR 2010&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
:Serial&lt;br /&gt;
;Communication:   &lt;br /&gt;
:RS-232&lt;br /&gt;
;Antennas:&lt;br /&gt;
:1 built-in Antenna, 1 extra port&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
: None&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The virtual reader is based off of the PDF &lt;br /&gt;
===Client Tools===&lt;br /&gt;
The main client tools used for testing this program:&lt;br /&gt;
;Awid Tool&lt;br /&gt;
:The Awid Tool is a client program that ships with the reader.  It is the easiest tool to connect with the reader, &lt;br /&gt;
;Others&lt;br /&gt;
:You can use other tools if you wish, such as the BEA tool, but for any tool that normally connects through TCP-IP, you will need to use a TCP to Serial bridge program.  As of right now we have no support for any of these tools from Rifidi, although if you can configure them correctly they should work.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
===Serial Port Emulation===&lt;br /&gt;
&lt;br /&gt;
This guide was written assuming you are connecting on a Windows XP machine.  It may work for other operating systems, but that is not guaranteed.  &lt;br /&gt;
&lt;br /&gt;
To get started with the AWID reader, first download and install Rifidi Emulator.  Then download and install com0com, a serial-port emulation tool that will allow you to connect with and read tags from any readers you create.  In the install options for com0com, uncheck the option where it automatically installs serial ports CNCA and CNCB.  While not necessary, doing this will make the creation and maintenance of virtual serial ports less confusing.  &lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/com0com/files/&lt;br /&gt;
&lt;br /&gt;
For a more advanced use of com0com, type 'help' into the command prompt and/or check their documentation.  However, for this example we will only create 2 serial ports and link them together.  &lt;br /&gt;
&lt;br /&gt;
To do this, open the command prompt with the &amp;quot;Setup command prompt&amp;quot; option in the start menu.  Then create 2 linked serial ports by typing in &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;install PortName=COM6 PortName=COM7&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can chose any numbers you wish for your ports instead of 6 and 7, however if your computer already has serial ports some numbers may be taken.  For instance, if your computer has 2 serial ports, COM1 and COM2 are probably physical ports in the system, and those ports will not be available.  &lt;br /&gt;
&lt;br /&gt;
After you create the ports, windows will let you know that new hardware has been found (twice, one for each port).  Let it connect to the internet and automatically install any software it needs, then to back to the command prompt and type &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
into the prompt.  The ports you created should show up in the list, in which case you are ready to create virtual AWID readers, You can now close the command prompt, unless you want to create more virtual ports.  &lt;br /&gt;
&lt;br /&gt;
You should only need to create the ports with com0com once, they will persist indefinitely.  &lt;br /&gt;
&lt;br /&gt;
===Creating an AWID===&lt;br /&gt;
Now that you are done creating the serial ports, it is time to create an AWID reader.  Start up Emulator, click on the '+' sign next to the &amp;quot;ReaderView&amp;quot; tab in the top left, and select &amp;quot;AWIDMPR&amp;quot; from the given list.  Press next, give the reader a name, and type in the name of one of the COM ports you created before.  If you selected COM6 and COM7 for instance, type in one of those.  Click finish, and the reader should create successfully.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Awid1.png]]&lt;br /&gt;
&lt;br /&gt;
Now, right click on the reader you have created (the icon in the top left), and click &amp;quot;Start&amp;quot;.  The reader should now show as &amp;quot;running&amp;quot;.  Press the &amp;quot;+&amp;quot; button next to the TagsView, and create several GEN2 tags with whatever data type you wish.  Select and drag those tags onto the AWID antenna in the middle, and the reader is now ready.&lt;br /&gt;
&lt;br /&gt;
[[Image:Awid3.png]]&lt;br /&gt;
&lt;br /&gt;
===Testing the AWID===&lt;br /&gt;
Turn on your MPR Demo software (or whatever you want to use to connect with the AWID), and select the &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;opposite&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; port that you picked to create the AWID on from the ports you created.  For example, if you created ports 6 and 7, and you created the AWID with port 6, select COM7 in the MPR Demo.  Click connect, and they should connect successfully!  If they don't, check to make sure it says &amp;quot;running&amp;quot; next to the reader's icon.  &lt;br /&gt;
&lt;br /&gt;
[[Image:Awid4.png]]&lt;br /&gt;
&lt;br /&gt;
If you connected successfully, you should see red and green output in the console view of the reader.  The red represents commands coming in, and the green represents outgoing data.  After this, you are free to read tags!  Click on 'Command', go to 'Read single tag ID', and select 'EPC C1 GEN2'.  You should see green output on the console of the tags going back to the MPR demo.&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Documentation_Guidelines</id>
		<title>Documentation Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Documentation_Guidelines"/>
				<updated>2014-06-30T22:10:44Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5884 by StevenCollins (talk) - Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[category:wiki]][[category:help]]&lt;br /&gt;
=Contributing to the Wiki=&lt;br /&gt;
As an open source project, Rifidi welcomes contributions of any kinds from its user community.  If you would like to contribute to the wiki, you will need to first register and then log in using the links at the top right hand corner of the page.  If you have not edited wikis, before, it may be helpful to visit some of the links that we have provided on our wiki home page.&lt;br /&gt;
&lt;br /&gt;
=Structure of the Rifidi Wiki=&lt;br /&gt;
In order to keep the wiki somewhat structured, information should be attempted to put into one of several categories.  Try to use the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:]]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt; at the top of pages so that things are easier to find.  The basic structure of the wiki is as follows:&lt;br /&gt;
&lt;br /&gt;
*'''User documentation''' - This docuemtation describes how to obtain and run Rifidi.  Please use the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:userDoc]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt; at the top of any page in this category&lt;br /&gt;
*'''Developer documentation''' - This documentation should be used for anything that is helpful for developers, including but not limited to, how to get the source, how to compile, architecture diagrams, and implementation documents.  Please tag pages in this category with &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:developerDoc]]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt;&lt;br /&gt;
**'''Emulator documentation''' - This category if for developer documentation that describes the emulator  Please tag it with &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:developerDoc]][[category:emulatorDoc]]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt;&lt;br /&gt;
**'''Designer documentation''' - This category if for developer documentation that describes the Designer tool  Please tag it with &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:developerDoc]][[category:designerDoc]]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt;&lt;br /&gt;
*'''Idea Box''' - The idea box is for any random thoughts that do not fit in to any other category well.  Tag with &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:ideaBox]]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt;&lt;br /&gt;
*'''Wiki''' Help - Any useful information for newbies on how to edit the wiki.  Tag with &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:wiki]]&amp;lt;/nowiki&amp;gt;]&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that pages can fall into several categories, such as this page, which is both a developer doc and a wiki help page.  Use your best judgment, but in the end it is better to make the information available rather than worrying too much about the structure.&lt;br /&gt;
&lt;br /&gt;
=Categories in the Rifidi Wiki=&lt;br /&gt;
* '''&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:userDoc]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
This category should be used for anything that is helpful for users.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:developerDoc]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
This category should be used for anything that is helpful for developers.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:developerDoc]][[category:emulatorDoc]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
This category if for developer documentation that describes the emulator&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:developerDoc]][[category:designerDoc]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
This category if for developer documentation that describes the Designer tool.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:ideaBox]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
This category is for any random thoughts that do not fit in to any other category well.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[category:help]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
This category is for everything helpful to new Users starting with the Rifidi Wiki.&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Edge_Server_Architecture</id>
		<title>Edge Server Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Edge_Server_Architecture"/>
				<updated>2014-06-30T22:10:00Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5885 by StevenCollins (talk) - Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes several aspects of the Rifidi Edge Server Core.  It is intended for developers to understand how the core is structured.&lt;br /&gt;
=Overview=&lt;br /&gt;
There are two main aspects to understanding the edge server. The first is the three architectural layers that facilitate the flow of data from sensor to a designated endpoint.  The second is the runtime and how it uses service oriented architecture and OSGi to be dynamic and light weight.&lt;br /&gt;
==Layers==&lt;br /&gt;
This section shows the three conceptual architectural layers that data passes through on its journey from sensors to whatever endpoint the user chooses. &lt;br /&gt;
&lt;br /&gt;
[[Image:Dataflow3.png|thumbnail|400px|Dataflow through the three Architectural layers in the Rifidi Edge Server]]&lt;br /&gt;
&lt;br /&gt;
===Sensor Abstraction Layer===&lt;br /&gt;
The purpose of the edge server is to connect to any kind of sensors (e.g. RFID readers, Barcode readers, Mobile Devices) and collect information from them.  In many scenarios, this consists of connecting to a Gen2 fixed reader (such as Alien 9800, Motorolla LLRP, etc), and collecting EPC information. However, the edge server is designed in a way so that the edge server to collect many kinds of data (active, passive, etc) from many kinds of devices. This layer allows users to connect to devices in a sensor-agnostic way to collect the kind of data required for the application.&lt;br /&gt;
&lt;br /&gt;
===Application Engine Layer===&lt;br /&gt;
For most applications it is not desirable to save every event that the sensors produce.  Many sensors can send 1,000 of events a second, a large number of which might be duplicates. Most applications are interested in events that are one-level higher than the raw events produced by sensors.  For examples, an ERP system is probably interested in the event of a box arriving in area 1, and it is not desirable for the ERP system to do the work of filtering and processing all of duplicate reads the sensor produces.&lt;br /&gt;
&lt;br /&gt;
Complex Event Processing (CEP) is a paradigm of viewing data as ephemeral events (an event stream) and identifying meaningful (i.e. business) events from the stream using rules.  Rifidi Edge Server uses a Complex Event Processor called Esper.  It allows you to write queries using an SQL-like syntax:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    select * from ReadCycle where ReaderID='gate_1'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One of the most important aspects of CEP is being able to use incorporate temporal knowledge into the queries.  This allows you to phrase queries like &amp;quot;Send an order_complete event when an itemA event is followed by an itemb event&amp;quot; or &amp;quot;send an order_cancelled event when an itemb event is not seen within 10 min of a itemA event.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Application Engine Layer is intended to let application developers build much of the functionality of their RFID applications using esper queries.&lt;br /&gt;
&lt;br /&gt;
===Communication Layer===&lt;br /&gt;
After data has been processed, it probably needs to be handed up to some kind of application-dependent system.  For example, some users might want the data to be stored in an &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.sg/&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; massage therapy singapore&amp;lt;/span&amp;gt;] database, others might want it to be pushed into an ERP system like SAP or handed to a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.inleds.com/products/?cid=2&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; led downlight singapore&amp;lt;/span&amp;gt;] Rich User Interface of some sort.  The edge server has several built in connectors to use, namely JMS and Web Services (via Spring's remoting framework).  However, as this is application dependant, it is possible to write your own connector (such as a TCP/IP socket connection) if the application needs it.&lt;br /&gt;
&lt;br /&gt;
In addition, the edge server also provides a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.inleds.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; singapore led lighting&amp;lt;/span&amp;gt;] built-in web container and MVC framework so that web applications can be deployed directly.&lt;br /&gt;
&lt;br /&gt;
==OSGi==&lt;br /&gt;
OSGi is a dynamic modules system for Java.  It provides several pieces of functionality including the following:&lt;br /&gt;
# A deployment unit (called a bundle), which is a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.premier-football.net&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; soccer jersey store&amp;lt;/span&amp;gt;] normal JAR with some extra information in the Manifest.&lt;br /&gt;
# A lightweight runtime that allows bundle lifecycle to be controlled.  In other words, you can start, stop, and update bundles at &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://thepartyhub.com/Showcase&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; party artists&amp;lt;/span&amp;gt;] runtime.&lt;br /&gt;
# Dependencies are explicitly stated in the Manifest either as &amp;quot;bundle dependencies&amp;quot; or &amp;quot;package dependencies&amp;quot;.&lt;br /&gt;
# Classes are only visible to other bundles if their containing packages have been exposed.  This allows developers to hide classes that should be strictly internal.&lt;br /&gt;
# The runtime provides a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://thepartyhub.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; event planners singapore&amp;lt;/span&amp;gt;] service registry -- a system-wide repository for bundles to provide functionality.&lt;br /&gt;
&lt;br /&gt;
The edge server is simply a collection of bundles that run in an OSGi environment (Equinox). Functionality between bundles is shared by means of services that are available in the service registry. Because bundles can be started and stopped while the rest of the server is still running, we can update non-essential parts of the edge server without restarting it.&lt;br /&gt;
&lt;br /&gt;
=Services=&lt;br /&gt;
In the Edge Server, services are POJOs that provide a specific piece of functionality to other components and are registered in the OSGi Registry.   For more information see [[How to use OSGi Services]]&lt;br /&gt;
== Core Services==&lt;br /&gt;
The following services are provided by the core bundle.&lt;br /&gt;
===Reader Data Access Object===&lt;br /&gt;
'''Purpose''': Provide access to sensor configurations that have been created.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.daos.ReaderDAO&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractSensor&amp;gt; getReaders()&amp;lt;/tt&amp;gt; Get all available sensor configurations&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractSensor getReaderByID(String ID)&amp;lt;/tt&amp;gt; - Get the sensor with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractSensorFactory&amp;gt; getReaderFactories()&amp;lt;/tt&amp;gt; - Get all registered sensor factories&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractSensorFactory getReaderFactoryByID()&amp;lt;/tt&amp;gt; - Get the sensor factory with the supplied ID&lt;br /&gt;
===Command Data Access Object===&lt;br /&gt;
'''Purpose''': Provide access to command configurations that have been created.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.daos.CommandDAO&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractCommandConfiguration&amp;gt; getCommands()&amp;lt;/tt&amp;gt; Get all available command configurations&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfiguration getCommandByID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractCommandConfigurationFactory&amp;gt; getCommandFactories()&amp;lt;/tt&amp;gt; - Get all registered command configuration factories&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfigurationFactory getCommandFactoryByID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration factory with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfigurationFactory getCommandFactoryByReaderID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration factory with the supplied sensor ID&lt;br /&gt;
&lt;br /&gt;
===Configuration Service===&lt;br /&gt;
'''Purpose''': Provide a way to save and load configurations from persistence.  Configurations (such as Sensor Configurations or Command Configurations) are created using a factory (that must be registered). Configurations have Attributes which can be changed via getters and setters.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.configuration.services.ConfigurationService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void storeConfiguration()&amp;lt;/tt&amp;gt; - Store all configurations to persistence (i.e. xml file, database, etc).&lt;br /&gt;
*&amp;lt;tt&amp;gt;Configuration getConfiguration(String serviceID)&amp;lt;/tt&amp;gt; - Get a configuration (i.e. Sensor Configuration or Command Configuration)by service ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createService(String factoryID, AttributeList attributes)&amp;lt;/tt&amp;gt; - Create a new configuration using a factory with the supplied ID.  Use the supplied AttributeList to override defaults.&lt;br /&gt;
*&amp;lt;tt&amp;gt;void destroyService(String serviceID)&amp;lt;/tt&amp;gt; - Destroy a service with the supplied ID&lt;br /&gt;
*&amp;lt;tt&amp;gt;Set&amp;lt;Configuration&amp;gt; getConfigurations()&amp;lt;/tt&amp;gt; - Return all Configurations.&lt;br /&gt;
&lt;br /&gt;
===Sensor Management Service===&lt;br /&gt;
'''Purpose''': Since there is a concept of &amp;quot;Logical Sensors&amp;quot;, it is possible to define a sensor that is a collection of physical sensors. This service allows sensors to be created, destroyed, grouped as part of a logical sensor, and subscribed to&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.sensors.management.SensorManagementService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createSensor(String sensorName)&amp;lt;/tt&amp;gt; - Create a new sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;void destroySensor(String sensorName)&amp;lt;/tt&amp;gt; - Destroy a sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createSensor(String sensorName, Collection&amp;lt;String&amp;gt; childSensors)&amp;lt;/tt&amp;gt; - Create a new sensor with the given name and has the given child sensors &lt;br /&gt;
*&amp;lt;tt&amp;gt;void renameSensor(String oldName, String newName)&amp;lt;/tt&amp;gt; - Rename a sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addChild(String sensorName, String childName)&amp;lt;/tt&amp;gt; - Add the child sensor to this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addChildren(String sensorName, Collection&amp;lt;String&amp;gt; childNames)&amp;lt;/tt&amp;gt; - Add multiple children to this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void setChildren(String sensorName, Collection&amp;lt;String&amp;gt; childNames)&amp;lt;/tt&amp;gt; - Set the children of this logical sensor to the supplied list&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeChild(String sensorName, String childName)&amp;lt;/tt&amp;gt; - Remove the given child sensor from this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeChildren(String sensorName, Collection&amp;lt;String&amp;gt; childrenNames)&amp;lt;/tt&amp;gt; - Remote all the given child sensors from this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;Sensor subscribe(Object subscriber, String sensorName)&amp;lt;/tt&amp;gt; - Subscribe an object to the sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unsubscribe(Object subscriber, String sensorName)&amp;lt;/tt&amp;gt; - Unsubscribe an object from the sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void publishToEsper(String sensorName)&amp;lt;/tt&amp;gt; - Publish all tags produced by this sensor to esper under the given sensorName&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unpublishFromEsper(String sensorName)&amp;lt;/tt&amp;gt; - Stop publishing tags produced by this sensor to esper under the given SensorName&lt;br /&gt;
*&amp;lt;tt&amp;gt;SensorDTO getDTO(String sensorName)&amp;lt;/tt&amp;gt; - Get the Data Transfer Object of the sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;Set&amp;lt;String&amp;gt; getSensors()&amp;lt;/tt&amp;gt; - Get a list of all children sensors belonging to this one.&lt;br /&gt;
&lt;br /&gt;
===JMX Service===&lt;br /&gt;
'''Purpose''': Exposes a Configuration via JMX&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.configuration.services.JMXService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void publish(Configuration config)&amp;lt;/tt&amp;gt; - Publishes the given Configuration to JMX&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unpublish(Configuration config)&amp;lt;/tt&amp;gt; - Removes the given Configuration from JMX&lt;br /&gt;
*&amp;lt;tt&amp;gt;public void setConfigurationControlMBean(ConfigurationControlMBean mbean)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==JMS Services==&lt;br /&gt;
The Edge server uses JMS internally to pass events.  To learn how JMS is configured inside of the edge server, see [[EdgeServerJMS| JMS in the Edge Server]].  The following services are preconfigured JMS components that facilitate using JMS in other areas of the edge server.  They are created and made available in the jms bundle&lt;br /&gt;
===Internal Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as an internal high-speed message bus.  Sensors will place tag reads on it.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Tags Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as destination for clients that run outside the edge server's JVM to receive tag reads.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Notification Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as destination for clients that run outside the edge server's JVM to receive notification events, such as when a sensor is created or deleted, or a session has been started or stopped.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===Internal Broker Connection Factory===&lt;br /&gt;
'''Purpose''': A JMS Connection Factory that creates connections to the internal ActiveMQ Broker.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.ConnectionFactory&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Broker Connection Factory===&lt;br /&gt;
'''Purpose''': A JMS Connection Factory that creates connections to the external ActiveMQ Broker.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.ConnectionFactory&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===Internal JMS Template===&lt;br /&gt;
'''Purpose''': A Spring object that makes it easier to send messages to the internal broker&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.springframework.jms.core.JmsTemplate&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External JMS Template===&lt;br /&gt;
'''Purpose''': A Spring object that makes it easier to send messages to the external broker&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.springframework.jms.core.JmsTemplate&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Services==&lt;br /&gt;
There are a few other services that are important.  The interfaces for these services can be found in the edge server services bundle, and each service will be implemented in its own bundle.&lt;br /&gt;
===Esper Management Service===&lt;br /&gt;
'''Purpose''': Provides access to esper&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.esper.EsperManagementService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;EPServiceProvider getProvider()&amp;lt;/tt&amp;gt; - Get the EsperServiceProvider so that you can use esper.&lt;br /&gt;
===Notification Service===&lt;br /&gt;
'''Purpose''': Allows the edge server to notify external clients when an important state change happens (such as when a sensor configuration is created or when a sensor session is started).  These methods should be called on this service when the corresponding event happens.  For example, when a session is created, the addSessionEvent() method should be called.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.notification.NotificationService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addSessionEvent(String readerID, String sessionID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeSessionEvent(String readerID, String sessionID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addCommandEvent(String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeCommandEvent(String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addReaderFactoryEvent(String readerFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderFactoryEvent(String readerFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void sessionStatusChanged(String readerID, String sessionID,SessionStatus sessionStatus)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addCommandConfigFactoryEvent(String readerFactoryID,String commandConfigFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;removeCommandConfigFactoryEvent(String readerFactoryID,String commandFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void jobSubmitted(String readerID, String sessionID, Integer jobID, String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;jobDeleted(String readerID, String sessionID, Integer jobID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;attributesChanged(String configurationID, AttributeList attributes)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Logging Service===&lt;br /&gt;
'''Purpose''': Allows the logging level to be changed at runtime.  For more information, see [[How to change logging levels]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.logging.LoggingService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;setLoggingLevel(String loggerName, String level)&amp;lt;/tt&amp;gt; - Change the logging level of the logger (class or package name) to the given logging level.&lt;br /&gt;
&lt;br /&gt;
=Core Bundles=&lt;br /&gt;
The edge server is deployed as a set of OSGi bundles.  The following bundles make up the core.&lt;br /&gt;
;org.rifidi.edge.api&lt;br /&gt;
: Provides core classes that are necessary for an outside UI to talk to the edge server via RMI and JMS, such as Data Transfer Objects (DTOs), JMS Notification Messages, RMI Interfaces, and Tag Messages.&lt;br /&gt;
;org.rifidi.edge.console&lt;br /&gt;
: Provides the ability to control the edge server using the OSGi console provided by eclipse equinox.  For more information about how to control the console, see [[Edge_Server_Console]].&lt;br /&gt;
;org.rifidi.edge&lt;br /&gt;
: Contains the interfaces for several OSGi services used within the edge sever&lt;br /&gt;
;org.rifidi.edge.core.jms&lt;br /&gt;
:Configures JMS for the edge server.  See [[EdgeServerJMS]] for more details&lt;br /&gt;
;org.rifidi.edge.core.services.logging&lt;br /&gt;
:Provides a service to modify the logging level at run time&lt;br /&gt;
;org.rifidi.edge.core.services.notifications&lt;br /&gt;
:Provides a service to notify external clients (such as UIs) about state changes inside the edge server&lt;br /&gt;
&lt;br /&gt;
=Important Dependencies=&lt;br /&gt;
==Spring==&lt;br /&gt;
===Spring DM===&lt;br /&gt;
==SLF4J==&lt;br /&gt;
==Esper==&lt;br /&gt;
==ActiveMQ==&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/LLRP_Reader</id>
		<title>LLRP Reader</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/LLRP_Reader"/>
				<updated>2014-06-30T22:07:27Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Removing advertising and spam edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
There has been a lot of buzz in the RFID world as of late around LLRP (Low Level Reader Protocol). It is an EPC Ratified Standard that describes a protocol for client to reader communication. It is called &amp;quot;Low Level&amp;quot; because it allows control of Air Protocol (such as class 1 gen 2) parameters as well as control of other hardware aspects of the reader. LLRP communicates via Messages -- the basic data unit -- that are encoded in a binary format and are sent over TCP. Using these messages, the client can control the various dynamic data structures (ROSpecs, AccessSpecs, etc.) and configure the reader. &lt;br /&gt;
&lt;br /&gt;
;Network Protocol:&lt;br /&gt;
:TCP/IP &lt;br /&gt;
;Communication:   &lt;br /&gt;
:Bit encoded messages over TCP&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The LLRP virtual reader is based on the EPCGlobal spec found at [http://www.epcglobalinc.org/standards/llrp EPCGlobal's website].  Currently there are no hardware readers available.&lt;br /&gt;
===Documentation===&lt;br /&gt;
*[http://www.epcglobalinc.org/standards/llrp LLRP Specification]&lt;br /&gt;
*[http://www.impinj.com/uploadedFiles/RFID/Case_Studies_White_Papers/Impinj-LLRP_data_sheet(singlespages-web).pdf Overview of LLRP Protocol]&lt;br /&gt;
&lt;br /&gt;
===Client Tools===&lt;br /&gt;
There are very few client tools available at the moment, as there are no hardware readers available.  Because all LLRP commands are bit-encoded, communication with an LLRP reader is not trivial and it is not possible to simply telnet into the reader and issue commands.&lt;br /&gt;
&lt;br /&gt;
;LLRPHelloWorld&lt;br /&gt;
:A simple [[LLRPHelloWorld|client]] developed for testing Rifid's LLRP reader that uses a java client library. &lt;br /&gt;
;XML Messages&lt;br /&gt;
:A collection of [[LLRP XML Messages]] that can be used to get started with LLRP&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. It is the output of Stage 1 in the [[Readers#Stages of Building a Reader| Stages of Building a Reader]].&lt;br /&gt;
===Communication===&lt;br /&gt;
The LLRP Spec requires that LLRP Readers use bit encoded messages over a TCP connection. It explains how to build the messages by specifying in which order bits should be placed.  To assist with the binary encoding/decoding of all the LLRP messages and parameters, see the [http://sourceforge.net/projects/llrp-toolkit/ LLRP-TK Sourceforge page].&lt;br /&gt;
&lt;br /&gt;
LLRP readers use a TCP connection to communicate with the client.  Additionally, readers may implement a secure connection using TLS.&lt;br /&gt;
&lt;br /&gt;
====LLRP Communication Layer====&lt;br /&gt;
The LLRP specification requires that readers implement an &amp;quot;LLRP Layer&amp;quot; above the TCP stack.  This means that LLRP Messages, (i.e. ADD_ROSPEC, GET_READER_CONFIG) may not be sent until an LLRP connection has been established.  To establish this connection, a reader must either be commanded to accept incoming connections on a given port, or to connect to a client at a given IP and port.  The method for specifying this connection information is left up to the vendor (LLRP Specification, 18.1).&lt;br /&gt;
&lt;br /&gt;
====Rifidi Admin Console====&lt;br /&gt;
To command the rifidi reader to either accept connections or make connections, a basic admin console has been provided.  To use it, start the rifidi reader, and telnet into the reader.  Then issue one of two commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
'''For the (normal) ServerMode'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In this mode the Reader works as a Server, listening for incoming connections on the given Port&lt;br /&gt;
* '''''mode server [PORT]'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''For the ClientMode'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In this mode the Reader works as a Client and tries to establish a connection to the ClientApplication which is running on the given IP and Port&lt;br /&gt;
* '''''mode client [IP] [PORT]'''''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model of LLRP Readers is complex and different from other readers. There are two main data structures defined in the LLRP spec. The first is the ROSpec (Reader Operations Specification). The most important aspect of the ROSpec is that it contains contains a list of one or more of AISpecs (which define how to read EPC tags from the antennas) and RFSurveySpec (which define how to get operation information about the antennas such as power levels). In addition it contains a ReportSpec that has the parameters describing what information a report will contain. The other main data structure is the AccessSpec which defines how to read non-EPC information on a tag (such as&lt;br /&gt;
user defined data) as well as how to perform other operations on a tag, such as writing and killing. Currently the Rifidi virtual LLRP reader only supports ROSpecs with AISpecs (that is it supports getting epc numbers from tags). &lt;br /&gt;
&lt;br /&gt;
It may help to imagine ROSpecs as processes inside an operating system. A ROSpec is like a single process, and it moves between three states -- disabled, inactive, and active. When the ROSpec is added to the reader, it is added in the disabled state. Then, a message from the client --the ENABLE_ROSPEC message -- moves the ROSpec to the inactive state. After that, a [[LLRPTrigger|trigger]] event (time based, message based, etc) moves the ROSpec into the active state, where it begins executing. When the ROSpec is executing, it goes through its list of specs to executes (AI and/or RFSurvey) and executes each one sequentially. It keeps repeating this cycle until its ROSpec stop trigger fires, at which time it moves back to the inactive state.&lt;br /&gt;
&lt;br /&gt;
Tags are sent back as part of a Report Message.  It is possible to specify what information reports contain through the RoReportSpec parameter in the ROSpec parameter. For example, reports can contain information about the tags besides the EPC number, such as &amp;quot;time last seen&amp;quot; and &amp;quot;number of times the tag was read&amp;quot;.  Reports are sent back either at the completion of an AISpec, the completion of a ROSpec, or after N tags are read; however a reader may accumulate tag reports for efficiency purposes.  Once a tag is sent in a report, it is &amp;quot;deleted&amp;quot; from tag memory.  This prevents the results of a single tag read from being a part of two reports.  However if the same tag is read again after a tag read, it will appear in the next report.&lt;br /&gt;
&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
&lt;br /&gt;
To get tags from a LLRP reader, a client must setup and send a ROSpec (which includes an AISpec) and begin the execution of it.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;b&amp;gt;Client Connects&amp;lt;/b&amp;gt; - In this stage, the client connects to the reader at the specified IP and port. Messages may now be sent between the client and the reader.&lt;br /&gt;
#&amp;lt;b&amp;gt;Create ROSpec&amp;lt;/b&amp;gt; - In this stage, the client constructs the ROSpec object, which consists of numerous parameters specifying how the reader should read tags and send back results to the client. It is only through a ROSpec that a client can set up a reader. There is no concept of &amp;quot;telnetting&amp;quot; to the reader and using a command line in LLRP.&lt;br /&gt;
#&amp;lt;b&amp;gt;Add ROSpec&amp;lt;/b&amp;gt; - In this stage, an ADD_ROSPEC message, which contains the newly created ROSpec, is sent to the reader to add it to its list of &amp;quot;ROSpecs to be processed.&amp;quot; When a ROSpec is added, it is added to the reader's &amp;quot;disabled&amp;quot; queue.&lt;br /&gt;
#&amp;lt;b&amp;gt;Enable ROSpec&amp;lt;/b&amp;gt; - A ROSpec must be enabled before it can be executed. The ENABLE_ROSPEC is a message sent from the client to the reader that moves the ROSpec from the &amp;quot;disabled&amp;quot; queue to the reader's &amp;quot;enabled&amp;quot; queue&lt;br /&gt;
#&amp;lt;b&amp;gt;Start ROSpec&amp;lt;/b&amp;gt; - Once a ROSpec is enabled, it is listening for a start trigger. The simplest way to issue a start trigger is to send the START_ROSPEC message which will cause a reader to begin execution.&lt;br /&gt;
#&amp;lt;b&amp;gt;Receive Reports from reader&amp;lt;/b&amp;gt; - When a ROSPec is in the execution phase, it can begin to send reports back to the client. Reports contain the information about the tags that the reader has seen, such as the EPC number, the first and last seen time, and the number of times the tag has been seen.&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
The LLRP reader can be put in autonomous mode by specifying the stop trigger for an AISpec, the most straight-forward of which is the Time based trigger.  For example, the the time based trigger is used, an AISpec will stop executing after N seconds.  If the ROReport is configured to be sent after the AISpec stops execution, it will be sent then.  After the execution of all the AISpecs, a ROSpec will stop.  If there are no other ROSpecs waiting, it will begin to execute again.  Thus if the Reader has only one ROSpec that has one AISpec, reports will be sent every N seconds.&lt;br /&gt;
&lt;br /&gt;
====On-Demand Mode====&lt;br /&gt;
&lt;br /&gt;
There is also a concept of an on-demand mode for getting tags, using the GET_REPORT message.  If the reader is set to not send back reports at the end of a ROSpec or and AISpec (i.e. reporttrigger is null), then the reader is in an on-demand, or polling mode.  Reports can only be obtained through the use of the GET_REPORT command.&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
There is no concept of a &amp;quot;login&amp;quot; in the LLRP specification, as there is in some other readers such as the Alien or the Symbol.  However, it would be possible to implement one through the use of custom messages.&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
&lt;br /&gt;
The following is a list of important features of the LLRP reader that are properly emulated by Rifidi&lt;br /&gt;
&lt;br /&gt;
===Messages Supported===&lt;br /&gt;
All LLRP Messages are supported, however some of the parameters inside the messages may not affect the reader.  For example, the reader will not processes RFSurvesSpec parameters because the Rifidi Emulator does not emulate RF Functionality.&lt;br /&gt;
&lt;br /&gt;
===Features Supported===&lt;br /&gt;
* Autonomous Mode &amp;amp; On-demand Mode as described in the Memory Model section above is supported.&lt;br /&gt;
* It is possible to read from more than on antenna and to specify which antennas to read from in the AISpec.&lt;br /&gt;
* Getting and Setting of Configuration Variables&lt;br /&gt;
* Getting of Capabilities&lt;br /&gt;
* Event Notifications&lt;br /&gt;
* LLRP Connection Layer&lt;br /&gt;
* Start and Stop Triggers for ROSpecs and AISpecs&lt;br /&gt;
* GPIO&lt;br /&gt;
** Enabling GPI Ports (using SET_READER_CONFIG)&lt;br /&gt;
** Writing to GPO Ports  (using SET_READER_CONFIG)&lt;br /&gt;
** ROSpec start and stop trigger and AISPec stop trigger on GPI event&lt;br /&gt;
* Access specs&lt;br /&gt;
** Read non-epc memory&lt;br /&gt;
** Write memory&lt;br /&gt;
** Lock tag&lt;br /&gt;
** Kill tag&lt;br /&gt;
&lt;br /&gt;
==Bugs and Unsupported Features==&lt;br /&gt;
&lt;br /&gt;
===LLRP Toolkit===&lt;br /&gt;
Rifidi currently uses the toolkit developed at the University of Arkansas.  However, there are a few limitations with this library that is being addressed by AutoID at MIT.&lt;br /&gt;
*Unsigned data types are not supported because java does not support them&lt;br /&gt;
&lt;br /&gt;
===Other Unsupported Features===&lt;br /&gt;
*RFSurvey Specs&lt;br /&gt;
&lt;br /&gt;
==Other Resources==&lt;br /&gt;
* [http://llrp.org LLRP Toolkit] -  Open source implementations of LLRP Message encoders/decoders.&lt;br /&gt;
* [http://sourceforge.net/projects/llrp-toolkit/ LLRP-TK Sourceforge page] - Sourceforge page for LLRP Toolkit.  Has a link to the mailing lists.&lt;br /&gt;
*[http://www.industrial-embedded.com/articles/id/?2392 Industry standards ease task of embedding RFID]&lt;br /&gt;
*[http://technet.microsoft.com/en-us/library/bb970584.aspx MS BizTalk LLRP documentation]]&lt;br /&gt;
*[http://www.rfidtribe.com/home/index.php?option=com_content&amp;amp;task=view&amp;amp;id=138 A Brief Introduction to LLRP]&lt;br /&gt;
*[http://www.aimglobal.org/members/news/templates/template.aspx?articleid=2887&amp;amp;zoneid=42 Interview with Rob Buck, co-chair of EPCGlobal Reader Operations Workgroup]&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ReaderJunits</id>
		<title>ReaderJunits</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ReaderJunits"/>
				<updated>2014-06-30T22:03:27Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5893 by StevenCollins (talk) - spam &amp;amp; advertising edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
=Purpose of Junits=&lt;br /&gt;
Junits are automated tests that programatically test functionality.  The advantage of them is that you can run the tests to make sure that as new functionality is added, old functionality doesn't break.&lt;br /&gt;
&lt;br /&gt;
=Creating a new Junit in eclipse=&lt;br /&gt;
Currently our testing packages are stored internally to Pramari because they have dependencies to non-free libraries provided by RFID reader companies.   We are currently working on opening up our tests.  However, you can ignore the first step and add the test to a testing package contained in your reader's source code.&lt;br /&gt;
#Checkout org.rifidi.tests and org.rifidi.internal.dependencies from the internal repository&lt;br /&gt;
#Create a new package for your tests&lt;br /&gt;
#Add a new Junit in eclipse&lt;br /&gt;
##New-&amp;gt;Other-&amp;gt;Junit Test Case&lt;br /&gt;
##Fill in the information in the wizard.  You need a Junit 4 test case with the SetUpBeforeClass() and TearDownAfterClass() methods generated.[[image:Newjunit.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Designing a Junit to Test a Virtual Reader=&lt;br /&gt;
The test that you are designing depends on which version of emulator you are running.  To figure this out, open up the plugin.xml file for org.rifidi.emulator, and look at the plugin version&lt;br /&gt;
&lt;br /&gt;
==Junit Guidelines==&lt;br /&gt;
* When creating a Junit, it is important to add comments to almost everything you do, because your test might not fail for months after you've written it, and it will be difficult to go in and figure out why it failed if there are no comments&lt;br /&gt;
* It is important to think through exactly what you want to test and make sure that you are testing it well.  For example, The following test could be designed better, because it will not fail if more than one tag comes back from the alien reader for some reason after the getTaglist command is sent&lt;br /&gt;
* It is also important that one test not depend on the state of previously run test.  All test methods should run independently and should only assume that SetUpBeforeClass() has finished without error.  For example, if I added another test method to run after the &amp;lt;tt&amp;gt;getTaglistTest&amp;lt;/tt&amp;gt; method, it should not assume that a tag is on the reader.  Also this test method should have removed the tag after it was done.&lt;br /&gt;
&lt;br /&gt;
==Junits for org.rifidi.emulator 1.x==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
package org.rifidi.tests.reader.alien;&lt;br /&gt;
&lt;br /&gt;
import gnu.cajo.utils.extra.TransparentItemProxy;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
import org.apache.commons.logging.Log;&lt;br /&gt;
import org.apache.commons.logging.LogFactory;&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.rifidi.emulator.reader.module.GeneralReaderPropertyHolder;&lt;br /&gt;
import org.rifidi.emulator.rmi.server.ReaderModuleManagerInterface;&lt;br /&gt;
import org.rifidi.emulator.rmi.server.RifidiManager;&lt;br /&gt;
import org.rifidi.emulator.rmi.server.RifidiManagerInterface;&lt;br /&gt;
import org.rifidi.emulator.tags.impl.C1G2Tag;&lt;br /&gt;
import org.rifidi.emulator.tags.impl.RifidiTag;&lt;br /&gt;
import org.rifidi.utilities.formatting.ByteAndHexConvertingUtility;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &lt;br /&gt;
 * This Junit is designed to demonstrate how to write Junits for Rifidi Virtual&lt;br /&gt;
 * Readers&lt;br /&gt;
 * &lt;br /&gt;
 * @author Kyle Neumeier - kyle@pramari.com&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
public class AlienExample {&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The logger for this class. Allows you to keep track of debug statements&lt;br /&gt;
	 * instead of using&lt;br /&gt;
	 */&lt;br /&gt;
	private static final Log logger = LogFactory.getLog(AlienExample.class);&lt;br /&gt;
&lt;br /&gt;
	public static final String READER_IP_ADDRESS = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
	public static final int READER_PORT = 20000;&lt;br /&gt;
	public static final String READER_NAME = &amp;quot;virtualAlienReader&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	public static final String RMI_SERVER_IP_ADDRESS = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
	public static final int RMI_SERVER_PORT = 1099;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The RMI Client Interface for the Alien Reader. It allows you to turn the&lt;br /&gt;
	 * reader on and off as well as add and remove tags to the antenna&lt;br /&gt;
	 */&lt;br /&gt;
	private static ReaderModuleManagerInterface alienManager;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The Interface for the RMI server&lt;br /&gt;
	 */&lt;br /&gt;
	private static RifidiManagerInterface RMIManager;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The client connection to the Alien reader&lt;br /&gt;
	 */&lt;br /&gt;
	private static Socket connection = null;&lt;br /&gt;
	private static PrintWriter out = null;&lt;br /&gt;
	private static BufferedReader in = null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * This method is run before any of the tests in this file&lt;br /&gt;
	 * &lt;br /&gt;
	 * @throws java.lang.Exception&lt;br /&gt;
	 */&lt;br /&gt;
	@BeforeClass&lt;br /&gt;
	public static void setUpBeforeClass() throws Exception {&lt;br /&gt;
		// set up RMI Server, Client, and Readers&lt;br /&gt;
		RifidiManager.startManager(RMI_SERVER_IP_ADDRESS, RMI_SERVER_PORT);&lt;br /&gt;
		RMIManager = RifidiManager.getManager();&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * The General Reader Property Holder contains information needed to&lt;br /&gt;
		 * instantiate the virutal reader. Note that the GRPH has a property map&lt;br /&gt;
		 * in it that is different for every reader. To find out which&lt;br /&gt;
		 * properties you should have in your reader, look at the required&lt;br /&gt;
		 * properties in the emulator.xml file in the reader project.&lt;br /&gt;
		 */&lt;br /&gt;
		GeneralReaderPropertyHolder alienGRPH = new GeneralReaderPropertyHolder();&lt;br /&gt;
		alienGRPH.setNumAntennas(2);&lt;br /&gt;
		alienGRPH.setNumGPIs(2);&lt;br /&gt;
		alienGRPH.setNumGPOs(2);&lt;br /&gt;
		alienGRPH.setReaderName(READER_NAME);&lt;br /&gt;
		alienGRPH.setReaderClassName(&amp;quot;org.rifidi.emulator.reader.alien.module.AlienReaderModule&amp;quot;);&lt;br /&gt;
		alienGRPH.setProperty(&amp;quot;inet_address&amp;quot;, READER_IP_ADDRESS + &amp;quot;:&amp;quot;+ READER_PORT);&lt;br /&gt;
		alienGRPH.setProperty(&amp;quot;heartbeat_address&amp;quot;, READER_IP_ADDRESS + &amp;quot;:54321&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// create the reader&lt;br /&gt;
		RMIManager.createReader(alienGRPH);&lt;br /&gt;
&lt;br /&gt;
		// get the reader manager from the RMI server&lt;br /&gt;
		alienManager = (ReaderModuleManagerInterface) TransparentItemProxy&lt;br /&gt;
				.getItem(&amp;quot;//&amp;quot; + RMI_SERVER_IP_ADDRESS + &amp;quot;:&amp;quot; + RMI_SERVER_PORT + &amp;quot;/&amp;quot; + READER_NAME,&lt;br /&gt;
				         new Class[] { ReaderModuleManagerInterface.class });&lt;br /&gt;
&lt;br /&gt;
		// turn on the reader&lt;br /&gt;
		alienManager.turnReaderOn();&lt;br /&gt;
&lt;br /&gt;
		// wait for reader to turn on&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
&lt;br /&gt;
		// create a new client connection&lt;br /&gt;
		connection = new Socket(READER_IP_ADDRESS, READER_PORT);&lt;br /&gt;
&lt;br /&gt;
		in = new BufferedReader(new InputStreamReader(connection.getInputStream()));&lt;br /&gt;
		out = new PrintWriter(connection.getOutputStream());&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			// read welcome message&lt;br /&gt;
			System.out.println(readFromReader(in));&lt;br /&gt;
			// send user name&lt;br /&gt;
			out.write(&amp;quot;alien\n&amp;quot;);&lt;br /&gt;
			out.flush();&lt;br /&gt;
			// read resoponse&lt;br /&gt;
			System.out.println(readFromReader(in));&lt;br /&gt;
			Thread.sleep(500);&lt;br /&gt;
			// send password&lt;br /&gt;
			out.write(&amp;quot;password\n&amp;quot;);&lt;br /&gt;
			out.flush();&lt;br /&gt;
			System.out.println(readFromReader(in));&lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			Assert.fail(e.getMessage());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * This class is run after all the tests in this class have been run. It&lt;br /&gt;
	 * should shut down the reader and tear down the RMI server&lt;br /&gt;
	 * &lt;br /&gt;
	 * @throws java.lang.Exception&lt;br /&gt;
	 */&lt;br /&gt;
	@AfterClass&lt;br /&gt;
	public static void tearDownAfterClass() throws Exception {&lt;br /&gt;
		out.write(&amp;quot;q&amp;quot;);&lt;br /&gt;
		connection.close();&lt;br /&gt;
		alienManager.turnReaderOff();&lt;br /&gt;
		RMIManager.removeReader(READER_NAME);&lt;br /&gt;
		RMIManager.cleanup();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * This is a Junit Test. Use the &amp;quot;@Test&amp;quot; annotation above the class so that&lt;br /&gt;
	 * it will be run as a Junit.&lt;br /&gt;
	 * &lt;br /&gt;
	 * This Junit adds a tag to the reader, then sends a get taglist command to&lt;br /&gt;
	 * the reader. It then compares the response with the sent tag information&lt;br /&gt;
	 * and will fail if the information is not the same.&lt;br /&gt;
	 * &lt;br /&gt;
	 * @throws Exception&lt;br /&gt;
	 */&lt;br /&gt;
	@Test&lt;br /&gt;
	public void getTaglistTest() throws Exception {&lt;br /&gt;
		// make sure information comes back in the right format&lt;br /&gt;
		String command1 = &amp;quot;\1set TagListFormat = TEXT\n&amp;quot;;&lt;br /&gt;
		out.write(command1);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		String returnVal1 = readFromReader(in);&lt;br /&gt;
		Assert.assertTrue(returnVal1.toLowerCase().contains(&amp;quot;TagListFormat = TEXT&amp;quot;.toLowerCase()));&lt;br /&gt;
&lt;br /&gt;
		// create a new tag&lt;br /&gt;
		byte[] epcID = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C };&lt;br /&gt;
		byte[] pass = { 0x00, 0x00, 0x00, 0x00 };&lt;br /&gt;
		C1G2Tag t = new C1G2Tag(epcID, pass, pass.clone());&lt;br /&gt;
		RifidiTag tag = new RifidiTag(t);&lt;br /&gt;
		ArrayList&amp;lt;RifidiTag&amp;gt; tags = new ArrayList&amp;lt;RifidiTag&amp;gt;();&lt;br /&gt;
		tags.add(tag);&lt;br /&gt;
&lt;br /&gt;
		// add tag to antenna 0 on the reader&lt;br /&gt;
		alienManager.addTags(0, tags);&lt;br /&gt;
&lt;br /&gt;
		Thread.sleep(500);&lt;br /&gt;
&lt;br /&gt;
		// send a get taglist command&lt;br /&gt;
		out.write(&amp;quot;\1getTaglist\n&amp;quot;);&lt;br /&gt;
		out.flush();&lt;br /&gt;
		String taglist = readFromReader(in);&lt;br /&gt;
		logger.debug(taglist);&lt;br /&gt;
&lt;br /&gt;
		// process command and compare byte ids.&lt;br /&gt;
		String[] info = taglist.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
		String id = info[0].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
		byte[] byteID = ByteAndHexConvertingUtility.fromHexString(id.trim());&lt;br /&gt;
		Assert.assertArrayEquals(epcID, byteID);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static String readFromReader(BufferedReader inBuf)&lt;br /&gt;
			throws IOException {&lt;br /&gt;
		StringBuffer buf = new StringBuffer();&lt;br /&gt;
		int ch = inBuf.read();&lt;br /&gt;
		while ((char) ch != '\0') {&lt;br /&gt;
			buf.append((char) ch);&lt;br /&gt;
			ch = inBuf.read();&lt;br /&gt;
		}&lt;br /&gt;
		return buf.toString();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Junits for org.rifidi.emulator 2.x==&lt;br /&gt;
Creating Junits for emulator 2.x is similar to that.  The main difference is how tags are created.  An example is coming soon.&lt;br /&gt;
&lt;br /&gt;
=Running the Junit Test Case=&lt;br /&gt;
#Right click the Junit in the tree on the left inside of eclipse&lt;br /&gt;
#Select RunAs -&amp;gt; Junit Plugin Test&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Symbol_XR440</id>
		<title>Symbol XR440</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Symbol_XR440"/>
				<updated>2014-06-30T22:02:40Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5894 by StevenCollins (talk) - spam &amp;amp; advertising edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The XR440 is manufactured by Motorola. It is a general purpose reader that can read Class 1 Gen 2 tags.&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
XR440&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
Bit Encoded Messages over TCP &amp;amp; HTTP over TCP&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
N/A&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The implementation of the virtual reader is based on the testing of an actual hardware reader.  Testing was done using wireshark to capture the client-reader communication.  This input output was then emulated.&lt;br /&gt;
===Documentation===&lt;br /&gt;
*[http://support.symbol.com/support/browse.do?WidgetName=BROWSE_PRODUCT&amp;amp;TaxoName=SG_SupportGoals&amp;amp;BROWSE_PRODUCT.isProductTaxonomy=true&amp;amp;BROWSE_PRODUCT.NodeId=SG_XR440_1_2&amp;amp;BROWSE_PRODUCT.thisPageUrl=%2Fproduct%2Fproducts.do&amp;amp;id=m4&amp;amp;BROWSE_PRODUCT.TaxoName=SG_SupportGoals&amp;amp;NodeType=leaf&amp;amp;NodeName=XR440&amp;amp;document=DT_PRODUCTMANUALS_1_1&amp;amp;BROWSE_PRODUCT.NodeType=leaf&amp;amp;NodeId=SG_XR440_1_2&amp;amp;AppContext=AC_ProductPage&amp;amp;param_document=sp| product manuals for the Symbol XR440]&lt;br /&gt;
===Client Tools===&lt;br /&gt;
The main client tools used for testing this program:&lt;br /&gt;
;BEA 2.2&lt;br /&gt;
:[[BEA]] is a commercial edgeware application.  It communicates with the alien reader via &amp;quot;on demand&amp;quot; mode using the bit encoded messages over TCP.  The new version of BEA (version 3.0), also has an option to use autonomous mode, which uses HTTP over TCP.&lt;br /&gt;
;Logic Alloy 1.0.10&lt;br /&gt;
:[[Logic Alloy]] ALE Server is an open source edgeware application.  It uses HTTP to communicate with the reader.&lt;br /&gt;
;TagCentric&lt;br /&gt;
:[[TagCentric]] is an open source edgeware application that communicates with the alien reader HTTP.&lt;br /&gt;
;Motorola Showcase&lt;br /&gt;
:Motorola Showcase is a client tool provided by Motorola to use with their readers.  It runs on .NET and communicates with the reader mainly using HTTP, but it is possible to get tags using the bit encoded messages.&lt;br /&gt;
;Web Browser&lt;br /&gt;
:Because the reader uses an HTTP interface, it is possible to use a simple web browser as a client to issue most commands.&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
The Symbol XR440 uses two methods for communication.  The default port for HTTP is port 80, and the default port for bit-encoded messages is 3000.&lt;br /&gt;
====HTTP over TCP====&lt;br /&gt;
The main method for communicating with the reader is via HTTP over TCP.  Almost all functionality can be accessed in this way. &lt;br /&gt;
&lt;br /&gt;
The general syntax of an HTTP command is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;http://IP[:PORT]/cgi-bin/PROXY/oper=COMMAND[&amp;amp;PARAM=VAL]*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;b&amp;gt;[ ]&amp;lt;/b&amp;gt; indicate option items&lt;br /&gt;
*&amp;lt;b&amp;gt;IP&amp;lt;/b&amp;gt; is a host name (can be of the form www.reader.com, or of 192.168.1.100)&lt;br /&gt;
*&amp;lt;b&amp;gt;PORT&amp;lt;/b&amp;gt; is the port.  If omitted, port 80 is assumed&lt;br /&gt;
*&amp;lt;b&amp;gt;PROXY&amp;lt;/b&amp;gt; is either:&lt;br /&gt;
#loginProxy for commands dealing with logging into the Web-based admin console&lt;br /&gt;
#coreProxy for commands dealing with the backend, such as setting the date and time&lt;br /&gt;
#dataProxy for commands that interact with the host, such as getting tags&lt;br /&gt;
*&amp;lt;b&amp;gt;COMMAND&amp;lt;/b&amp;gt; is the command to execute, such as &amp;quot;setDateTime&amp;quot; or &amp;quot;queryTags&amp;quot;&lt;br /&gt;
*&amp;lt;b&amp;gt;PARAM=VAL&amp;lt;/b&amp;gt;is a name-value pair of arguments.  Each argument is separated by an ampersand.  There can be 0 or more name-value pairs.&lt;br /&gt;
&lt;br /&gt;
For example, to get tags, this command would be sent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;http://192.168.0.1/cgi-bin/dataProxy?oper=queryTags&amp;amp;raw=1&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The resulting tag read looks like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;Matrics&amp;gt;&lt;br /&gt;
&amp;lt;EventGroup&amp;gt;&lt;br /&gt;
&amp;lt;TagList&amp;gt;&lt;br /&gt;
&amp;lt;Tag raw='300833B2DDD9014035050000' time='46bb8b06' RPL='1'/&amp;gt;&lt;br /&gt;
&amp;lt;/TagList&amp;gt;&lt;br /&gt;
&amp;lt;/EventGroup&amp;gt;&lt;br /&gt;
&amp;lt;/Matrics&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Byte Stream Messages====&lt;br /&gt;
In addition to the HTTP interface, the XR440 also supports a byte stream protocol.  This interface is primarily for getting tags in an &amp;quot;on-demand&amp;quot; (i.e. polling) way.  For example, the client will send the reader a command to &amp;quot;get tags&amp;quot;, and the reader will respond with a tag list.  Because the bit-encoded messages are smaller, they are more efficient to send over a network, and thus this protocol is a better choice than sending &amp;quot;queryTags&amp;quot; HTTP commands for polling the reader.  &lt;br /&gt;
&lt;br /&gt;
=====Structure of Byte Protocol Message=====&lt;br /&gt;
The general structure of a bit encoded message is the following:&lt;br /&gt;
*Byte 0 - Start of Frame (value is 0x01)&lt;br /&gt;
*Byte 1 - Node Address (Obsolete, value is 0x04)&lt;br /&gt;
*Byte 2 - Packet length, excluding the Start of Frame, but including CRC bytes&lt;br /&gt;
*Byte 3 - Command&lt;br /&gt;
*Bytes 4-N - Data &lt;br /&gt;
*Byte N+1 - LSB of CRC&lt;br /&gt;
*Byte N+2 - MSB of CRC&lt;br /&gt;
&lt;br /&gt;
The reader will always respond with a similarly structured response message that echoes the command of the incoming message.  In the case of the Read Full Field Command (22h), there are two response packets -- a Tag Data Packet, and a Final Packet.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model for the Symbol reader is fairly simple.  Tags are in one of three states: Visible, Invisible, or Unknown.  Once a tag is read, it transitions from the Unknown state to the Visible state.  If the tag goes outside the view of the antenna, it transitions to the invisible state.  Then, if the re-enters the antenna's field of view, it transitions back to the Visible state.  If the tag is in the Invisible state, and a purge command is called, it goes back to being unknown.  The reader also generates events at each of these transitions.&lt;br /&gt;
&lt;br /&gt;
When a client queries the reader using http, it can specify whether or not it wants the invisible tags by using the &amp;quot;invis&amp;quot; parameter.&lt;br /&gt;
&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
&lt;br /&gt;
====On Demand====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
So far, the only supported features are the following byte stream commands&lt;br /&gt;
&lt;br /&gt;
*Get Parameter Block Command(24h)&lt;br /&gt;
*Ge Reader Status Command(14h)&lt;br /&gt;
*Read Full Command(22h)&lt;br /&gt;
*Set Parameter Block Command(23h)&lt;br /&gt;
&lt;br /&gt;
In addition, it is only possible to read from antenna 1.&lt;br /&gt;
&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/ThingMagic"/>
				<updated>2014-06-30T22:01:13Z</updated>
		
		<summary type="html">&lt;p&gt;Redfern3141: Undo revision 5895 by StevenCollins (talk) - spam &amp;amp; advertising edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
 4&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
SQL like protocol that may be wrapped in ssh, web interface, RCP, and Linux shell login.&lt;br /&gt;
;Communication:   &lt;br /&gt;
10/100 BaseT Ethernet – RJ45&lt;br /&gt;
;Antennas:&lt;br /&gt;
4 read points (4 transmit points, 4 receive points)&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
(To Do)&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The reader accepts SQL style protocol and returns the appropriate information.&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
 &lt;br /&gt;
===Client Tools===&lt;br /&gt;
Telnet, SSH clients, and Tag Centric&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
Here is the architecture for the emulator: [[ThingMagic/Emulator_Architecture]] [Deprecated]&lt;br /&gt;
===Communication===&lt;br /&gt;
&lt;br /&gt;
====Protocols====&lt;br /&gt;
The main method for communicating with the reader is via TCP, TCP+SSH on port 8080, web interface, and RCP.&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model is like a state based database.&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
Getting tags is fairly simple just execute:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet [reader ip address] 8080&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: the semicolon at the end of each command is necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
One can also return multiple items:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id, protocol_id from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add filters or conditionals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id where [condition or filter] set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: The where clause only works on tag_id or tag_data tables. Only '''protocol_id''' can have a string in the where clause.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition more than one statement can be put on more than one line.&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id from tag_id set time_out=[milliseconds]; select protocol from tag_id set time_out=[milliseconds];&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tag Centric reads tags in the following manner:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE (protocol_id='EPC0' and protocol_id='EPC1' and protocol_id='GEN2') set time_out=200;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
From this, one can tell if two conditions conjoined with 'AND' use the same column name, it counts as a logical 'OR'.&lt;br /&gt;
====Timer====&lt;br /&gt;
&lt;br /&gt;
====Autonomous Mode and Cursors====&lt;br /&gt;
First create a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
declare cursor_name cursor for select id, protocol_id from tag_table;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the cursor just once... &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
fetch cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
One may add more cursors to the fetch list by separating them by commas.&lt;br /&gt;
&lt;br /&gt;
To turn on auto mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = ON;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add in additional delay between one tag read operation and another:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
set auto cursorlist = on, repeat = 500;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: 500 is the minimum time between the start of one tag read operation to the start of another. This ''includes'' any time_out value in the select command used for the cursor.&lt;br /&gt;
&lt;br /&gt;
To set the delay between the end of the cursor list to the beginning of it repeating again, use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET repeat = 1000;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To turn auto mode off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SET auto = OFF;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: Do not try to use any other command while auto mode is on; it may cause an ''undesirable undefined'' operation.&lt;br /&gt;
&lt;br /&gt;
To delete a cursor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
close cursor_name;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
NOTE: only one cursor can be close/deleted at a time, and no cursor lists are allowed in the syntax of this command.&lt;br /&gt;
&lt;br /&gt;
====Reset====&lt;br /&gt;
To reset the reader as if there where no cursors defined and no tags read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
reset;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
By SSH log in.&lt;br /&gt;
&lt;br /&gt;
===RQL Schema===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_id&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || protocol_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || antenna_id || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || read_count || Int&lt;br /&gt;
|-&lt;br /&gt;
| R/W || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|W || killed || Int&lt;br /&gt;
|-&lt;br /&gt;
|W || password || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || frequency || Int&lt;br /&gt;
|-&lt;br /&gt;
|R || dspmicros || Int&lt;br /&gt;
|-&lt;br /&gt;
|R  || timestamp || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ tag_data&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || id || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || block number || Int&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|R || locked || Int&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ settings&lt;br /&gt;
! Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R || current_time || String&lt;br /&gt;
|-               &lt;br /&gt;
|R || version || String&lt;br /&gt;
|-&lt;br /&gt;
|R || supported_protocols || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ io&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || data || Hex String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ saved_settings&lt;br /&gt;
!Read/Write !! Field !! Type&lt;br /&gt;
|-&lt;br /&gt;
|R/W || hostname || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || iface || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || dhcpcd || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ip_address || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || netmask || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || gateway || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ntp_servers || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || 1tx_power || String&lt;br /&gt;
|-            &lt;br /&gt;
|R/W || uhf_power_centidbm || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || epc1_id_length || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || primary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || secondary_dns || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || domain_name || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_description || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || reader_role || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant1_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant2_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant3_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|R/W || ant4_readpoint_descr || String&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
All tables except tag_data are supported. Where clause only works on tag_id and tag_data on the real reader. Automode is working.&lt;br /&gt;
&lt;br /&gt;
Only no-complex (simple) where clauses are supported now only for the '''select''' command, like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
select id,read_count from tag_id WHERE protocol_id='GEN2';&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding and removing cursors works. Also automode works (see above examples).&lt;br /&gt;
==Unsupported Features &amp;amp; Bugs==&lt;br /&gt;
Tag_data table and compound conditions are not supported. ThingMagic, Mercury 5 reader RQL features are also not supported. Login by ssh is not supported. Also the time_out feature for reading tags is not supported yet. Complex where clauses are not currently supported but may be in a future release.&lt;br /&gt;
&lt;br /&gt;
==Features that might never be supported==&lt;br /&gt;
Linux shell access to reader. This is fairly complex and require to emulate the entire hardware infrastructure of the reader and an ARM possessor. Also the web and RCP interface might be developed at a later time.&lt;/div&gt;</summary>
		<author><name>Redfern3141</name></author>	</entry>

	</feed>