<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ice-online.com/index.php?action=history&amp;feed=atom&amp;title=RMIF</id>
	<title>RMIF - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ice-online.com/index.php?action=history&amp;feed=atom&amp;title=RMIF"/>
	<link rel="alternate" type="text/html" href="https://wiki.ice-online.com/index.php?title=RMIF&amp;action=history"/>
	<updated>2026-04-11T12:47:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://wiki.ice-online.com/index.php?title=RMIF&amp;diff=841&amp;oldid=prev</id>
		<title>ConvertBot: Remote Midas InterFace handles communication with remote processors</title>
		<link rel="alternate" type="text/html" href="https://wiki.ice-online.com/index.php?title=RMIF&amp;diff=841&amp;oldid=prev"/>
		<updated>2020-04-27T22:05:14Z</updated>

		<summary type="html">&lt;p&gt;Remote Midas InterFace handles communication with remote processors&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Remote Midas InterFace handles communication with remote processors&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;PORT&amp;gt;    - UDP port number for local node (may be output) use PORT=-1&lt;br /&gt;
            to use any available local port (NeXtMidas only).&lt;br /&gt;
&amp;lt;PROPS&amp;gt;   - Property list to export _:result|q:message|_pipe&lt;br /&gt;
&amp;lt;REMOTE&amp;gt;  - Host address and port of remote connection...&lt;br /&gt;
              NeXtMidas uses: {ID=&amp;lt;remoteId&amp;gt;,HP=&amp;quot;&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;quot;}&lt;br /&gt;
              X-Midas   uses: &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&amp;lt;ITEMS&amp;gt;   - List of remote properties to connect to (&amp;quot;|&amp;quot; separated list)&lt;br /&gt;
&amp;lt;REMOTEN&amp;gt; - Remote connection #2,...&lt;br /&gt;
&amp;lt;ITEMSN&amp;gt;  - List of remote properties #2,...&lt;br /&gt;
&lt;br /&gt;
Since there are X-Midas (C/FORTRAN) and NeXtMidas (Java) versions of this&lt;br /&gt;
primitive, (N) and (X) are used to indicate NeXtMidas or X-Midas only&lt;br /&gt;
capabilities, respectively.&lt;br /&gt;
&lt;br /&gt;
This command, when put in a macro, allows another X-Midas or NeXtMidas macro&lt;br /&gt;
access to any of the items listed.  These items may be messages, results&lt;br /&gt;
parameters, pipes, or files.  The remote connections will always have read&lt;br /&gt;
access to any parameter available through the results table.&lt;br /&gt;
&lt;br /&gt;
The /HTTP switch (NeXtMidas only) starts an Http server on the same port for&lt;br /&gt;
application status, debug, control, and file serving through a web browser.&lt;br /&gt;
For example, on the local node, the URL might be:  http://localhost:9000&lt;br /&gt;
&lt;br /&gt;
The protocol is modeled after Remote Method Invocation (RMI) - a distributed&lt;br /&gt;
object model for the Java programming language.  The underlying socket transport&lt;br /&gt;
is UDP.  A reliable data protocol (RDP) is implemented by RMIF to &amp;quot;guarantee&amp;quot;&lt;br /&gt;
delivery of messages (configurable with the RETRY attribute).&lt;br /&gt;
&lt;br /&gt;
The RMIF protocol definition allows for data packet formats: RAW, BINARY, ASCII,&lt;br /&gt;
or XML. Currently only RAW is used.&lt;br /&gt;
&lt;br /&gt;
The port number, along with the local node name, serve to identify this&lt;br /&gt;
interface within a subsystem.  When this routine sends packets to remote nodes,&lt;br /&gt;
the local address is attached to the packet, allowing the recipient to respond&lt;br /&gt;
directly to the sender.&lt;br /&gt;
&lt;br /&gt;
If the specified port is already in use and the /PRANGE switch is specified,&lt;br /&gt;
RMIF will search for a free port.  In this case the actual port number will be&lt;br /&gt;
written to the first results parameter (assuming that an ASCII input is&lt;br /&gt;
specified, if the input is numeric, this step is skipped).&lt;br /&gt;
&lt;br /&gt;
All results table entries are available to the local interface upon request&lt;br /&gt;
using the SET and GET messages.  The properties argument is a &amp;quot;|&amp;quot; separated&lt;br /&gt;
list of results, messages, pipes, or files that this interface can serve to&lt;br /&gt;
remote application interfaces without queries.  Once a remote interface issues&lt;br /&gt;
an OPEN on one of these properties, updates will be sent whenever new data is&lt;br /&gt;
available, until a CLOSE message is issued.  The list of properties is made&lt;br /&gt;
available through the GETKEYNAMES message allowing a macro to publish&lt;br /&gt;
properties available to be displayed or manipulated by client GUI's.&lt;br /&gt;
&lt;br /&gt;
The pairs of remote node:port and &amp;quot;|&amp;quot; separated items list define client&lt;br /&gt;
connections that should be automatic and permanent.  Remote properties that are&lt;br /&gt;
specified here are automatically reOPENed if the remote node is temporarily&lt;br /&gt;
unavailable for any reason (death, network, reboot, ...)&lt;br /&gt;
&lt;br /&gt;
Each remote connection can have differently tuned parameters using the Port&lt;br /&gt;
Parameter Table.  The /PPT={table} switch defines the default for all new&lt;br /&gt;
connections. See the switches section for specifics.&lt;br /&gt;
&lt;br /&gt;
Clients that have OPEN channels, regularly ping the remote server to verify&lt;br /&gt;
health and status.  The servers also ping the clients.  This ping interval can&lt;br /&gt;
be set with the /TIMEPING switch.  The /TIMEOUT switch specifies how many&lt;br /&gt;
seconds to wait for a response before closing the remote channels.  The PINGs&lt;br /&gt;
are still issued to poll for life, but channels are CLOSED.  When the remote&lt;br /&gt;
node starts responding again, the listed channels are reOPENED.&lt;br /&gt;
&lt;br /&gt;
For X-Midas clients, the /RECONN switch allows RMIF to try to reconnect to&lt;br /&gt;
servers that disconnect and return. All pipes must be the same format between&lt;br /&gt;
the two instances since X-Midas can't change pipe headers on the fly. The client&lt;br /&gt;
decided that the server has disconnected if it doesn't respond to a PING packet&lt;br /&gt;
within the timeout or if no pipe data has been transferred during this time. The&lt;br /&gt;
latter case could happen if the server were recycled between two PINGs. If the&lt;br /&gt;
connection has been dropped and you don't want to wait for the timeouts, you can&lt;br /&gt;
send an OPEN message (X-Midas client only) to force a reconnect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LIMITATIONS&lt;br /&gt;
===========&lt;br /&gt;
Packet Size:&lt;br /&gt;
  Note that RMIF has an internal 32 KiB buffer and, while it can transmit&lt;br /&gt;
  piped data with frame sizes or record lengths greater than this (by&lt;br /&gt;
  splitting the frames into multiple packets), they are subject to misalignment&lt;br /&gt;
  if any packets are lost. There is no internal means to realign the data, so&lt;br /&gt;
  use of RMIF with large buffer size is not recommended.&lt;br /&gt;
&lt;br /&gt;
  The 32 KiB limit comes from the max size of a IP packet used for UDP. The IP&lt;br /&gt;
  packet includes IP header, UDP header, RMIF header (fixed), RMIF adjunct&lt;br /&gt;
  header (internal use only). The remaining space is available for RMIF data.&lt;br /&gt;
  Buffer sizes slightly larger than 32KiB will often fit, but this should not&lt;br /&gt;
  be counted on.&lt;br /&gt;
&lt;br /&gt;
  RMIF uses RDP (over UDP) for sending control messages (this includes any&lt;br /&gt;
  messages sent via the macro). Consequently, it is subject to the same 32 KiB&lt;br /&gt;
  limitation.&lt;br /&gt;
&lt;br /&gt;
  RMIF was designed to transmit plot data and small control messages associated&lt;br /&gt;
  with the same data. RMIF is not intended as a means of reliable transport for&lt;br /&gt;
  other types of data (such as database queries, imagery, HTML, etc); there are&lt;br /&gt;
  many other protocols (TCP, HTTP, FTP, SCTP, etc) that are designed for this&lt;br /&gt;
  type of application.&lt;br /&gt;
&lt;br /&gt;
Network Bandwidth:&lt;br /&gt;
  The network bandwidth along with the max read/write rate limits the actual&lt;br /&gt;
  transmission rate of the UDP packets. If too many packets are sent at once,&lt;br /&gt;
  some of them will be lost.&lt;br /&gt;
&lt;br /&gt;
  RMIF uses RDP to counteract this by retransmitting the lost packets, but this&lt;br /&gt;
  can only do so much (a saturated network is likely to drop many of the packets&lt;br /&gt;
  on retransmit).&lt;br /&gt;
&lt;br /&gt;
  The WINDOW= (in the /PPT= table) controls the maximum number of RDP packets&lt;br /&gt;
  outstanding (sent, but not yet receipted). RMIF will buffer outgoing packets&lt;br /&gt;
  when the window fills up. This prevents RMIF from over-saturating the network&lt;br /&gt;
  with its own packets. Making the window too large (even sizes &amp;gt;32 can be &amp;quot;too&lt;br /&gt;
  large&amp;quot; on many networks) will result in RMIF saturating the network which&lt;br /&gt;
  then causes the RMIF packets to be lost.&lt;br /&gt;
&lt;br /&gt;
  The RETRY= parameter in the /PPT= table controls the number of retries that&lt;br /&gt;
  will be attempted. If /WINDOW= is too large, increasing RETRY= only makes a&lt;br /&gt;
  bad problem worse.&lt;br /&gt;
&lt;br /&gt;
Network Latency:&lt;br /&gt;
  Increasing WINDOW= (in the /PPT= table) on networks with high latency will&lt;br /&gt;
  improve performance since it allows more outstanding packets to be in transit&lt;br /&gt;
  at the same time.&lt;br /&gt;
&lt;br /&gt;
Faulty Network:&lt;br /&gt;
  Increasing RETRY= (in the /PPT= table) on networks with a high rate of packet&lt;br /&gt;
  loss or corruption will improve performance since it permits more transmission&lt;br /&gt;
  attempts in the event of a lost/corrupted packet. (Remember, if loss/error&lt;br /&gt;
  rate is 10%, the odds of a loss/error on retransmit are also 10%.)&lt;br /&gt;
&lt;br /&gt;
Faulty Networks With High Latency:&lt;br /&gt;
  This is what RMIF was designed for... the WINDOW= and RETRY= give users the&lt;br /&gt;
  control they need to &amp;quot;tune&amp;quot; RMIF so that it will run well on these networks.&lt;br /&gt;
  Just be careful not to oversaturate the network.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
COMPRESSION (X-Midas or NeXtMidas server, NeXtMidas clients)&lt;br /&gt;
============================================================&lt;br /&gt;
Compression is meant to be used on pipes destined for plotting. Compression&lt;br /&gt;
only works on pipes with FIXED-POINT SB data.  When using the NeXtMidas PLOT&lt;br /&gt;
command, the plot's rmif ID may be set to allow information to be sent so that&lt;br /&gt;
RMIF will compress the data to fill the plot screen.&lt;br /&gt;
&lt;br /&gt;
There are two types of compression, ONLY ONE of which is currently supported:&lt;br /&gt;
&lt;br /&gt;
1. Data - TBD&lt;br /&gt;
     There are hooks in place for this type of compression but it it not yet&lt;br /&gt;
  implemented.  This is completely recoverable non-lossy data compression&lt;br /&gt;
   (like zip).&lt;br /&gt;
&lt;br /&gt;
2. Plot - This is commonly used for plotting.&lt;br /&gt;
    In this mode, RMIF automatically chooses one of two modes based on the&lt;br /&gt;
  number of points per pixel.&lt;br /&gt;
    a.) BAND ( &amp;gt;= 3pts/pixel )&lt;br /&gt;
      Computes the upper and lower bounds giving a compression of &amp;gt;=1.5 times.&lt;br /&gt;
      For example, a 2k length frame would compress ~7 times in a plot window&lt;br /&gt;
      300 pixels wide.&lt;br /&gt;
    b.) PACK ( &amp;lt; 3pts/pixel )&lt;br /&gt;
      Computes the MAX of first point, and then 4bit deltas giving a compression&lt;br /&gt;
      of ~2x.&lt;br /&gt;
  When zoomed, the data not visible will also be thrown out.&lt;br /&gt;
&lt;br /&gt;
COPYING FILES from an RMIF server(N)&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Files may be transfered from an RMIF server to a client using HTTP or MFTP, the&lt;br /&gt;
Midas File Transfer Protocol.  For example,&lt;br /&gt;
&lt;br /&gt;
  nM&amp;gt; noop/gpw http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/Files/&amp;lt;aux&amp;gt;/remotefile.tmp localfile.tmp&lt;br /&gt;
or&lt;br /&gt;
  nM&amp;gt; noop/gpw mftp://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/Files/&amp;lt;aux&amp;gt;/remotefile.tmp localfile.tmp&lt;br /&gt;
&lt;br /&gt;
RMIF can find and transfer any MIDAS file in its' current AUX path.  To specify&lt;br /&gt;
the AUX, use the AUX qualifier or use the syntax:&lt;br /&gt;
&lt;br /&gt;
  nM&amp;gt; noop/gpw http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/Files/&amp;lt;aux&amp;gt;/remotefile.tmp localfile.tmp&lt;br /&gt;
&lt;br /&gt;
the MFTP protocol has additional qualifiers to tune the performance.&lt;br /&gt;
  PKTRATE = target bytes per second to transfer over the link&lt;br /&gt;
  PKTLEN  = length in bytes of individual UDP data packets (typically 1K - 8K)&lt;br /&gt;
  PKTTO   = timeout in seconds for request responses&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  nM&amp;gt; noop/gpw mftp://remotename:9000/Files/DAT/world.prm{PKTRATE=1e5,PKTTO=3}&lt;br /&gt;
      localfile.tmp&lt;br /&gt;
&lt;br /&gt;
See library help on MFTP for more information.&lt;br /&gt;
&lt;br /&gt;
Using an embedded server with the /HTTP switch&lt;br /&gt;
==============================================&lt;br /&gt;
If RMIF is run with the /HTTP switch, controls, files, and Queries can be&lt;br /&gt;
accessed from a remote node with the following syntax:&lt;br /&gt;
  * http://&amp;lt;server:port&amp;gt;/Controls  --&amp;gt; Returns HTML&lt;br /&gt;
  * http://&amp;lt;server:port&amp;gt;/Files/&amp;lt;AUX&amp;gt;/remotefile.prm&lt;br /&gt;
  * http://&amp;lt;server:port&amp;gt;/Query     --&amp;gt; Returns HTML&lt;br /&gt;
&lt;br /&gt;
For instance, to access a file on the server's DAT aux from a client,&lt;br /&gt;
  nM&amp;gt; noop http://&amp;lt;server:port&amp;gt;/Files/DAT/remotefile.prm localfile.prm&lt;br /&gt;
&lt;br /&gt;
To see an example of how this can be used run:&lt;br /&gt;
&lt;br /&gt;
  nM&amp;gt; sd360/server&lt;br /&gt;
&lt;br /&gt;
then point your browser to http://localhost:9000/ and from there you will have&lt;br /&gt;
links to files, controls and more.&lt;br /&gt;
&lt;br /&gt;
Messages: (X) = X-Midas Only, (N) = NeXtMidas Only, otherwise valid for both&lt;br /&gt;
  In X-Midas, SETKEY, ACKKEY, GETKEY, and RETKEY are homogeneous messages&lt;br /&gt;
    consisting of one 40 char address followed by pairs of 40 char keynames and&lt;br /&gt;
    40 char keyvalues. The KEYMSGSTRUCT struct in rmif.inc maps this message&lt;br /&gt;
    data. The NDATA field is dynamic depending on the number of keys per&lt;br /&gt;
    message. Namely NDATA=1+2*NKEY.  In NeXtMidas, these 4 messages are replaced&lt;br /&gt;
    by sending a SET, ACK, GET, or RET message to the ID of the remote&lt;br /&gt;
    itself. The system knows to route it through the RMIF connection.&lt;br /&gt;
  In NeXtMidas, when RMIF receives a SET, ACK, GET, or RET message that has a&lt;br /&gt;
    MSGNAME key in the data table, it's value is used as the message name to&lt;br /&gt;
    send the data (with the MSGNAME key/value removed from the table) to the&lt;br /&gt;
    upper level (i.e. the macro) instead of the SET, ACK, GET, or RET name.&lt;br /&gt;
  In X-Midas, the ADDR, KEYS, PROPS, and PING messages uses the INFO field to&lt;br /&gt;
    represent the index of the remote to send the message to. Valid input values&lt;br /&gt;
    are 1 to MAXREMOTE(32).&lt;br /&gt;
&lt;br /&gt;
  NOTE: Any messages to a remote must be with FUNC=SEND (not SENDW). Messages to&lt;br /&gt;
        the RMIF primitive can be with either SEND or SENDW. (N)&lt;br /&gt;
&lt;br /&gt;
        When sending messages to RMIF, the only why to know that it has been&lt;br /&gt;
        fully processed (client-side and server-side) is via the corresponding&lt;br /&gt;
        acknowledgments sent back to the macro. For example, an OPENED message&lt;br /&gt;
        is the acknowledge for the OPEN message. See below for details.&lt;br /&gt;
&lt;br /&gt;
  ACK     - Acknowledges a SET message. An ACK message sent to RMIF with a null&lt;br /&gt;
            remote value will notify all remotes of the attribute change.&lt;br /&gt;
            (X-Midas uses &amp;quot;ACKKEY&amp;quot; instead of &amp;quot;ACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  ADDC    - Add a channel to a property on a remote. (N)&lt;br /&gt;
              ID=&amp;lt;remote&amp;gt;&lt;br /&gt;
              NAME=&amp;quot;ADDC&amp;quot;&lt;br /&gt;
              INFO=&amp;lt;channel number, -1 for next available number&amp;gt;&lt;br /&gt;
              DATA=&amp;lt;property to monitor or &amp;quot;Q:ACK&amp;quot;&amp;gt;&lt;br /&gt;
            A &amp;quot;channel&amp;quot; is a real-time attribute (a pipe or server-side change&lt;br /&gt;
            to a result). If &amp;quot;Q:ACK&amp;quot; is specified, this setups a channel to&lt;br /&gt;
            receive all ACKs from the remote (server) that are sent directly to&lt;br /&gt;
            this RMIF or to all it's remotes (clients). Even though a table-like&lt;br /&gt;
            syntax maybe be used when specifying a pipe to map (e.g.&lt;br /&gt;
            &amp;quot;{_clientPipe=_serverPipe}&amp;quot;), RMIF treats the message data as a&lt;br /&gt;
            string. Examples:&lt;br /&gt;
&lt;br /&gt;
              nM&amp;gt; message send ID=RID NAME=&amp;quot;ADDC&amp;quot; INFO=1 &amp;amp;&lt;br /&gt;
                               DATA=&amp;quot;{_clientPipe=_serverPipe}&amp;quot;&lt;br /&gt;
              nM&amp;gt; message send ID=RID NAME=&amp;quot;ADDC&amp;quot; INFO=2 DATA=&amp;quot;SFREQ&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            Note: This message should only be sent after an OPENED message is&lt;br /&gt;
                  received from the remote in the processMessage procedure&lt;br /&gt;
                  (i.e. it should not be send between PIPE ON ... PIPE OFF).&lt;br /&gt;
&lt;br /&gt;
  ADDC/M  - Add a channel in multi mode to a property on a remote. This allows&lt;br /&gt;
            multiple remotes writing into a single pipe. (N)&lt;br /&gt;
&lt;br /&gt;
  ADDR    - Create a reference to an RMIF process on a remote machine.&lt;br /&gt;
              ID=&amp;lt;RMIF ID&amp;gt;&lt;br /&gt;
              NAME=&amp;quot;ADDR&amp;quot;&lt;br /&gt;
              INFO=&amp;lt;desired remote index number; 1-MAXREMOTE&amp;gt; (X)&lt;br /&gt;
              DATA=&amp;lt;Table with properties for the remote to address&amp;gt;  (N)&lt;br /&gt;
                     ID = ID to name created remote (good idea to keep unique).&lt;br /&gt;
                     HP = Host:Port string of remote, e.g. the Internet&lt;br /&gt;
                          address (IP/hostname and PORT) of the remote machine.&lt;br /&gt;
              &amp;lt;ARGS&amp;gt;=1     (X)&lt;br /&gt;
              &amp;lt;TYPE&amp;gt;=S[40] (X)&lt;br /&gt;
              &amp;lt;VALUES=remote address IP/hostname:port string or hexadecimal&lt;br /&gt;
                      string of IP address/port (in network byte order). (X)&lt;br /&gt;
&lt;br /&gt;
            Note: The connection is not established until an OPEN message is&lt;br /&gt;
                  processed.&lt;br /&gt;
            In X-Midas, care should be taken for the specified remote index,&lt;br /&gt;
              otherwise an existing remote at that index may be overridden.&lt;br /&gt;
&lt;br /&gt;
  CLOSE   - Close the connection to a remote. (N)&lt;br /&gt;
            A CLOSED message acknowledges this request.&lt;br /&gt;
            Note: An OPEN message to the same remote &amp;lt;Host:Port&amp;gt; should not be&lt;br /&gt;
                  sent until the CLOSED message is received, otherwise the new&lt;br /&gt;
                  remote may receive the server's acknowledgment to this remote&lt;br /&gt;
                  (i.e. it gets a CLOSED message that was still in transit on&lt;br /&gt;
                  the network to RMIF).&lt;br /&gt;
&lt;br /&gt;
  CLOSE/R - Close the connection to a remote and remove it from the table. (N)&lt;br /&gt;
&lt;br /&gt;
  DELC    - Delete a channel to a property on a remote. (N)&lt;br /&gt;
              ID=&amp;lt;RMIF ID&amp;gt;&lt;br /&gt;
              INFO=&amp;lt;if &amp;gt; 0, channel number&amp;gt;&lt;br /&gt;
              DATA=&amp;lt;else,   name of exported property&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  GET     - Is used to request one or more key=value pairs. (X-Midas uses&lt;br /&gt;
            &amp;quot;GETKEY&amp;quot; instead of &amp;quot;GET&amp;quot;). A RET message acknowledges this request.&lt;br /&gt;
&lt;br /&gt;
  KEYS    - Requests a list of properties to be returned for specified remote.&lt;br /&gt;
              ID=&amp;lt;remote&amp;gt; (N)&lt;br /&gt;
            or&lt;br /&gt;
              ID=&amp;lt;RMIF ID&amp;gt; (X)&lt;br /&gt;
              INFO=&amp;lt;desired remote index number; 1-MAXREMOTE&amp;gt; (X)&lt;br /&gt;
&lt;br /&gt;
  MODIFY  - Modifies parameters of an open channel (usually used for plot&lt;br /&gt;
            compression). (N)&lt;br /&gt;
            NOTE: Compression only works on pipes with fixed-point SB data.&lt;br /&gt;
              nM&amp;gt; message FUNC=send ID=RID NAME=MODIFY &amp;amp;&lt;br /&gt;
                  DATA={PROPERTY=_serverPipe,COMP=2,PLOTWIDTH=200}&lt;br /&gt;
              xM&amp;gt; rmsg send &amp;lt;addr&amp;gt;   MODIFY,,&lt;br /&gt;
                  {PROPERTY=_serverPipe,COMP=2,PLOTWIDTH=200}&lt;br /&gt;
            sets compression on the pipe for a 200 pixel wide plotter&lt;br /&gt;
&lt;br /&gt;
              nM&amp;gt; message FUNC=send ID=RID NAME=MODIFY &amp;amp;&lt;br /&gt;
                  DATA={PROPERTY=_serverPipe,TRIM1=plot.x1i,TRIM2=plot.x2i}&lt;br /&gt;
              xM&amp;gt; rmsg send &amp;lt;addr&amp;gt;   MODIFY,,&lt;br /&gt;
                  {PROPERTY=_serverPipe,TRIM1=plot.x1i,TRIM2=plot.x2i}&lt;br /&gt;
            sets compression for a plot zoom window from frame index x1i to x2i&lt;br /&gt;
&lt;br /&gt;
  OPEN    - Open a connection to a remote given the SERVER host and port.&lt;br /&gt;
            An OPENED message acknowledges this request.&lt;br /&gt;
              nM&amp;gt; message send RMIFID ,, OPEN ,, {ID=&amp;lt;rid&amp;gt;,HP=&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
            Note: Since &amp;lt;rid&amp;gt; is not passed to the server side, the RMIF server&lt;br /&gt;
                  defaults the remote's message ID to &amp;quot;REMOTE&amp;quot;. In most cases&lt;br /&gt;
                  it is not important to uniquely identify a client since the&lt;br /&gt;
                  server typically treats all clients the same (given that they&lt;br /&gt;
                  have the same channels open). Since NeXtMidas 2.5.3 it is&lt;br /&gt;
                  possible to specify an alternate ID for each remote client.&lt;br /&gt;
                  This is done by setting the remote's id to desired value when&lt;br /&gt;
                  processing the OPEN message in the server macro, for example:&lt;br /&gt;
                    nM&amp;gt; set msg.data.id &amp;quot;MY_REMOTE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  RADDR   - Remove an address from RMIFs table of remotes. (N)&lt;br /&gt;
&lt;br /&gt;
  RET     - Acknowledges a GET message. (X-Midas uses &amp;quot;RETKEY&amp;quot; instead of &amp;quot;RET&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  RPKT    - Is a more direct means to SEND or RECV an RMIF packet with less&lt;br /&gt;
            restrictions (see nxm.sys.exp.rmsg.exp). This is for X-Midas only.&lt;br /&gt;
            If the address field is blank, the packet is sent to all open&lt;br /&gt;
            remotes ONLY if the /RECONN switch is set (this was done to&lt;br /&gt;
            preserve the legacy, pre-/RECONN switch behavior).&lt;br /&gt;
&lt;br /&gt;
  PAUSE   - Pause, specify the time (seconds) in the info entry. (X)&lt;br /&gt;
&lt;br /&gt;
  PING    - Request a PING to be sent to specified remote.&lt;br /&gt;
              ID=&amp;lt;remote&amp;gt; (N)&lt;br /&gt;
            or&lt;br /&gt;
              ID=&amp;lt;RMIF ID&amp;gt; (X)&lt;br /&gt;
              INFO=&amp;lt;desired remote index number; 1-MAXREMOTE&amp;gt; (X)&lt;br /&gt;
&lt;br /&gt;
  PROPS   - Same as KEYS message.&lt;br /&gt;
&lt;br /&gt;
  SET     - Is used to set one or more key=value pairs. (X-Midas uses &amp;quot;SETKEY&amp;quot;&lt;br /&gt;
            instead of &amp;quot;SET&amp;quot;). An ACK message acknowledges this request.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
  1. X-Midas server setup:&lt;br /&gt;
       rmif/pktmsg port _mypipe|myresult&lt;br /&gt;
&lt;br /&gt;
  2. NeXtMidas server setup with web server:&lt;br /&gt;
       rmif/http port sfreq|_waveb /ppt={RETRY=2,TIMEPING=3}&lt;br /&gt;
&lt;br /&gt;
  3. NeXtMidas client setup with web server:&lt;br /&gt;
       rmif/http/prange=5 port&lt;br /&gt;
&lt;br /&gt;
  4. NeXtMidas opening a connection to a remote server:&lt;br /&gt;
       set remote &amp;quot;&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;quot;&lt;br /&gt;
       message send RMIF ,, &amp;quot;OPEN&amp;quot; ,, {ID=XM,HP=&amp;quot;^remote&amp;quot;}&lt;br /&gt;
       message send XM ,, &amp;quot;ADDC&amp;quot; 1 {_WAVEB=_WAVEB}&lt;br /&gt;
       message send XM ,, &amp;quot;ADDC&amp;quot; 2 &amp;quot;Q:ACK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     .... later in processMessage handler - sync up&lt;br /&gt;
       if msg.name eqs &amp;quot;OPENED&amp;quot; then&lt;br /&gt;
         message send XM ,, &amp;quot;GET&amp;quot; ,, {SFREQ=?,CFREQ=?}&lt;br /&gt;
       endif&lt;br /&gt;
&lt;br /&gt;
  5. NeXtMidas sending a message to an un-opened remote:&lt;br /&gt;
       message send &amp;quot;RMIF&amp;quot; ,, &amp;quot;ADDR&amp;quot; ,, {ID=RID,HP=&amp;quot;^rhost:^rport&amp;quot;}&lt;br /&gt;
       message send &amp;quot;RID&amp;quot; ,, &amp;quot;SET&amp;quot; ,, {FREQ=123,RATE=2345}&lt;br /&gt;
&lt;br /&gt;
  6. NeXtMidas replying to a GET message from a remote:&lt;br /&gt;
       if msg.name eqs &amp;quot;GET&amp;quot; then&lt;br /&gt;
&lt;br /&gt;
     ... fill in values for entries in the msg.data table&lt;br /&gt;
       message send &amp;quot;REPLY&amp;quot; msg &amp;quot;RET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  7. NeXtMidas replying to a SET message from a remote:&lt;br /&gt;
       if msg.name eqs &amp;quot;SET&amp;quot; then&lt;br /&gt;
&lt;br /&gt;
     ... validate entries in the msg.data table and perform necessary actions&lt;br /&gt;
       message send &amp;quot;REPLY&amp;quot; msg &amp;quot;ACK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  8. NeXtMidas client to monitor all Q:ACK (channel) on remote host:port&lt;br /&gt;
       rmif -1 ,, {ID=REMOTE,HP=&amp;quot;^host:^port&amp;quot;} &amp;quot;Q:ACK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Many examples exists as part of the RMIF test cases, see:&lt;br /&gt;
    $NMROOT/nxm/sys/test/rmif/test_rmif_*.mm&lt;br /&gt;
&lt;br /&gt;
Switches: (X) = X-Midas Only, (N) = NeXtMidas Only, otherwise valid for both&lt;br /&gt;
  /AUXLIST=l  - List of AUXs to make available under&lt;br /&gt;
                &amp;quot;http://host:port/Files/&amp;lt;AUX&amp;gt;/&amp;lt;filename&amp;gt;&amp;quot;. By default all&lt;br /&gt;
                AUXs in AUX.READ are listed (same as /AUXLIST=&amp;quot;*&amp;quot;). Use&lt;br /&gt;
                /AUXLIST=null to disable. [Note that for to backwards-&lt;br /&gt;
                compatibility with older apps, the defaults for this&lt;br /&gt;
                switch differ between RMIF and HTTPSERV.] (N)&lt;br /&gt;
  /DEVICE=dev - Performs a network interface lookup to resolve server IP address&lt;br /&gt;
                to bind on based on a network device name (e.g. eth0, eth1.101).&lt;br /&gt;
                This switch takes precedence over the /HOST switch. (N)&lt;br /&gt;
                Since NeXtMidas 3.1.2.&lt;br /&gt;
  /HOMEPAGE=p - Homepage location for HTTP web server (p = path). [This&lt;br /&gt;
                matches HTTPSERV.] (N)&lt;br /&gt;
  /HOST=ip    - Sets the host IP address to bind on.&lt;br /&gt;
  /HTTP       - Start HTTP server for application status, debug, and file&lt;br /&gt;
                serving. Note that /AUXLIST= and /HOMEPAGE= have no affect&lt;br /&gt;
                if this switch is not specified. (N)&lt;br /&gt;
  /KEEPADJ    - Keep adjunct header with the data. (X)&lt;br /&gt;
  /KEYMSG     - Convert SET,GET,RET,ACK packets to SETKEY, GETKEY, ... messages.&lt;br /&gt;
                This allows the macro to take special action when a remote&lt;br /&gt;
                interface sends or requests information instead of letting&lt;br /&gt;
                RMIF handle this 'behind the scenes'. (X)&lt;br /&gt;
  /LOG=fname  - Logs all control activity to text file&lt;br /&gt;
  /MSGID=id   - The ID to process messages from the remote nodes (usually 1 in&lt;br /&gt;
                X-Midas, usually MAIN in NeXtMidas). [DEF=MAIN in NeXtMidas]&lt;br /&gt;
  /PAUSE=s    - Time (sec) to pause at the end of idle loop (DEF=Mc.pause) (X)&lt;br /&gt;
  /PKTMSG     - Convert SET,GET,RET,ACK packets to RPKT messages. This is the&lt;br /&gt;
                default if /MSGID is specified. (See nxm.sys.exp.rmsg.exp.)  (X)&lt;br /&gt;
  /PPT={tbl}  - Port Parameter Table for tuning connections. (N)&lt;br /&gt;
                Most setable attribute may be included but some typical&lt;br /&gt;
                parameters are: RETRY,TIMEPING,TIMEOUT&lt;br /&gt;
                TIMEDROP is not yet implemented in NeXtMidas.&lt;br /&gt;
  /PRANGE=n   - Range of port numbers above &amp;lt;port&amp;gt; to use if already allocated.&lt;br /&gt;
  /RECONN     - Reopens pipes after server recycle. (X)&lt;br /&gt;
  /REOPEN=NO  - Don't reopen same named pipes on client side when reconnecting.&lt;br /&gt;
                This keeps plotters from resetting but should only be used if&lt;br /&gt;
                the application is reconnecting to pipes with similar headers.&lt;br /&gt;
                (N)&lt;br /&gt;
  /RETRY=n    - Set maximum number of retries (default=5). (X)&lt;br /&gt;
                Use the /PPT switch for NeXtMidas.&lt;br /&gt;
  /STATUS=lbl - Writes the current number of remote connections to the result&lt;br /&gt;
  /TIMEDROP=s - Timeout to drop efforts to reconnect (default=600). (X)&lt;br /&gt;
                Use the /PPT switch for NeXtMidas.&lt;br /&gt;
  /TIMEOUT=s  - Timeout (in seconds) to declare link down (default=15). (X)&lt;br /&gt;
                Use the /PPT switch for NeXtMidas.&lt;br /&gt;
  /TIMEPING=s - Timeout (in seconds) between pings (default=4). (X)&lt;br /&gt;
                Use the /PPT switch for NeXtMidas.&lt;br /&gt;
  /VERBOSE    - Set verbose option.&lt;br /&gt;
  /WINDOW=n   - Set maximum window of messages to a given remote before RDP will&lt;br /&gt;
                not send. (X) Use the /PPT switch for NeXtMidas.&lt;br /&gt;
&lt;br /&gt;
See Also: nxm.sys.net.Rmif, SD360, nxm.sys.test.test_rmif.mm, HTTPSERV&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:NXM_Explain]]&lt;/div&gt;</summary>
		<author><name>ConvertBot</name></author>
		
	</entry>
</feed>