STANAG 4817 / AEP-105 · 0.3.0-rc4 (SD-3 RC4)
Messages

Node Status

Periodic heartbeat: where the node is and what it is doing.

Broadcast MessageTypeEnum_NODE_STATUS

Periodic heartbeat: where the node is and what it is doing.

Directionnode → controller
CadencePeriodic (seconds) and on significant state change.
DeliveryBroadcast — telemetry plane (QoS 0)
Schemacatl/hibw/messages/node/NodeStatus.json
Worked examples3

Purpose

The node's heartbeat and live picture. Carries pose (position + orientation), the tasks it currently holds, constraint-compliance state, and — for hierarchical formations — its parent and member nodes. This is what a Common Operating Picture is built from.

When to send it

  • On a fixed cadence (the operational heartbeat interval).
  • Immediately on a significant change (new task accepted, pose jump, constraint breach).
  • When joining/leaving a formation (parent_id / members change).

Where it fits

Loading diagram…

Message header

Every CATL message carries this envelope header.

FieldTypeMultiplicityDescription
message_typeMessageTypeEnum[1..1]An enumeration.
sourceGUID[1..1]Source that send this message. Often same as source of information, but different when relaying.
versionstring[1..1]Version of the schema used to create and validate this message. Has to follow major.minor.patch notation. For study draft 3 it should be 0.3.0.
time_sentTime[1..1]

Body — NodeStatusBody

Inherits from base::node_status::NodeStatusBase.

FieldTypeMultiplicityDescription
source_of_information (inherited)GUID[0..1]Holds source of information. Its a identifier of a node that provided that information. It can be a node that created a region, task. It can be a node that detected contact or is maintaining track. For self reports it should be same as identifier.
external_identifiers (inherited)ExternalSystemIdentifier [][0..*]Holds identifiers of this entity in other systems.
identifier (inherited)GUID[1..1]Unique identifier for this entity.
description (inherited)EntityDescription[0..1]Description of this entity. Contains APP6 symbol definition and human readable description.
extra (inherited)Any[0..1]Placeholder for experimentation.
timestamp (inherited)Time[1..1]Time in which this entity was last updated.
time_of_initiation (inherited)Time[0..1]Time when this entity was created or spotted.
time_of_validity (inherited)Time[0..1]
pose (inherited)Pose[1..1]
velocity (inherited)Velocity[0..1]
endurance (inherited)Duration[0..1]
FieldTypeMultiplicityDescription
capabilitiesCapabilities[0..1]
membersGUID [][0..*]
constraints_complianceNodeConstraintsCompliance [][0..*]
parent_idGUID[0..1]
bindingBindingInformationType[0..1]
specializationNodeSpecializationStatus[0..1]

Full NodeStatusBody reference →

Key fields

  • pose — Current position (discriminated PositionType — typically latitude/longitude/altitude) and orientation. The COP's core input.
  • capabilities — Echoes the supported task modes so a controller can task off the latest status alone.
  • constraints_compliance — Per-constraint compliance state — surfaces breaches without a separate query.
  • parent_id / members — Formation hierarchy: who this node answers to and which children it leads.

Worked examples

Node Status

✅ validates against catl/hibw/messages/node/NodeStatus.json. Routes to 4817/exercise-alpha/v0.3.0/src/a895f8f5-46b0-5603-bdf0-b270a2867c09/status (QoS 0).

catl_2_node_status.json
{
  "header": {
    "message_type": "MessageTypeEnum_NODE_STATUS",
    "source": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
    "version": "0.3.0",
    "time_sent": "2025-03-18T12:05:00+00:00"
  },
  "body": {
    "identifier": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
    "timestamp": "2025-03-18T12:05:00+00:00",
    "pose": {
      "position": {
        "$discriminator": "PositionTypeEnum_LATITUDE_LONGITUDE_ALTITUDE",
        "latitude_longitude_altitude": {
          "latitude": 10,
          "longitude": 11,
          "altitude": []
        }
      }
    },
    "capabilities": {
      "task_conditions_mode": "TaskConditionModeEnum_NOT_SUPPORTED",
      "task_conditions_template": "TaskTemplateModeEnum_NOT_SUPPORTED"
    }
  }
}

Node Status Tasks

✅ validates against catl/hibw/messages/node/NodeStatus.json. Routes to 4817/exercise-alpha/v0.3.0/src/a895f8f5-46b0-5603-bdf0-b270a2867c09/status (QoS 0).

catl_4_node_status_tasks.json
{
  "header": {
    "message_type": "MessageTypeEnum_NODE_STATUS",
    "source": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
    "version": "0.3.0",
    "time_sent": "2025-03-18T12:05:00+00:00"
  },
  "body": {
    "external_identifiers": [
      {
        "system": {
          "name": "ExternalSystemEnum_CALLSIGN"
        },
        "identifier": "BNDO-01"
      },
      {
        "system": {
          "name": "CATL_NAME"
        },
        "identifier": "cmre.biondo"
      },
      {
        "system": {
          "name": "CATL_VALUE"
        },
        "identifier": "12"
      }
    ],
    "identifier": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
    "description": {
      "context_type": "ContextEnum_REALITY",
      "standard_identity": "StandardIdentityEnum_FRIEND",
      "symbol_set": "SymbolSetEnum_SEA_SUBSURFACE",
      "status": "EntityStatusEnum_PRESENT",
      "headquarters_task_force_dummy": "HeadquartersTaskForceDummyEnum_NOT_APPLICABLE",
      "entity": "11",
      "entity_type": "04",
      "entity_subtype": "00",
      "sector_1": "00",
      "sector_2": "00",
      "name": "cmre.biondo",
      "nationality": "PRT"
    },
    "extra": {
      "some": "value",
      "other": "value"
    },
    "timestamp": "2025-03-18T12:05:00+00:00",
    "time_of_initiation": "2025-03-18T12:05:00+00:00",
    "time_of_validity": "2025-03-18T12:20:00+00:00",
    "pose": {
      "position": {
        "$discriminator": "PositionTypeEnum_LATITUDE_LONGITUDE_ALTITUDE",
        "latitude_longitude_altitude": {
          "latitude": 10,
          "longitude": 11,
          "altitude": [
            {
              "value": -11.2,
              "type": "AltitudeTypeEnum_WGS"
            },
            {
              "value": 120.1,
              "type": "AltitudeTypeEnum_BOTTOM"
            }
          ]
        }
      },
      "orientation": {
        "$discriminator": "OrientationTypeEnum_EULER_ANGLES",
        "euler_angles": {
          "yaw": 120.5
        }
      }
    },
    "velocity": {
      "$discriminator": "VelocityTypeEnum_SPEED_COURSE_CLIMB_RATE",
      "speed_course_climb_rate": {
        "speed": 1.2
      }
    },
    "capabilities": {
      "task_conditions_mode": "TaskConditionModeEnum_NOT_SUPPORTED",
      "task_conditions_template": "TaskTemplateModeEnum_NOT_SUPPORTED"
    },
    "members": [
      "ddc79214-ec20-445c-9605-939bca242578",
      "4260a4ed-e176-4320-8667-23428089e431"
    ],
    "parent_id": "4ab19954-c5e8-4684-be5e-d289a0e0e9b8"
  }
}

Node Status Complex

✅ validates against catl/hibw/messages/node/NodeStatus.json. Routes to 4817/exercise-alpha/v0.3.0/src/a895f8f5-46b0-5603-bdf0-b270a2867c09/status (QoS 0).

catl_18_node_status_complex.json
{
  "header": {
    "message_type": "MessageTypeEnum_NODE_STATUS",
    "source": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
    "version": "0.3.0",
    "time_sent": "2025-03-18T12:05:00+00:00"
  },
  "body": {
    "identifier": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
    "timestamp": "2025-03-18T12:05:00+00:00",
    "pose": {
      "position": {
        "$discriminator": "PositionTypeEnum_LATITUDE_LONGITUDE_ALTITUDE",
        "latitude_longitude_altitude": {
          "latitude": 10,
          "longitude": 11,
          "altitude": []
        }
      }
    },
    "capabilities": {
      "task_conditions_mode": "TaskConditionModeEnum_NOT_SUPPORTED",
      "task_conditions_template": "TaskTemplateModeEnum_NOT_SUPPORTED"
    },
    "constraints_compliance": [
      {
        "state": "ConstraintStateEnum_ACTIVE",
        "breach_reason": "",
        "identifier": "720bdd6a-3fcf-56ff-b487-0df117420afc",
        "constraint": {
          "$discriminator": "GeneralConstraintTypeEnum_TOGGLE",
          "toggle": {
            "value": false
          }
        }
      },
      {
        "state": "ConstraintStateEnum_BREACH",
        "breach_reason": "",
        "identifier": "720bdd6a-3fcf-56ff-b487-0df117420afc",
        "constraint": {
          "$discriminator": "GeneralConstraintTypeEnum_RANGE",
          "range": {
            "value": 15.2
          }
        }
      },
      {
        "state": "ConstraintStateEnum_BREACH",
        "breach_reason": "",
        "identifier": "720bdd6a-3fcf-56ff-b487-0df117420afc",
        "constraint": {
          "$discriminator": "GeneralConstraintTypeEnum_ENUMERATION",
          "enumeration": {
            "value": {
              "name": "ON"
            }
          }
        }
      },
      {
        "state": "ConstraintStateEnum_BREACH",
        "breach_reason": "",
        "identifier": "720bdd6a-3fcf-56ff-b487-0df117420afc",
        "constraint": {
          "$discriminator": "GeneralConstraintTypeEnum_EQUIPMENT",
          "equipment": {
            "emission_control": "ConstraintTypeEmissionControlEnum_ROUTINE"
          }
        }
      }
    ]
  }
}

Integrate it

The two calls every integrator needs — validate the message, then resolve its MQTT route:

# 1 · fetch a worked Node Status example
curl -s https://4817.r2d2.office.ilab.zone/examples/catl_2_node_status.json | jq '.message' > msg.json

# 2 · validate it against the 0.3.0 schema
curl -s https://4817.r2d2.office.ilab.zone/validate -H 'content-type: application/json' \
  -d "{\"message\": $(cat msg.json)}" | jq '{valid, schema_ref, errors}'

# 3 · resolve where it publishes on MQTT
curl -s "https://4817.r2d2.office.ilab.zone/route" -H 'content-type: application/json' \
  -d "{\"message\": $(cat msg.json)}" | jq

Try them interactively in the Integration API reference.

On this page