AMP Protocol - receiving the response

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

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:

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); } if (event.isMessageEvent()) { var cmdTypeBytes = event.getBytes(); var commandType = cmdTypeBytes[0] << 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);
}

sendMessageToListener(1, params.getValue('Message_Type_1', 0)); sendMessageToListener(2, params.getValue('Message_Type_2', 0)); [#DashBoard](https://livinglive.community/search?s=tags%3A%22DashBoard%22&executesearch=true)

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

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

@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