Facility Control

 View Only
  • 1.  AMP Protocol - receiving the response

    Posted 03-18-2020 17:43

    Hi

    I am writing an AMP protocol control UI in Dashboard. I can see how to send the binary bytes using writeAsBytes(myByteArray).

    What I can't see is how to receive the variable length response. If I set the listener to have a fixed length of 1 byte, I receive an event for each byte in the response. Problem is I don't know when there are no more bytes to read. Is there a way to get at the underlying socket object to probe the receive buffer?

    I'm currently using event.getBytes().  I was hoping calling that until I received no more data would work, but it just return the same 1 byte (my listener is set to return 1 byte per message event). 

    Thanks

    Simon



  • 2.  RE: AMP Protocol - receiving the response

    Posted 03-18-2020 17:50

    Hi Simon

    The key to this is to select "Stop all receive/task execution on pause" for the listener and use ogscript.createMessageParser(this.getInputStream()) inside of your listener's code. This will allow you to read directly from the wire instead of waiting for messages to be complete:

    <abs contexttype="opengear" gridsize="20" id="_top">
    <meta>
    <params>
    <param access="1" maxlength="0" name="Message Type 1" oid="Message_Type_1" type="STRING" value="Test 1" widget="text"/>
    <param access="1" maxlength="0" name="Message Type 2" oid="Message_Type_2" type="STRING" value="Test 2" widget="text"/>
    </params>
    <api>function sendMessageToListener(type, message)
    {
    var mb = ogscript.createMessageBuilder();
    mb.writeShort(type);
    mb.writeShort(message.length);
    mb.writeString(message);
    rosstalk.sendBytes('localhost', 2244, mb.toByteArray(), null);
    }
    </api>
    <listener autostart="true" blockingpause="true" delimiter="2" delimitertype="fixedlen" listenport="2244">
    <task tasktype="ogscript">if (event.isMessageEvent())
    {
    var cmdTypeBytes = event.getBytes();
    var commandType = cmdTypeBytes[0] &lt;&lt; 8 | cmdTypeBytes[1];
    var messageParser = ogscript.createMessageParser(this.getInputStream());
    var length = messageParser.readShort();
    var string = messageParser.readString(length);

    ogscript.rename('output', 'TYPE: ' + commandType + ' MESSAGE: ' + string);
    }</task>
    </listener>
    </meta>
    <param expand="true" height="40" left="80" oid="Message_Type_1" top="40" width="320"/>
    <param expand="true" height="40" left="80" oid="Message_Type_2" top="100" width="320"/>
    <button buttontype="push" height="40" left="400" name="Go" top="40" width="60">
    <task tasktype="ogscript">sendMessageToListener(1, params.getValue('Message_Type_1', 0));
    </task>
    </button>
    <button buttontype="push" height="40" left="400" name="Go" top="100" width="60">
    <task tasktype="ogscript">sendMessageToListener(2, params.getValue('Message_Type_2', 0));
    </task>
    </button>
    <label height="60" id="output" left="0" style="txt-align:west" top="140" width="1340"/>
    </abs>

    #DashBoard


  • 3.  RE: AMP Protocol - receiving the response

    Posted 03-18-2020 17:51

    Also, for mixing Binary and ASCII, the list of available methods on the message builder/parser is available in the script palette:

    var messageBuilder = ogscript.createMessageBuilder();
    /*
    * messageBuilder.writeByteArray(bytesArray);
    * messageBuilder.writeByteArray(bytesArray, offset, length);
    * messageBuilder.writeBoolean(boolVal);
    * messageBuilder.writeByte(byteVal);
    * messageBuilder.writeShort(shortVal);
    * messageBuilder.writeChar(charVal);
    * messageBuilder.writeInt(intVal);
    * messageBuilder.writeLong(longVal);
    * messageBuilder.writeFloat(floatVal);
    * messageBuilder.writeDouble(doubleVal);
    * messageBuilder.writeLine(strVal);
    * messageBuilder.writeString(strVal);
    * messageBuilder.writeUTF(strVal); //includes 2-byte length count
    */
    var bytes = messageBuilder.toByteArray();


    var messageReader = ogscript.createMessageParser(messageBytes);
    /*
    * var byteArray = messageReader.readBytes(length);
    * messageReader.skipBytes(length);
    * var boolVal = messageReader.readBoolean();
    * var byteVal = messageReader.readByte();
    * var byteVal = messageReader.readUnsignedByte();
    * var shortVal = messageReader.readShort();
    * var shortVal = messageReader.readUnsignedShort();
    * var charVal = messageReader.readChar();
    * var intVal = messageReader.readInt();
    * var longVal = messageReader.readLong();
    * var floatVal = messageReader.readFloat();
    * var doubleVal = messageReader.readDouble();
    * var str = messageReader.readUTF(); //includes 2-byte length count
    * var str = messageReader.readLine(); //read bytes until newline character is reached
    * var str = messageReader.readString(length); //without 2-byte length count
    */

    #DashBoard


  • 4.  RE: AMP Protocol - receiving the response

    Posted 03-18-2020 18:42

    Thanks James. It's almost what I needed, but gave me enough to figure the rest out! I have kept the delimiter set to 1 byte.

    Here is my code now. It will allow for any length of response that I can then parse, and pass onto a messageParser if need be.

    if (event.isMessageEvent())
    {
    ogscript.debug("Dyno data");
    var data = [];

    //we need to get the first byte the normal way
    data.push(event.getBytes()[0]);
    var stream = this.getInputStream();
    ogscript.debug("Data available: " + stream.available());

    //get the rest of the bytes in the message and add to our array
    while( stream.available())
    {
    data.push(stream.read());
    }

    //what we got?
    for(var i = 0; i< data.length; i++)
    {
    ogscript.debug(data[i]);
    }
    return;

    }


    I don't have access to real hardware yet, just a simple TCP server, but it's proved what I need

     

    Thanks


    #DashBoard


  • 5.  RE: AMP Protocol - receiving the response

    Posted 10-28-2020 18:37

    @Simon, this is awesome.
    This code makes getting messages much easier, no need to mess with delimiter type and value. Thanks to available() method. I wonder why this is not preffered way to get any response, instead of using delimiter. But, in fact, i didn't found info about that method, not in ogscript pdf's, nor in that forum. Actually, your topic is uniq in that case.

    Congratulations, and thanks for posting that code, i already integrated it in some panels and i think this is much easier way to get messages via listener.

    Alex.


    #DashBoard