Node Status
Periodic heartbeat: where the node is and what it is doing.
MessageTypeEnum_NODE_STATUS
Periodic heartbeat: where the node is and what it is doing.
| Direction | node → controller |
| Cadence | Periodic (seconds) and on significant state change. |
| Delivery | Broadcast — telemetry plane (QoS 0) |
| Schema | catl/hibw/messages/node/NodeStatus.json |
| Worked examples | 3 |
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
Message header
Every CATL message carries this envelope header.
| Field | Type | Multiplicity | Description |
|---|---|---|---|
message_type | MessageTypeEnum | [1..1] | An enumeration. |
source | GUID | [1..1] | Source that send this message. Often same as source of information, but different when relaying. |
version | string | [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_sent | Time | [1..1] |
Body — NodeStatusBody
Inherits from base::node_status::NodeStatusBase.
| Field | Type | Multiplicity | Description |
|---|---|---|---|
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] |
| Field | Type | Multiplicity | Description |
|---|---|---|---|
capabilities | Capabilities | [0..1] | |
members | GUID [] | [0..*] | |
constraints_compliance | NodeConstraintsCompliance [] | [0..*] | |
parent_id | GUID | [0..1] | |
binding | BindingInformationType | [0..1] | |
specialization | NodeSpecializationStatus | [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).
{
"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).
{
"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).
{
"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)}" | jqTry them interactively in the Integration API reference.