We today got a USD 50 donation from Jewelry Judaica link to the project.
The tcp/ip interface
This howto describes linking of VSCP server interfaces. With a server interface we mean the VSCP tcp/ip control interface and especially the the VSCP link interface which is the required tcp/ip commands that all VSCP nodes exporting a VSCP interface must make available. You find the full list here.
A VSCP server has an extended command set that can handle many special task needed on a full server. An embedded node however often just need the more limited set of commands but can of course add any other commands it like to export available if needed.
Why link servers
Why link servers one may ask. There can be many reasons for this Security can be one. You may link a VSCP server to a higher end server with just event going upwards not downwards and by that prevent security threats as it will be impossible for the upward server to send events to the lower server. A typical scenario fr this is a server that show public data to an audience but where the source for the data is a real world system.
You maybe also just want to collect events from many subnets on a higher end server or some type of events on a special server.
Even more common is connections with lower end nodes that implement the tcp/ip interface and where you want to contact them from a server, to collect data, configure, control, instead of the other way around.
If you want a connection from/to a remote node that is always active, yes it will be maintained, automatically bring up the link if it falls, the tcp/ip link driver is the solution. It lets you set up a link between two machines where one is a VSCP server and where the other machine also can also be a VSCP server but more usually is a lower end node exporting a VSCP tcp/ip interface. The driver is extremely simple to use. Just add it, setup user connection data and set filters for outgoing and incoming events. The tcp/ip link driver is described in full detail here.
If you need to share a smaller selection of events with a remote node or just want to send events to a remote node when special things happen, or just want to filter events very hard, the decision matrix has an action that let you send events to a tcp/ip remote link interface.
Send event to remote host action
Its is the
action that is used for remote connections. A typical DM entry looks like this
<row enable="true" groupid="send_remote_test" > <comment> Test action send event </comment> <mask priority="0" class="0xFFFF" type="0xFFFF" GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" /> <filter priority="0" class="10" type="6" GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" /> <action>0x43</action> <param> 192.168.1.6;9598;admin;secret;%event </param> <index measurementindex="true">1</index> </row>
Here the temperature event that triggers the action is sent to a remote server (%event). You can of course set up to send any event you like or send an event that is stored in a variable.
A connection is opened and closed each time an event is sent so the driver is much more efficient to use for setups where a lot of events should be sent to a remote location. The actual transfer is on its own thread so timing is pretty constant also for a slow remote connection.
Measurement events is a central part of any VSCP system of course. The standardisation of measurement makes it possible to hook in parts to a system and read write measurement values in a deterministic way.
The VSCP server can collect measurements from many sources, it can convert them, send them further to other destinations, save them in databases, diagram data, well, do a lot with the values of measurements.
I show the XML format for setting this up here but the database can be used in the same way.
Every DM configuration row can have a measurement part that looks something like this
<measurement compare="eq" unit="1" value="5.014567" />
If this tag is in a DM row additional checks will be performed on an event before an action is triggered. Here the value of the measurement will be compared to the value 5.014567 for equality and if they are equal AND the unit is the same (here 1) the action will be triggered.
A typical full row for a temperature check will look like
<row enable="true" groupid="measurement_compare_test" > <comment> Test measurement compare: eq </comment> <mask priority="0" class="0xFFFF" type="0xFFFF" GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" /> <filter priority="0" class="10" type="6" GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" /> <action>0x10</action> <param> scripts/alarm.sh "match"%event </param> <index measurementindex="true">1</index> <!-- eq|neq|gt|gteq|lt|lteq --> <measurement compare="eq" unit="1" value="5.014567"/> </row>
Here we have a row that will execute the external script alarm.sh when a temperature event with a temperature given in degrees Celsius (unit=1) is received and the measurement value is equal to 5.014567
As you probably have expected you can do other compares to, like greater than, less than and so on. They are all listed here.
If you want to play further with this you have some test setups here.
Stay Hungry, stay foolish!