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

	<entry>
		<id>https://wiki.rifidi.net/index.php/ThingMagic</id>
		<title>ThingMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/ThingMagic"/>
				<updated>2011-11-24T19:21:40Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-Adipex-Medicine.aspx &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;what is adipex&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;diet supplements&amp;lt;/span&amp;gt;] 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Symbol_XR440</id>
		<title>Symbol XR440</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Symbol_XR440"/>
				<updated>2011-11-24T19:20:23Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet pills&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;], 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/ReaderJunits</id>
		<title>ReaderJunits</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/ReaderJunits"/>
				<updated>2011-11-24T19:19:29Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet supplements&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.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;best weight loss&amp;lt;/span&amp;gt;] 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/LLRP_Reader</id>
		<title>LLRP Reader</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/LLRP_Reader"/>
				<updated>2011-11-24T19:18:23Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;buy phentermine&amp;lt;/span&amp;gt;] (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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;diet pills&amp;lt;/span&amp;gt;] 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/GPIO</id>
		<title>GPIO</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/GPIO"/>
				<updated>2011-11-24T19:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]] [[category:EmulatorDoc]] [[category:EngineImplementation]]&lt;br /&gt;
=Purpose=&lt;br /&gt;
GPIO is a sort of serial interface that many readers support.  Usually, a reader will have a bank of GPI ports and a bank of GPO ports located on it.  (see [[http://www.rfidreview.org/index.php?option=com_content&amp;amp;task=view&amp;amp;id=14&amp;amp;Itemid=57&amp;amp;limit=1&amp;amp;limitstart=1| this]] for an a picture of how it looks on the alien reader).  They are just like &amp;quot;lines in&amp;quot; and &amp;quot;lines out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
GPIO is commonly used for communication with other devices (such as photo eyes or light stacks) to make the reader smarter.  Although the communication between the reader and the device conceivably could be defined by a complex, vendor-defined protocol, it is typically almost trivial; The reader only notices when a GPI line goes high or low (and&lt;br /&gt;
thus can be represented by a boolean value), and follows some business logic accordingly. For example, a reader could be configured to start a read when GPI port 1 goes high, or it might turn on GPO port 2 when a timer goes off.&lt;br /&gt;
&lt;br /&gt;
It is important to note the differences between GPI and GPO, and how these differences matter to a reader emulator. GPI lines are incoming lines from a smart device.  GPI events can trigger things to happen inside the reader, such as tag reads.  GPO is basically just output lines to other smart devices to turn them on, or trigger them in some&lt;br /&gt;
way. Therefore, GPO lines are not as important because, from the reader's point of view, they can only be turned off or turned on.  They cannot actually trigger anything inside of the reader to happen.&lt;br /&gt;
&lt;br /&gt;
=Class Structure=&lt;br /&gt;
==UML Diagram==&lt;br /&gt;
[[Image:GPIO_UML.png|thumb|600px|none|A class diagram representing the GPIO Components]]&lt;br /&gt;
==Components==&lt;br /&gt;
#'''GPIOState''' The GPIOState Object stores the state of a single GPI or GPO port.  It is only accessed through the GPIOController.  Before the state of the GPIOport can be changed, it must be enabled.  &lt;br /&gt;
#'''GPIOController''' The GPIOController is the main interface to GPIO.  It is similar to the [[radio]] in that the radio could be seen as an &amp;quot;antennaConroller&amp;quot;.  Internally, the Controller has two hashmaps.  One is a hashmap of GPIPorts, and one is GPOPorts.  It exposes methods that control these ports, and it is in this way that the GPIOController is an interface to the GPIOPorts.  It also extends Observable because components in a particular reader should observe the GPIOController to find out when GPI Events or GPO Events happen.  When the GPIOController calls its notifyObservers method, it will pass an arraylist of Objects as the additional argument (arg2 in the above diagram).  The first item will be a string that is either GPI_EVENT or GPO_EVENT, and the second is the port number that changed.  In this way a component in the specific reader can filter out GPIO Events that are not meant for it.&lt;br /&gt;
=Integration with Readers=&lt;br /&gt;
The GPIOController is an object in the reader's shared resources.  The parts of the reader that handle reader-specific GPIO logic have access to the controller through the share resources.  In addition, these parts of the readers can add themselves as observers of the GPIO controller so that they are notified when something changes &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;phentermine&amp;lt;/span&amp;gt;].  The followign two examples should help you get a grasp of how the various layers involved in GPIO interact.&lt;br /&gt;
==GPIO Layers: Setting GPI Port High==&lt;br /&gt;
[[Image:GPIOLayers.png|thumb|800px|none|A diagram showing the layers of the GPIO architecture and a message that sets a GPI port high]]&lt;br /&gt;
&lt;br /&gt;
===Component Description===&lt;br /&gt;
# '''IDE Layer''' The IDE layer allows a user to set GPI signals to high or low.  In addition it can observe GPO signals&lt;br /&gt;
# '''RMI Interface''' The RMI Interface is how the IDE and the Reader communicate.  It exposes the functionality of a reader to the outside world&lt;br /&gt;
# '''GPIO Controller Layer''' As described above, the GPIO controller is the component that manages the states of the GPI and GPO ports&lt;br /&gt;
# '''Java Method Call''' This is the public method interface that enables the GPIO Controller to talk to the Reader specific layer (such as the LLRP or the Alien Readers).&lt;br /&gt;
# '''Reader Layer''' This is the reader specific (e.g. LLRP or Alien) logic that decides what happens as a result of a GPI event.  For example, the LLRP reader can be set up so that a ROSpec begins executing when a GPI signal goes high.&lt;br /&gt;
#'''Network Communication Interface''' This is the interface between the reader and the Client program.  It is reader specific.  For example, with the alien reader, messages are sent in plain text.  For the LLRP reader, messages are byte-encoded in specific ways.  For the Awid reader, it is serial communication.&lt;br /&gt;
# '''Client Program Layer''' The client program is the edgeware program that controls the reader, for example TagCentric or the BEA server&lt;br /&gt;
&lt;br /&gt;
===Scenario Description===&lt;br /&gt;
In the above figure, GPI port 1 is set high by a user in the IDE.  The IDE then sends a message to the GPIOController via the RMI interface.  The Controller sets its internal port to high and then notifies any obervers inside of the particular reader.  In this case, there is an observer.  The observer sends a GPI event notification message to the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;adipex diet pills&amp;lt;/span&amp;gt;] reader client.&lt;br /&gt;
==GPIO Layers: Setting GPO Port High==&lt;br /&gt;
[[Image:GPIOLayers-SetGPOHigh.png|thumb|800px|none|A diagram showing the layers of the GPIO architecture and a message that sets a GPO port high]]&lt;br /&gt;
&lt;br /&gt;
===Component Description===&lt;br /&gt;
'''See above'''&lt;br /&gt;
===Scenario Description===&lt;br /&gt;
The client program sends a message to the reader to set a GPO port high (setting a GPO port high cannot be done in the IDE, because GPO ports are output, and should only be able to be observed in the IDE).  The reader-specific logic should tell the GPIOController to set a GPO port high.  The GPIOController lets the IDE know that a GOP port has been changed via the IDE's callback interface (for more information see [[Engine RMI Interface]])).  Now that the IDE is aware that a GPO port has changed states, it can take appropriate action to change something in the GUI to let the user know.&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/EdgeServerJMS</id>
		<title>EdgeServerJMS</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/EdgeServerJMS"/>
				<updated>2011-11-24T19:14:50Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=JMS in the Edge Server=&lt;br /&gt;
This page describes how JMS is used in the Edge Server&lt;br /&gt;
==A very, very brief JMS Introduction==&lt;br /&gt;
JMS (Java Messaging Service) is a standard for a messaging API as specified by JSR 914.  A ''JMS Provider'' is an implementation of the JMS specification. The idea is that there is a server whose job it is to route messages.  It is up to the provider to define exactly how this server works.  For example, some providers require you to start the server administratively from the command line and allow you to control it using JMX. Other providers allow you to start the server in your source code. &lt;br /&gt;
&lt;br /&gt;
There are two types of clients to the server.  A ''JMS Consumer'' will consume JMS Messages.  A ''JMS Producer'' will send messages to the server.  &lt;br /&gt;
&lt;br /&gt;
There are two ways to use JMS.  You can either use a ''point-to-point'' model, or you can use a ''publish-subscribe'' model.  The basic difference is that with the point-to-point model, for every message produced, there is at most one consumer.  With the publish-subscribe model, there can be more than one consumer.  Point-to-point implementations will use a ''JMS Queue'' as a destination.  Publish-subscribe implementations will use a ''JMS Topic''. For a better explanation &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet pills&amp;lt;/span&amp;gt;], see: this [http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html|FAQ article].&lt;br /&gt;
&lt;br /&gt;
Rifidi Edge Server uses ActiveMQ as its provider.  With ActiveMQ, the server is called a Broker.  Rifidi uses Spring to create and start the broker.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
The Rifidi Edge Server uses JMS (ActiveMQ) to pass certain kinds of data from component to component. The Edge Server separates its usage of JMS into two logical components:&lt;br /&gt;
&lt;br /&gt;
* Internal Message Bus - This is used for tag data that is collected by sensor plugins (e.g. Commands executing on an Alien9800 session).  It is implemented using an ActiveMQ broker with one Destination (specifically a Topic).  Since it is only used internally, clients (both producers and consumers) connect to it using a VM connection.&lt;br /&gt;
&lt;br /&gt;
* External Notification - This is used to expose tag events and notification events to software outside the Edge Server. It is implemented using an ActiveMQ broker with two Destinations (one Topic for tag events and one for notification events).  Clients to the broker (both producers and consumers) can connect to it using &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] a VM connection.  Clients external to the edge server can use a TCP connection.&lt;br /&gt;
&lt;br /&gt;
There are two kinds of events used in the Rifidi Edge Server:&lt;br /&gt;
&lt;br /&gt;
* Tag Events - These events consist of tag data produced by sensors (depicted in blue below)&lt;br /&gt;
&lt;br /&gt;
* Notification Events - These are system events such as a new reader being created, a session state change, or a property on a reader changing. (depicted in red below)&lt;br /&gt;
&lt;br /&gt;
[[Image:Edgeserverjms.png|thumb|center|500px|none]]&lt;br /&gt;
&lt;br /&gt;
The image above shows commands (JMS Producers) producing tag events and sending them to the internal topic.  Other components (such as ReaderFactories) produce notification events.  There are two consumers of events that are put on the internal topic: Esper (which uses the events as a stream for event stream processing) and the notification plugin (which simply relays the events to the external tags topic. External Edge Server clients can then connect to the two external topics to get notification and tag events.&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
There several JMS objects that are automatically created when the Edge Server starts up (inside jms.xml in the spring folder of the JMS bundle).  These objects should be reused when applicable.  The objects that should be reused are made available as OSGi services.  To see the description of the JMS OSGi Services see &lt;br /&gt;
&lt;br /&gt;
[[Edge_Server_Architecture#JMS_Services]]&lt;br /&gt;
&lt;br /&gt;
===Broker===&lt;br /&gt;
As mentioned above, there are two brokers: an internal and and external one.  You can connect to either broker within the edge server using a vm connection. &lt;br /&gt;
* For the internal broker use this url: vm://internalBroker&lt;br /&gt;
* For the external broker use this url: vm://externalBroker&lt;br /&gt;
* To create a connection to the external broker from outside the vm, you can use this url: tcp://localhost:1099&lt;br /&gt;
===Destination===&lt;br /&gt;
There are three topic automatically created:&lt;br /&gt;
* &amp;lt;tt&amp;gt;org.rifidi.edge.external.notifications&amp;lt;/tt&amp;gt; - Used to send system messages to software outside of the edge server&lt;br /&gt;
* &amp;lt;tt&amp;gt;org.rifidi.edge.external.tags&amp;lt;/tt&amp;gt; - Used to send tag events to software outside of the edgeserver&lt;br /&gt;
* &amp;lt;tt&amp;gt;org.rifidi.edge.internal&amp;lt;/tt&amp;gt; - Used to collect tag messages from sensors&lt;br /&gt;
&lt;br /&gt;
These three destinations are available as services in the OSGi registry.  The bean names are:&lt;br /&gt;
* &amp;lt;tt&amp;gt;externalNotificationsDest&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;externalTagsDest&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;internalDest&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can access them from another bundle as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Get a reference to the internal Message Buffer --&amp;gt;&lt;br /&gt;
&amp;lt;osgi:reference id=&amp;quot;internalMB&amp;quot; interface=&amp;quot;javax.jms.Topic&amp;quot; bean-name=&amp;quot;internalDest&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Connection Factories===&lt;br /&gt;
A connection factory allows JMS clients to create connections to the broker.  There are two connection factories available in the OSGi service registry (one for each broker).  Both connection factories use the vm transport.&lt;br /&gt;
* &amp;lt;tt&amp;gt;internalBrokerConFac&amp;lt;/tt&amp;gt; allows you to create connections to the internal broker&lt;br /&gt;
* &amp;lt;tt&amp;gt;externalBrokerConFac&amp;lt;/tt&amp;gt; allows you to create connections to the external broker&lt;br /&gt;
&lt;br /&gt;
you can access them from another bundle as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Get reference to connection factory to internal Broker --&amp;gt;&lt;br /&gt;
&amp;lt;osgi:reference id=&amp;quot;confac&amp;quot; interface=&amp;quot;javax.jms.ConnectionFactory&amp;quot; bean-name=&amp;quot;internalBrokerConFac&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Templates===&lt;br /&gt;
A template is a class provided by spring that helps you produce messages.  They are thread-safe and are intended to be used by multiple components.  If used without any kind of pooling, templates will create a JMS Connection, a JMS Session, JMS Producer each time it sends a message.  However, the two templates available in the OSGi registry wrap a connectionfactory in a &amp;lt;tt&amp;gt;PooledConnectionFactory&amp;lt;/tt&amp;gt; to avoid this problem.  These templates should usually not be used to consume messages and instead a &amp;lt;tt&amp;gt;SimpleMessageListenerContainer&amp;lt;/tt&amp;gt; (see below) should be used instead.  There are two templates available in the OSGi registry:&lt;br /&gt;
*&amp;lt;tt&amp;gt;internalJMSTemplate&amp;lt;/tt&amp;gt;.  This is used to produce messages and send them to the internal broker.  It wraps the &amp;lt;tt&amp;gt;internalBrokerConFac&amp;lt;/tt&amp;gt; and has its default destination set to &amp;lt;tt&amp;gt;org.rifidi.edge.internal&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;externalJMSTemplate&amp;lt;/tt&amp;gt; This is used to produce messages and send them to the external broker.  It wraps the &amp;lt;tt&amp;gt;externalBrokerConFac&amp;lt;/tt&amp;gt; and does not have a default destination set.&lt;br /&gt;
&lt;br /&gt;
You can access the templates from another bundle as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Get a reference to the internal message bus --&amp;gt;&lt;br /&gt;
&amp;lt;osgi:reference id=&amp;quot;internalMB&amp;quot; interface=&amp;quot;org.springframework.jms.core.JmsTemplate&amp;quot; bean-name=&amp;quot;internalJMSTemplate&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Setting up a Producer==&lt;br /&gt;
This section shows you how to set up a JMS producer in the Rifidi Edge Server&lt;br /&gt;
===Tag Producer===&lt;br /&gt;
Sensor plugins will need to be able have access to the internal message bus to add tag events to it.  In order to do this, they need to have this statement in their spring xml file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;osgi:reference id=&amp;quot;internalMB&amp;quot; interface=&amp;quot;org.springframework.jms.core.JmsTemplate&amp;quot; bean-name=&amp;quot;internalJMSTemplate&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because the &amp;lt;tt&amp;gt;internalJMSTemplate&amp;lt;/tt&amp;gt; already has the internal topic as its default destination, the spring xml does not need to get a destination out of the OSGi registry.&lt;br /&gt;
&lt;br /&gt;
Now they can pass this bean into the objects that will use it (for a sensor this is typically the ReaderFactory).&lt;br /&gt;
&lt;br /&gt;
To send a message, you might have to define a message creator that implements &amp;lt;tt&amp;gt;MessageCreator&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Used to create a JMS message to send to the Queue that collects Tag Data&lt;br /&gt;
	 * &lt;br /&gt;
	 * @author Kyle Neumeier - kyle@pramari.com&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	private class ObjectMessageCreator implements MessageCreator {&lt;br /&gt;
&lt;br /&gt;
		/** Message to send */&lt;br /&gt;
		private ActiveMQObjectMessage objectMessage;&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Constructor.&lt;br /&gt;
		 * &lt;br /&gt;
		 * @param tags&lt;br /&gt;
		 *            the tags to add to this message&lt;br /&gt;
		 */&lt;br /&gt;
		public ObjectMessageCreator(Set&amp;lt;TagReadEvent&amp;gt; tags) {&lt;br /&gt;
			super();&lt;br /&gt;
			objectMessage = new ActiveMQObjectMessage();&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				objectMessage.setObject(new ReadCycle(tags, reader, System&lt;br /&gt;
						.currentTimeMillis()));&lt;br /&gt;
			} catch (JMSException e) {&lt;br /&gt;
				logger.warn(&amp;quot;Unable to set tag event: &amp;quot; + e);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * (non-Javadoc)&lt;br /&gt;
		 * &lt;br /&gt;
		 * @see&lt;br /&gt;
		 * org.springframework.jms.core.MessageCreator#createMessage(javax.jms&lt;br /&gt;
		 * .Session)&lt;br /&gt;
		 */&lt;br /&gt;
		@Override&lt;br /&gt;
		public Message createMessage(Session arg0) throws JMSException {&lt;br /&gt;
			return objectMessage;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use the send method in the template to send the message to the broker.&lt;br /&gt;
&lt;br /&gt;
===Sending Tags to an External Source===&lt;br /&gt;
TODO: Since there will be classloading issues if you try to use ObjectMessages when sending tags to something that is running in a different JVM, it is better to serialize the object you are trying to send first into a ByteArrayMessage.  Then deserialize the message yourself when receiving it.&lt;br /&gt;
&lt;br /&gt;
==Setting up a Consumer==&lt;br /&gt;
To consume messages from a topic, you will need to add the following code to the spring xml file in your bundle&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;bean id=&amp;quot;jmsContainer&amp;quot;&lt;br /&gt;
		class=&amp;quot;org.springframework.jms.listener.SimpleMessageListenerContainer&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;autoStartup&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;connectionFactory&amp;quot; ref=&amp;quot;confac&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;destination&amp;quot; ref=&amp;quot;internalMB&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;messageListener&amp;quot; ref=&amp;quot;myMessageListener&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;acceptMessagesWhileStopping&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Get reference to connection factory to internal Broker --&amp;gt;&lt;br /&gt;
	&amp;lt;osgi:reference id=&amp;quot;confac&amp;quot; interface=&amp;quot;javax.jms.ConnectionFactory&amp;quot;&lt;br /&gt;
		bean-name=&amp;quot;internalBrokerConFac&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Get a reference to the internal Message Buffer --&amp;gt;&lt;br /&gt;
	&amp;lt;osgi:reference id=&amp;quot;internalMB&amp;quot; interface=&amp;quot;javax.jms.Topic&amp;quot;&lt;br /&gt;
		bean-name=&amp;quot;internalDest&amp;quot; /&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;!-- Create a message listener --&amp;gt;&lt;br /&gt;
	&amp;lt;bean id=&amp;quot;myMessageListener&amp;quot; class=&amp;quot;org.rifidi.edge.examplecode.JMSConsumer&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only tricky part is creating the message listener.  This is a class that implements the &amp;lt;tt&amp;gt;javax.jms.MessageListener&amp;lt;/tt&amp;gt; interface.  It has a method called &amp;lt;tt&amp;gt;onMessage()&amp;lt;/tt&amp;gt; in which you need to implement the custom logic that happens when a message is recieved.  For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @author Kyle Neumeier - kyle@pramari.com&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
public class JMSConsumer implements MessageListener {&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * (non-Javadoc)&lt;br /&gt;
	 * &lt;br /&gt;
	 * @see javax.jms.MessageListener#onMessage(javax.jms.Message)&lt;br /&gt;
	 */&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onMessage(Message arg0) {&lt;br /&gt;
		System.out.println(&amp;quot;Got message!&amp;quot;);&lt;br /&gt;
		//process arg0 here!!!&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
There are still a few open questions about whether or not we are using JMS and spring correctly or not:&lt;br /&gt;
* From the debug output observed it appears a new connection, reciever, and session are being created every time a new message is received.  This makes me believe that &amp;lt;tt&amp;gt;org.springframework.jms.listener.SimpleMessageListenerContainer&amp;lt;/tt&amp;gt; might be too simplistic and may need to be wrapped in a pool of some sort.&lt;br /&gt;
* Not sure if psersistance is really being disable.&lt;br /&gt;
* Right now the IP address of the external broker is hardcoded as localhost:1099.  It appears however, that I can still connect to it even from a different machine.  We need to figure out if this is ok.  Also, we need a way to specify the port from the vm arguments passed in when the edge server first starts up.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
A few links that I found useful when reading up on JMS &amp;amp; spring:&lt;br /&gt;
&lt;br /&gt;
* http://www.nabble.com/In-VM-broker-td1813663.html#a1813663&lt;br /&gt;
* http://www.nabble.com/embedded-broker-and-in-VM-protocol-td4637423.html#a4637423&lt;br /&gt;
* http://forum.springsource.org/showthread.php?t=62958&lt;br /&gt;
* http://activemq.apache.org/vm-transport-reference.html&lt;br /&gt;
* http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html&lt;br /&gt;
* http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html&lt;br /&gt;
* http://www.nabble.com/JMS-pooling...-pool-package-in-activeMQ-td21811493.html&lt;br /&gt;
* http://activemq.apache.org/vm-transport-reference.html&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Edge_Server_Getting_Started</id>
		<title>Edge Server Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Edge_Server_Getting_Started"/>
				<updated>2011-11-24T19:13:55Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thank you for your interest in the Rifidi Edge Server -- an open source platform for developing and deploying RFID applications. Here's how to get started:&lt;br /&gt;
&lt;br /&gt;
==Run it==&lt;br /&gt;
# '''Download''' the [http://sourceforge.net/projects/rifidi/ Edge Server] from our sourceforge page. The download comes bundled with two programs: the '''Edge Server''' which does the core work of connecting to sensors (such as RFID readers), collecting tag information, and making that data available. It ships with adapters for Alien, LLRP, Awid, and several other types of RFID readers. It also &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.herbalweightlossaid.com/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;slimming pills&amp;lt;/span&amp;gt;] ships with ALE support. The second program is '''Workbench''' which is a user interface that allows you to control the edge server and view tag information that it is collecting, as well as experiment with ALE.&lt;br /&gt;
# '''Download''' [http://sourceforge.net/projects/rifidi/files/ Rifidi Emulator]. This program allows you to &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://maleextrareviews.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;maleextra&amp;lt;/span&amp;gt;] virtualize several popular types of RFID readers on your desktop. &lt;br /&gt;
# '''Follow''' the [[Workbench User's Guide|quick start guide]] to start getting tag reads back from virtual readers.&lt;br /&gt;
&lt;br /&gt;
==Develop Your Own Application==&lt;br /&gt;
The edge server by itself allows you to connect to &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.smartpixels.net/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;seo India&amp;lt;/span&amp;gt;] sensors and collect tag data from them, but if you really want to put it to work, you will need to develop your own applications that run on the edge server.&lt;br /&gt;
# '''Download''' our SDK (Standard Development Kit). This provides our API, sourcecode and &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.intivarreview.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;intivar&amp;lt;/span&amp;gt;] examples to help you get started. You can find out how to set up a development &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.eyesecretsreview.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;eye secrets&amp;lt;/span&amp;gt;] environment here: [[Edge Server Development Environment]].&lt;br /&gt;
# '''Develop''' an application. There are several example &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://buysexualenhancers.com/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;sexual enhancers&amp;lt;/span&amp;gt;] applications which ship with the Rifidi Edge Server. You can read about them in detail in the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.performer5pills.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;performer5&amp;lt;/span&amp;gt;] developer guide that is included in the release&lt;br /&gt;
# [[How_to_export_your_custom_Rifidi_application|'''Export''']] your application&lt;br /&gt;
# '''Deploy''' the application you've built. Once you've built and tested your &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://buybreastenlargement.com/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;breast enlargements&amp;lt;/span&amp;gt;] application, you can deploy it onto the edge &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet supplements&amp;lt;/span&amp;gt;] server that you've downloaded.&lt;br /&gt;
&lt;br /&gt;
==Contribute Back==&lt;br /&gt;
The Rifidi Edge Server is open source. This means that if you find bugs or have ideas for useful features, you have the ability to extend the edge server yourself! We will gladly welcome &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.instantperformeroil.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;instant performer&amp;lt;/span&amp;gt;] contributions of any sort (code, documentation, testing, etc) and encourage you to submit these back. To get involved with the community:&lt;br /&gt;
# '''Visit''' our [http://forums.rifidi.org forums]. This is the best place to talk to our developers and users of Rifidi.&lt;br /&gt;
# '''Submit''' feature requests and bug reports. We have a [https://trac.rifidi.org bug tracking system] that manages outstanding feature requests and bugs. Before you submit bug reports here &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.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;best weight loss&amp;lt;/span&amp;gt;], we ask that you visit us on the forums first and make sure that there isn't a known solution for your question already&lt;br /&gt;
# '''Contribute''' to our wiki. We gladly welcome any documentation in the form of HOWTOs, example code, tutorials, or any other form that you find helpful.&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Edge_Server_Console</id>
		<title>Edge Server Console</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Edge_Server_Console"/>
				<updated>2011-11-24T19:12:05Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists the various commands that you can use to control and configure the edge server from the OSGi console.&lt;br /&gt;
=Use=&lt;br /&gt;
Start up the edge server and wait for it to finish initializing.  Once it is done, you will be able to type commands at the prompt.  It is also possible to interact with the edge server remotely.  To do this, see the information on the [[Edge_Server_Configuration#Console | console configuration option]]&lt;br /&gt;
=Commands=&lt;br /&gt;
==Listing Current State==&lt;br /&gt;
;readertypes&lt;br /&gt;
: List the types of readers adapters that are supported through installed reader plugins&lt;br /&gt;
;commandtypes&lt;br /&gt;
: List the types of commands that are supported through installed command plugins&lt;br /&gt;
;readers&lt;br /&gt;
: List the available reader configurations&lt;br /&gt;
;commands&lt;br /&gt;
: List the available command configurations&lt;br /&gt;
&lt;br /&gt;
==Reader Configurations==&lt;br /&gt;
; createreader &amp;lt;readertype&amp;gt; [&amp;lt;prop&amp;gt; &amp;lt;val&amp;gt;]*&lt;br /&gt;
: Create a reader configuration.  You must supply a readertype (from the output of the &amp;lt;tt&amp;gt;readertypes&amp;lt;/tt&amp;gt; command).  If called with no other arguments, a reader configuration with default properties will be created. You may change default properties, by supplying &amp;lt;tt&amp;gt;prop val&amp;lt;/tt&amp;gt; pairs. The output of this command will give you the ID of the reader configuration, which you will need to control the reader later.  A few examples:&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;createreader Alien&amp;lt;/tt&amp;gt; - Create an Alien9800 reader configuration with default properties.&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;createreader Alien IpAddress 192.168.1.115 Port 23&amp;lt;/tt&amp;gt; - Create an Alien reader configuration with the supplied IP and Port properties. &lt;br /&gt;
;deletereader &amp;lt;readerID&amp;gt;&lt;br /&gt;
: Delete a reader configuration. You must supply the ID of the reader configuration to delete (The ID was the output of the &amp;lt;tt&amp;gt;createreader&amp;lt;/tt&amp;gt; command).&lt;br /&gt;
&lt;br /&gt;
==Command Configuration==&lt;br /&gt;
;createcommand &amp;lt;commandtype&amp;gt; [&amp;lt;prop&amp;gt; &amp;lt;val&amp;gt;]*&lt;br /&gt;
Create a command configuration.  You must supply a commandtype (from the output of the &amp;lt;tt&amp;gt;commandtypes&amp;lt;/tt&amp;gt; command).  If called with no other arguments, a command configuration with default properties will be created. You may change default properties, by supplying &amp;lt;tt&amp;gt;prop val&amp;lt;/tt&amp;gt; pairs. The output of this command will give you the ID of the command configuration, which you will need to control the command later.  A few examples:&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;createcommand Alien9800-GetTagList&amp;lt;/tt&amp;gt; - Create an Alien9800 command configuration that gets tags with default properties.&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;createcommand Alien9800-GetTagList tagtype 1&amp;lt;/tt&amp;gt; - Create an Alien9800 command configuration that gets only Gen2 tags.&lt;br /&gt;
;deletecommand &amp;lt;commandID&amp;gt;&lt;br /&gt;
:Delete a command configuration. You must supply &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;buy phentermine&amp;lt;/span&amp;gt;] the ID of the command configuration to delete (The ID was the output of the &amp;lt;tt&amp;gt;createcommand&amp;lt;/tt&amp;gt; command).&lt;br /&gt;
&lt;br /&gt;
==Properties==&lt;br /&gt;
;getproperties &amp;lt;id&amp;gt;&lt;br /&gt;
: List the properties of the configuration.  The ID can either be a reader configuration ID or a command configuration ID.&lt;br /&gt;
;setproperties &amp;lt;id&amp;gt; [&amp;lt;prop&amp;gt; &amp;lt;val&amp;gt;]*&lt;br /&gt;
: Set the properties on a configuration.  You must supply either a reader configuration ID or a command configuration ID.  Then you can list &amp;lt;tt&amp;gt;prop val&amp;lt;/tt&amp;gt; pairs.&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;setproperties Alien9800_1 RFAttenuation 100&amp;lt;/tt&amp;gt; - Set the RFAttenuation to 100 on Alien9800_1 reader configuration.&lt;br /&gt;
;applypropertychanges &amp;lt;readerID&amp;gt;&lt;br /&gt;
:Some properties of readers (e.g. RFAttenuation) need to be sent across the wire and set on the device itself.  This command collects the properties that have changed since the last time it was called and sends all those property changes at once to the reader.&lt;br /&gt;
&lt;br /&gt;
==Sessions==&lt;br /&gt;
;createsession &amp;lt;readerID&amp;gt;&lt;br /&gt;
:Creates a session to communicate with the reader device.  You must supply the ID of the reader configuration to use.  This command &lt;br /&gt;
;deletesession &amp;lt;readerID&amp;gt; &amp;lt;sessionID&amp;gt;&lt;br /&gt;
: Delete the session.  You must supply the ID of the reader configuration and the ID of the session to delete.&lt;br /&gt;
prints out the ID of the session that was created.&lt;br /&gt;
;startsession &amp;lt;readerID&amp;gt; &amp;lt;sessionID&amp;gt;&lt;br /&gt;
: Causes the session to establish a physical connection with the device (such as a TCP/IP connection).  Once the session has been started, commands can be sent to the reader device.&lt;br /&gt;
;stopsession &amp;lt;readerID&amp;gt; &amp;lt;sessionID&amp;gt;&lt;br /&gt;
: Causes the session to disconnect from the reader device.  You must supply the ID of the reader configuration and the ID of the session to stop&lt;br /&gt;
;executecommand &amp;lt;readerID&amp;gt; &amp;lt;sessionID&amp;gt; &amp;lt;commandID&amp;gt; &amp;lt;interval&amp;gt;&lt;br /&gt;
: Starts the execution of commands on a reader device.  You must supply the ID of the reader configuraiton, the ID of the session in the reader configuration, the ID of the command configuration that should be executed on the session, and an interval in milliseconds that is how often the command should be excuted.  If the command should only be executed once, iterval should be 0. If the command is scheduled for repeated execution, the session will assign the command a job ID that can be used to stop its execution with the &amp;lt;tt&amp;gt;killcommand&amp;lt;/tt&amp;gt; command.&amp;lt;br&amp;gt; &amp;lt;tt&amp;gt;executecommand Alien9800_1 1 Alien9800_GetTagList_1 1000&amp;lt;/tt&amp;gt; - Execute the GetTagList command on AlienReader_1 session 1 once every second.&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;executecommand LLRP_1 1 LLRPROSpecCommand 0&amp;lt;/tt&amp;gt; - Execute the LLRPROSpec command on LLRP_1 session 1 only once.&lt;br /&gt;
;killcommand &amp;lt;readerID&amp;gt; &amp;lt;sessionID&amp;gt; &amp;lt;jobID&amp;gt;&lt;br /&gt;
: Causes a scheduled command to stop being executed.  You must give the ID of the reader configuration and the ID of the session where the command is being executed as well as the job ID.&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
;save&lt;br /&gt;
:Persists the configuration of the edge server (reader configurations and command configurations to a file)&lt;br /&gt;
;setloglevel &amp;lt;logger&amp;gt; &amp;lt;level&amp;gt;&lt;br /&gt;
:Sets the level of log output.  You must supply a logger name, which can be a class name or a package name as well as a log level.  Log levels can be (in order)[FATAL|ERROR|WARN|INFO|DEBUG]. More specific loggers take precedent over less specific ones. For example, if I set the logger level of org.rifidi.edge to INFO (so that I will see info level log statements and above in any class in the org.rifidi.edge package), and I set org.rifidi.edge.core to DEBUG, I will see debug level &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;diet pills&amp;lt;/span&amp;gt;] and above from anything in and under org.rifidi.edge.core, because it is more specific than org.rifidi.edge&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Edge_Server_Configuration</id>
		<title>Edge Server Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Edge_Server_Configuration"/>
				<updated>2011-11-24T19:10:04Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains the various configuration options of the Rifidi Edge Server&lt;br /&gt;
=RifidiEdgeServer.ini=&lt;br /&gt;
The RifidiEdgeServer.ini is a property file that contains options for various options when the edge server starts up.  &lt;br /&gt;
==rifidiserver.ini file==&lt;br /&gt;
As of release 1.2.0, the default rifidiserver.ini file looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-os&lt;br /&gt;
${target.os}&lt;br /&gt;
-ws&lt;br /&gt;
${target.ws}&lt;br /&gt;
-arch&lt;br /&gt;
${target.arch}&lt;br /&gt;
-nl&lt;br /&gt;
${target.nl}&lt;br /&gt;
-vmargs&lt;br /&gt;
-Declipse.ignoreApp=true&lt;br /&gt;
-Dosgi.console&lt;br /&gt;
-Dosgi.noShutdown=true&lt;br /&gt;
-Dorg.rifidi.edge.configuration=config/rifidi.xml&lt;br /&gt;
-Dosgi.clean=true&lt;br /&gt;
-Dorg.osgi.framework.bootdelegation=javax.xml.ws&lt;br /&gt;
-Dcom.sun.management.jmxremote.port=2021&lt;br /&gt;
-Dcom.sun.management.jmxremote.authenticate=false&lt;br /&gt;
-Dcom.sun.management.jmxremote.ssl=false&lt;br /&gt;
-Djava.rmi.server.hostname=127.0.0.1&lt;br /&gt;
-Dorg.rifidi.edge.core.rmi.port=1101&lt;br /&gt;
-Dorg.rifidi.edge.ale.port=8081&lt;br /&gt;
-Dorg.rifidi.edge.ale.host=127.0.0.1&lt;br /&gt;
-Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook&lt;br /&gt;
-Dorg.aspectj.osgi.verbose=true&lt;br /&gt;
-Dorg.rifidi.edge.autostart=true&lt;br /&gt;
-Dorg.rifidi.edge.logging=config/logging.properties&lt;br /&gt;
-Dorg.rifidi.ui.notify=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Console==&lt;br /&gt;
;-console&lt;br /&gt;
:This starts up the OSGi console so that you can interact with the edge server from the command line.  For a list of commands that are available see [[Edge Server Commands]].  If you would like the console to be available over the network, supply a port after the -console (e.g. -console 2020). Now it is possible to telnet into the server at the given port.  It is recommended that you use ssh tunneling for security reasons (i.e. first ssh to the machine that is running the edge server, then telnet to the console). One &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.performer5pills.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;performer5&amp;lt;/span&amp;gt;] thing to note is that after you telnet to the OSGi console, you cannot use &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://vihan.vn&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; thiet ke web&amp;lt;/span&amp;gt;] the &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; command as you normally would to &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://maleextrareviews.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;maleextra&amp;lt;/span&amp;gt;] close the telnet session.  This is because &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; will be caught by the OSGi console and will perform a System.exit().  Instead, to exit the telnet session &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx&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;diet pills&amp;lt;/span&amp;gt;] while keeping the server running, just close the telnet window.&lt;br /&gt;
&lt;br /&gt;
==VMArgs==&lt;br /&gt;
VMArgs must follow the &amp;lt;tt&amp;gt;-vmargs&amp;lt;/tt&amp;gt; flag in the .ini file.  They must &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.instantperformeroil.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;instant performer&amp;lt;/span&amp;gt;] start with &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;.  Default values can be found in the &amp;lt;tt&amp;gt;bundle.properties&amp;lt;/tt&amp;gt; file in the spring directory for the appropriate &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;phentermine&amp;lt;/span&amp;gt;] option. Important VM args:&lt;br /&gt;
;-Dorg.rifidi.edge.configuration&lt;br /&gt;
:This is the path to the persistence file. See [[#rifidi.xml]].&lt;br /&gt;
;-Dcom.sun.management.jmxremote.port&lt;br /&gt;
:The port to open up JMX on.  This is important if you are using a program like VisualVM to profile the server&lt;br /&gt;
;-Djava.rmi.server.hostname&lt;br /&gt;
:The hostname to open up the RMI registry at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.core.rmi.port&lt;br /&gt;
:The port of the RMI registry Default is &amp;lt;tt&amp;gt;1101&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.host&lt;br /&gt;
:The hostname to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.port&lt;br /&gt;
:The port to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;8081&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.read&lt;br /&gt;
:The service name of the ALE reading service.  Default is &amp;lt;tt&amp;gt;ALEService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.logicalreader&lt;br /&gt;
:The service name of the ALE logical reader service. Default is &amp;lt;tt&amp;gt;ALELRService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.home&lt;br /&gt;
:The Rifidi directory. If not set, it defaults to ${user.dir}&lt;br /&gt;
;-Dorg.rifidi.ui.notify&lt;br /&gt;
:If set to true, reader adapters will send tag notifications to workbench. Default is true&lt;br /&gt;
&lt;br /&gt;
=rifidi.xml=&lt;br /&gt;
The rifidi.xml file is the persistence file for the Rifidi Edge Server.  The two important services that are saved are Reader Configurations and Command Configurations.&lt;br /&gt;
&lt;br /&gt;
==Loading a configuration file==&lt;br /&gt;
Whenever the edge server starts up, it looks for the file that is specified in the &amp;lt;tt&amp;gt;org.rifidi.configuration&amp;lt;/tt&amp;gt; vm flag. After the configuration file is read, the server will attempt to recreate all &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.smartpixels.net/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;seo India&amp;lt;/span&amp;gt;] services specified in the file.  If a needed factory is not available, the service will be skipped and &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.seoagency.com.vn/seo.php&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; dich vu seo&amp;lt;/span&amp;gt;] recreated when the factory &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.eyesecretsreview.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;eye secrets&amp;lt;/span&amp;gt;] becomes available.  For example, suppose the configuration file has an Alien Reader Configuration and an &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.seoagency.com.vn&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; cong ty seo&amp;lt;/span&amp;gt;] LLRP Reader Configuration.  Suppose that when  the server starts up, only the Alien plugin is available (so the Alien Reader Factory is &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://buybreastenlargement.com/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;breast enlargements&amp;lt;/span&amp;gt;] available, but the LLRP Reader &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.intivarreview.info/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;intivar&amp;lt;/span&amp;gt;]Factory is not).  At this point the Alien &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.herbalweightlossaid.com/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;slimming pills&amp;lt;/span&amp;gt;] Reader is recreated.  If later the LLRP plugin is installed, then the LLRP reader will be recreated.&lt;br /&gt;
&lt;br /&gt;
==File Structure==&lt;br /&gt;
The edge server uses JAXB to persist a configuration file &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;diet pills&amp;lt;/span&amp;gt;].  Each service will have a serviceID and a factoryID.  The serviceID is the unique name of the service, and is used when using the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://buysexualenhancers.com/ &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;sexual enhancers&amp;lt;/span&amp;gt;] service (such as starting a session on a reader).  The factoryID is the ID of the factory that can create a service.   The following is an example of file that &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;diet supplements&amp;lt;/span&amp;gt;] has one Alien Reader saved.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;configurationStore&amp;gt;&lt;br /&gt;
    &amp;lt;services&amp;gt;&lt;br /&gt;
        &amp;lt;attributes&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;ReconnectionInterval&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;500&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;Port&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;20000&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;InvertExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;PersistTime&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;-1&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;Username&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;alien&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;Password&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;password&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;InvertExternalInput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;ReaderNumber&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;ExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;IpAddress&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;MaxNumConnectionAttempts&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;RFAttenuation&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/attributes&amp;gt;&lt;br /&gt;
        &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
        &amp;lt;serviceID&amp;gt;Alien_1&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
    &amp;lt;/services&amp;gt;&lt;br /&gt;
&amp;lt;/configurationStore&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Edge_Server_Architecture</id>
		<title>Edge Server Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Edge_Server_Architecture"/>
				<updated>2011-11-24T19:08:29Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-Adipex-Medicine.aspx &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;what is adipex&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] 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.core&lt;br /&gt;
: Provides configuration &amp;amp; persistence, Management of reader and command configurations, Abstract classes and interfaces for sensor plugins to implement, and Esper,&lt;br /&gt;
;org.rifidi.edge.core.rmi.server&lt;br /&gt;
: Exposes core functionality via RMI for outside clients (especially UIs) to use to control the edge server.  It exposes roughly the same functionality as the console. For more information about how to expose a service using RMI see: [[How to export a service using RMI]]&lt;br /&gt;
;org.rifidi.edge.core.services&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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Documentation_Guidelines</id>
		<title>Documentation Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Documentation_Guidelines"/>
				<updated>2011-11-24T19:07:27Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet pills&amp;lt;/span&amp;gt;] rather than worrying too much about the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.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;best weight loss&amp;lt;/span&amp;gt;] 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Awid_MPR</id>
		<title>Awid MPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Awid_MPR"/>
				<updated>2011-11-24T19:06:11Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet supplements&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;diet pills&amp;lt;/span&amp;gt;] 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/AWID_Edge_Server_Guide</id>
		<title>AWID Edge Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/AWID_Edge_Server_Guide"/>
				<updated>2011-11-24T19:04:44Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;buy phentermine&amp;lt;/span&amp;gt;], select 'One time Execution'.    &lt;br /&gt;
*Press 'Finish'.  Congratulations!  You are now reading tags from an Awid reader &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &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;adipex diet pills&amp;lt;/span&amp;gt;].  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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Alien_Example_Client</id>
		<title>Alien Example Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Alien_Example_Client"/>
				<updated>2011-11-24T19:03:37Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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;br /&gt;
&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;phentermine&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.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;best weight loss&amp;lt;/span&amp;gt;]&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Alien_Example_Client</id>
		<title>Alien Example Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Alien_Example_Client"/>
				<updated>2011-11-24T19:02:22Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-phentermine.aspx &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;phentermine&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.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;best weight loss&amp;lt;/span&amp;gt;], 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Alien_Autonomous_Edge_Server_Guide</id>
		<title>Alien Autonomous Edge Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Alien_Autonomous_Edge_Server_Guide"/>
				<updated>2011-11-24T19:01:09Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-Adipex-Medicine.aspx &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;what is adipex&amp;lt;/span&amp;gt;] 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 &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] 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>StevenCollins</name></author>	</entry>

	<entry>
		<id>https://wiki.rifidi.net/index.php/Alien_9800</id>
		<title>Alien 9800</title>
		<link rel="alternate" type="text/html" href="https://wiki.rifidi.net/index.php/Alien_9800"/>
				<updated>2011-11-24T18:59:50Z</updated>
		
		<summary type="html">&lt;p&gt;StevenCollins: &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 Alien 9800 is produced by Alien Technology.  It is a general purpose reader that can read Class 1 Gen 2 tags.  For an introduction on how to use the Alien reader see  the [[Alien_Beginners_Guide |Alien Beginner's Guide]]&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
:ALR 9800&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
:TCP/IP&lt;br /&gt;
;Communication:   &lt;br /&gt;
:LAN TCP/IP(RJ-45), RS-232&lt;br /&gt;
;Antennas:&lt;br /&gt;
:4 ports&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
: 4 Inputs, 8 Outputs&lt;br /&gt;
&lt;br /&gt;
===Historical Note===&lt;br /&gt;
The Alien reader was the first reader that Pramari implemented, so therefore some of code in the emulator (such as the timestamp information in the tags and the tag memory) is alien specific.  For more information about the structure of the emulator see [[Engine Overview]].&lt;br /&gt;
&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;
There is not a lot of documentation freely available, as it is not on Alien's website.  Documentation for this reader is bundled with the reader, so it can only be obtained by actually purchasing a reader.  However, some universities may have documentation available for use by its students.&lt;br /&gt;
===Client Tools===&lt;br /&gt;
The main client tools used for testing this program:&lt;br /&gt;
;Alien Tool&lt;br /&gt;
:The Alien Tool is a client program that ships with the reader.  It has an interesting look and feel.  Its tag grid mode is useful to determine if a reader is properly reading tags.&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.  The new version of BEA (version 3.0), also has an option to use autonomous mode to get &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &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;diet pills&amp;lt;/span&amp;gt;] tag reads&lt;br /&gt;
;Logic Alloy 1.0.10&lt;br /&gt;
:[[Logic Alloy]] ALE Server is an open source edgeware application.  It uses the alien reader's autonomous mode to obtain tag reads&lt;br /&gt;
;TagCentric&lt;br /&gt;
:[[TagCentric]] is an open source edgeware application that communicates with the alien reader via &amp;quot;on demand&amp;quot; commands.&lt;br /&gt;
;Example Client&lt;br /&gt;
:[[Alien Example Client]] shows how to connect to the alien reader using a simple java client.&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;
===Communication===&lt;br /&gt;
The Alien reader sends plain text messages over a TCP connection.  The connection can be easily tested by telnetting into the reader and issuing commands. The following is an example of a telnet session &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.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;best weight loss&amp;lt;/span&amp;gt;] and getting the tag list.  The reader is running at 192.168.2.100:20000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$ telnet 192.168.2.100 20000&lt;br /&gt;
Trying 192.168.2.100...&lt;br /&gt;
Connected to 192.168.2.100.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
***********************************************&lt;br /&gt;
*&lt;br /&gt;
* Alien Technology : RFID Reader&lt;br /&gt;
*&lt;br /&gt;
***********************************************&lt;br /&gt;
&lt;br /&gt;
Username&amp;gt;alien&lt;br /&gt;
alien&lt;br /&gt;
&lt;br /&gt;
Password&amp;gt;password&lt;br /&gt;
********&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alien &amp;gt;get taglist&lt;br /&gt;
get taglist&lt;br /&gt;
(No tags)&lt;br /&gt;
&lt;br /&gt;
Alien &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When connecting programatically, it is useful to supress the prompt.  This is done by prepending a 0x01 to the beginning of the text to be sent.  Also keep in mind that all commands are terminated by a carriage return and a line feed (0x0d 0x0a)&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model of the alien reader is based on the concept of persist time, which is the amount of time a tag stays in memory after having been seen by an antenna.  It is possible to change the persist time using the &amp;lt;code&amp;gt;set persistTime&amp;lt;/code&amp;gt; command.  For example, the following command will set the persist time to 500 ms. &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;Alien &amp;gt;set persistTime=500&lt;br /&gt;
set persistTime&lt;br /&gt;
PersistTime = 500&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the persistTime is set to a -1, the tag will persist in memory until a &amp;lt;code&amp;gt;get tagList&amp;lt;/code&amp;gt; operation is performed (either on-demand or autonomously).&lt;br /&gt;
&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
There are two main modes to get tags from an alien reader.  The simplest is &amp;quot;on demand&amp;quot; mode, in which the user simply issues a command and the reader sends back a tag list.  The Autonomous mode enables the reader to act as a client and send tag lists to a server at some location.&lt;br /&gt;
====On Demand====&lt;br /&gt;
To get tag reads in On Demand read, a user can send a 'get taglist' command, or more simply 't'.  The reader will respond with its tag list.&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
Autonomous mode is more complicated.  A user will set up several parameters, such as the notifyAddress (the address of the server where tag lists are to be sent), notifyTime (a time interval a which messages will be sent), notifyTrigger (a condition upon which to fire a message), and others.  When a trigger is fired, or the notify time has expired, a message that contains the tag list will be sent to the server.&lt;br /&gt;
&lt;br /&gt;
The interaction between AutoMode and NotifyMode is &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.sg/services/massage/sports-massage.html&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt; sports massage singapore&amp;lt;/span&amp;gt;] important to understand.  If AutoMode is on, but NotifyMode is off, no messages will be sent.  If NotifyMode is on but AutoMode is off, messages will be sent containing blank TagLists.&lt;br /&gt;
&lt;br /&gt;
Autonomous mode messages consist of an optional header (controlled by the NotifyHeader variable) followed by a list of tags which were read.  The message format (controlled by the NotifyFormat variable) can be xml, terse, string, or custom.&lt;br /&gt;
&lt;br /&gt;
The NotifyTime is a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.sg/services/sports-therapy.html&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt; sports injury singapore&amp;lt;/span&amp;gt;] variable that controls how often time-based messages are sent, and is specified in seconds.  If set to zero, automatic, time-based notification is disabled.  The tags contained in each message are the tags in the TagList (i.e. the reader's tag memory) at the time the message was fired; the reader essentially gets the TagList (in the same way that a user could in interactive mode by typing “get TagList”) at regular intervals and puts the results in a message.&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
The Alien Reader requires the user to log in. The default name and password is &amp;quot;alien/password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
&lt;br /&gt;
The following is a list of important features of the Alien reader that are properly emulated by Rifidi&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
&lt;br /&gt;
It is possible to log into the alien reader with a username and password.  The alien reader will not work until you are logged in.&lt;br /&gt;
&lt;br /&gt;
===Getting and Setting variables===&lt;br /&gt;
&lt;br /&gt;
The rifidi Alien reader allows users to get and set all variables, using the &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; commands.&lt;br /&gt;
&lt;br /&gt;
===Getting TagList===&lt;br /&gt;
&lt;br /&gt;
As mentioned previously, it is possible to get the tag list using the &amp;lt;code&amp;gt;get taglist&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
===Persist Time===&lt;br /&gt;
&lt;br /&gt;
The persist time controls how long a tag resides in memory before it is deleted.  It works except for a bug if the peresttime=-1 as explained below&lt;br /&gt;
&lt;br /&gt;
===Autonomous Mode===&lt;br /&gt;
&lt;br /&gt;
Most of the autonomous mode works except that notifyTrigger only works properly when set to &amp;lt;code&amp;gt;truefalse&amp;lt;/code&amp;gt;, and does not properly emulate the other possible values for it.&lt;br /&gt;
&lt;br /&gt;
===Supported Commands===&lt;br /&gt;
A list of commands supported by rifidi:&lt;br /&gt;
&lt;br /&gt;
====General Commands====&lt;br /&gt;
*Quit (q)&lt;br /&gt;
*get/set ReaderName&lt;br /&gt;
*get ReaderType&lt;br /&gt;
*get ReaderVersion&lt;br /&gt;
*get / set ReaderNumber&lt;br /&gt;
*get / set Username&lt;br /&gt;
*get / set Password&lt;br /&gt;
&lt;br /&gt;
====TagList Commands====&lt;br /&gt;
*get Taglist (t)&lt;br /&gt;
*get / set PersistTime&lt;br /&gt;
*get / set TagListFormat (possible values = text, terse, xml)&lt;br /&gt;
*clearTagList&lt;br /&gt;
*get / set TagType&lt;br /&gt;
&lt;br /&gt;
====Radio Commands====&lt;br /&gt;
*get / set AntennaSequence&lt;br /&gt;
&lt;br /&gt;
====Autonomous Commands====&lt;br /&gt;
*get / set AutoMode (possible values = on, off)&lt;br /&gt;
*get / set AutoFalseOutput&lt;br /&gt;
*get / set AutoFalsePause&lt;br /&gt;
*get / set AutoStartPause&lt;br /&gt;
*get / set AutoStartTrigger&lt;br /&gt;
*get / set AutoStopTimer&lt;br /&gt;
*get / set AutoStopTrigger&lt;br /&gt;
*get / set AutoStopTimer&lt;br /&gt;
*get / set AutoTrueOutput&lt;br /&gt;
*get / set AutoTruePause&lt;br /&gt;
*get / set NotifyMode&lt;br /&gt;
*get / set NotifyAddress&lt;br /&gt;
*get / set NotifyFormat (possible values = text, terse, xml)&lt;br /&gt;
*get / set NotifyTime&lt;br /&gt;
*get / set NotifyTrigger&lt;br /&gt;
*get / set NotifyHeader (possible values = on, off)&lt;br /&gt;
&lt;br /&gt;
====Program Tag Commands====&lt;br /&gt;
*get / set ProgAntenna&lt;br /&gt;
*ProgramTag&lt;br /&gt;
*get / set Function&lt;br /&gt;
&lt;br /&gt;
====GPIO Commands====&lt;br /&gt;
*get / set ExternalOutput&lt;br /&gt;
&lt;br /&gt;
==Bugs and Unsupported Features==&lt;/div&gt;</summary>
		<author><name>StevenCollins</name></author>	</entry>

	</feed>