Getting started with MISB 0806

MISB ST 0806 defines a Local Set (LS) to be used with a Remote Video Terminal (RVT).
Users of the ROVER (Remotely Operated Video Enhanced Receiver) require additional metadata elements unique to its mission needs than are specified in MISB ST 0601. The purpose of this Standard is to formalize a method of communicating with a Remote Video Terminal, and create a configuration-managed metadata standard to meet its needs with minimal impacts on ST 0601 users.

Nesting in MISB601

In most cases, MISB ST 0806 will be used as a nested set of the parent MISB 601 packet.
Here is an example of encoding / decoding such data:

Let's assume we have the following metadata:

{
    "2": "2008-10-24T00:13:29.913",
    "3": "MISSION01",
    "65": 13,
    "73": {
        "2": "2008-10-24T00:13:29.913",
        "3": 25,
        "4": 20,
        "6": 1000,
        "7": 4000,
        "8": 4,
        "9": 13090,
        "10": "H.264",    
    } 
}

To encode the MISB601 payload along with the RVT data, we can create an instance of MISB601 and use it for packet creation

var misb601 = new MISB601();
var buf = misb601.EncodePacket(pckt);

To decode the data, we call DecodePacket method.

var pckt = misb601.DecodePacket(buf);

If you only need RVT payload, use EncodePayload / DecodePayload methods instead.

RVT LS Subordinate Sets

The RVT LS uses subordinate Local Sets:

  • Point of Interest (POI) Local Set
  • Area of Interest (AOI) Local Set
  • User-Defined Local Set

As the subordinate set item may appear more than once within a RVT Local Set, in order to deal with tag duplication, MisbCore SDK will accept an array of subordinate Local Sets. For example:

{  
    2: '2008-10-24T00:13:29.913',
    3: 10,
    4: 10,
    11: [
            {
               User Defined LS 1 ... 
            },
            {
               User Defined LS 2 ... 
            }
        ],
     12: [
            {
               Point of Interest LS 1... 
            },
            {
               Point of Interest LS 2... 
            }
        ]
}

If a subordinate Local Set appears only once, you may use either the key:value or key:[value] format.

{  
    2: '2008-10-24T00:13:29.913',
    3: 10,
    4: 10,
    11: {
        User Defined LS 1 ... 
    },
    12: {
        Point of Interest LS 1... 
    }
}

User-Defined Data Local Set

User Defined Data Local Set

The Local Set may not be used to substitute for any valid KLV element or construct defined in any other MISB specification.

The content of the User-Defined LS is determined in the field. Bits 1 to 6 of the Numeric ID for Data Type define the descriptive key, which in its turn defines the data type.

Using arbitrary byte array

This method lets you pass arbitrary binary data. The SDK is data-agnostic in this scenario and simply transfers the data from the server to the client. Decoding and interpreting the data is the client's responsibility. To pass the binary data, use a byte array encoded as a Base64 string.

Note: MISBCore extracts the byte array and sends the binary data—not the Base64 encoded string!

Let's assume we have the following metadata:

byte [] data = new byte[] {0x01, 0x02, 0x03, 0x04};
String dataStr = Base64.encodeBase64String(data);

This will give us "AQIDBA==", so we can send it in tag 2.

{
    "2": "2008-10-24T00:13:29.913",
    "3": "MISSION01",
    "65": 13,
    "73": {
        "7": 4000,
        "11": {
            1: 1,
            2: "AQIDBA=="    
        }   
    } 
}
var misb601 = new MISB601();
var buf = misb601.EncodePacket(pckt);

On the client side, decode the packet using Base64.FromBase64String() to retrieve the data.

Using the plugin with the descriptive schema for encoding and decoding user-defined data

MisbCore supports plugins for encoding and decoding data, making it possible to use user-defined data seamlessly without needing to rebuild the application that uses the SDK. A typical workflow for this would be as follows:

  • The vendor responsible for metadata encoding creates and distributes a plugin along with a descriptive schema.
  • The plugin module should be copied to the plugins directory on either the encoder or client side.
  • Metadata is encoded with a unique ID and placed in an RVT tag according to MISB 806 standards.
  • If the client-side has plugins installed, they will be loaded into the MisbCore module.
  • When the metadata encoder encounters an RVT packet with a User Data (tag 2) metadata field passed as an object, it will check if it is possible to apply one of the existing plugins to encode the data, otherwise, if it receives the string, it will be processed as an EncodeBase64String string.
  • When the metadata decoder encounters an RVT packet with a user-defined metadata field, it will check if it is possible to apply one of the existing plugins to decode the data.
  • If a suitable plugin is found, it will be used to decode the metadata, and a properly structured JSON object will be returned in the corresponding RVT packet.
  • If no match is found, the decoder will return a Base64String encoded binary buffer.

For example, let's define a User-Defined LS and assign it a GUID to make it unique:

Sample User Data Local Set:

Data tag Units Format Klv Len Min Max Resolution Description
0 - - V - - - Reserved id. If not present, SDK will try to use the first existing plugin (not recommended)
1 m/s uint8 1 0 255 1 Speed, m/s
2 degrees float64 4 -90 90 ~42 nano degrees Latitude, degrees
3 degrees float64 4 -180 180 ~84 nano degrees Longitude, degrees
4 meters float64 2 -900 19000 ~0.3 meters Altitude, meters
5 - string V - - - Designator, string
6 - uint16 4 0 65535 - Counter, integer

The data will follow other MISB standards convention and will be encoded as klv triplets, allowing the value mapping and variable length encoding to optimize the required bandwidth.
Proprietary data conversion formulas can be used (and should be a part of the descriptive schema definition)

User-Defined Data Local Set encoding

To pass user data defined by the schema above, provide a JSON packet to the library's encoding method:

{  
    2: '2008-10-24T00:13:29.913',
    11: [
            {
                1: 0x81,
                2: { 
                    0: "AMrJFxsvK5",
                    1: 2,
                    2: 60.176822966978335,
                    3: 128.42675904204452,
                    4: 14190.7195,
                    5: "Test",
                    6: 1
                }  
            }
        ],
}

Note: - Misbcore will try to locate and use metadata encoding plugin if RVT object contains json object in Tag 2 of Used Defined Local Set.
- Tag 0 of the user-defined metadata object contains unique id. Can be any string. For example, can be generated using https://shortunique.id/
When MisbCore receives a json packet with user-defined data and data type id (in Tag 0) and no plugin with such an id can be found, the encoding of the user-defined data will fail.

User-Defined Data Local Set decoding.

When a client receives the RVT User-Defined Data Local Set and has a relevant decoder plugin installed, the SDK provides the output as described above. If the client does not have the plugin but supports RVT decoding, it receives an array of uint values along with the standard tags/values, ensuring MISB 0806 compliance.

Using User-Defined Data Local Set plugins in applications

Please see STPlayer RVT Plugin for more information about using plugins in applications.

Plugin development

MisbCore can use plugins to seamlessly integrate 3rd party data sets.

Plugins allow you to extend the functionality of User-Defined Data encoder and decoder without touching MisbCore SDK or encoding / decoding applications that use them.

For more information on plugin development, see Plugin development.