Source
...
Target
Commits (143)
[flake8]
# Black formats code with max line length of 88
# Bugbears B950 warning allows lines to be 10% longer than flake8's max
max-line-length = 80
# Errors and warnings to report
select =
C,
E,
F,
W,
B,
# Allow max line length to be exceeded by 10% before warning.
B950
# Errors and warnings to ignore
ignore =
# Black puts space around slice operator which flake8 errors on.
E203,
# No error on max line length exceeded as B950 is doing this for us.
E501,
# Black puts line breaks before binary operators so don't warn this.
W503
B036
E999
# Folders to ignore
exclude =
.git,
*.pyc,
__pycache__,
./docker,
./docs,
./kustomize
./requirements.txt
./requirements-dev.txt
./CHANGELOG.md
./CONTRIBUTING.md
__pycache__/
*.pyc
tests/test_swagger.json
\ No newline at end of file
......@@ -2,6 +2,7 @@ include:
- project: communications-backbone-system/backbone-infrastructure-config
ref: master
file: gitlab/all.yml
- local: /gitlab/test-js.yml
variables:
DOCKER_IMAGE_NAME: backbone-message-format
......
......@@ -7,21 +7,91 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
## [v2.0.0] - 2025-03-11
### Removed
- Removed "repeat" primitive instruction's enum (planning config)
### Added
- Route to header schema which shows the list of client_IDs relaying the message from the true source of message to final destination of it.
- New message type "autonomy_engine_control". Long term plan is to integrate this as an object into the planning configuration schema, where if an operation has autonomy, the metadata, configurations, any instructions / default settings shall be within this message structure section.
- Additional_data field to platform_status to input any other data from a platform to be published
- Goal object in mission_plan message that consists of a GeoJSON feature (representing the part of primitive that is currently the goal of the given mission plan).
- A `partial` flag that indicates if a mission plan is a partial plan or the entire mission plan
- Added "informational" to enum for primitive's instruction enum (planning configuration)
- Options to primitives (under planning_configuration message) which is only a property when a primitive has an instruction of "follow" or "navigate_to"
- Validate message_ID matches uuid format
- Add definition of instruction_set message
- Added optional primitives to squad schema
### Changed
- Added "instruction" as required under the primitive schema (planning configuration)
- Refactor instructeion_set into platform_instruction_set
- Refactor mission_plan schema autonomy_engine_plan_ID oneOf
- Update all example messages with valid UUIDs
- Refactor action schema to accept geojson.Points
- Use geojson Point for platform_status
- Add waypoint to platform_status
- Updated header version to accept semver, branch or commit
- Store remote schemas as committed local files
This prevents the live runtime loading untested changes
- Refactored planning_configuration message definition
- Remove region_of_interest and exclusion_zones
- Add primitives array of classified geojson Features
- Inject remote geojson schema definitions
- Use geojson Polygon instead of region_schema
- Upgraded openapi-spec-validator to latest release (0.7.1)
- Upgraded openapi-schema-validator to latest release (0.6.2)
## [v1.0.0] - 2024-08-28
### Changed
- Use discover to find all unit tests
- Run tests against current format definitions
- Test that formats match saved schema
- Run python and javascript tests in CI
- Refactor schema script to remove invalid definitions object automatically
- Refactor generate_schema_config script to output file on -f flag
### Fixed
- Add `--remove-orphans` to javascript CI test docker compose arguments
## [v0.2.0] - 2024-02-06
### Added
- New alert message definition
- Emergency flag in mission plan schemas
- Added additional battery and fuel fields to platform status for SPINE project
### Changed
- Updated README to run tests against JS dependencies
## [v0.1.0] - 2023-03-24
### Added
JSON schema definitions for the SoAR project
- outer wrapper MESSAGE definition
- header object
- outer wrapper MESSAGE definition
- header object
- payload object
- acknowledgement
- mission_plan (raw and encoded)
- observation (raw and encoded)
- platform_status (raw and encoded)
- planning_configuration
- platform_status (raw and encoded)
- planning_configuration
Example messages matching the schema for each partner
[unreleased]: https://git.noc.ac.uk/communications-backbone-system/backbone-message-format/compare/v2.0.0...dev
[v2.0.0]: https://git.noc.ac.uk/communications-backbone-system/backbone-message-format/compare/v1.0.0...v2.0.0
[v1.0.0]: https://git.noc.ac.uk/communications-backbone-system/backbone-message-format/compare/v0.2.0...v1.0.0
[v0.2.0]: https://git.noc.ac.uk/communications-backbone-system/backbone-message-format/compare/v0.1.0...v0.2.0
[v0.1.0]: https://git.noc.ac.uk/communications-backbone-system/backbone-message-format/compare/9e6ce245...v0.1.0
[unreleased]: https://git.noc.ac.uk/communications-backbone-system/backbone-message-format/compare/v0.1.0...dev
......@@ -8,6 +8,7 @@ Each message below will be wrapped in a `payload` field and will have a `header`
* `mission_plan`: these would be two message types, i. encoded (platform-specific serialized message) and ii. parsed, human-readable message.
* `platform_status`: these would be two message types, i. encoded (platform-specific serialized message) and ii. parsed, human-readable message.
* `observation`: this would be desired scientific data sent by the platform
* `survey`: this would be demanded track, platform actual path, and survey line
* `acknowledgement`: level of acknowledgment where an acknowledgement is sent when a message is i. received, ii. sent to the next destination (e.g. platform in the water).
* `planning_configuration`: sent from the GUI to initialise the AI model (autonomy engine).
......@@ -68,15 +69,31 @@ eg
* `soar.*.*.*.to_platform.*` - all messages outbound to platforms (hermes)
* `soar.*.slocum.#` - all messages relating to a slocum platform type
## Run Docs
Run the command below and go to `http://127.0.0.1:5000`
## Run Docs & Save Schema When Updating Message Formats
1. Run the command below and go to `http://127.0.0.1:5000`
```
python3 generate_schema_config.py
python3 generate_schema_config.py -f
```
2. Commit any changes to the `backbone-message-format/project/<project_name>/swagger.json`
## Run Tests
Run the command below
We have found slightly different behaviour between the OpenAPI validators in python and javascript.
By running tests in both languages we should protect against messages that pass validation in
one client but fail in another.
Run both tests below:
1. Test 1 - Use python validators
```
python3 -m unittest discover
```
2. Test 2 - Use javascript validators
```
python3 -m unittest tests/test_schemas.py
# Compile schema and run javascript validation tests in docker
bash test-js.sh
```
## Quick Links
......
......@@ -12,4 +12,4 @@ services:
- PYTHONDONTWRITEBYTECODE=1
volumes:
- ../:/app
command: "python3 -m unittest tests/test_schemas.py"
\ No newline at end of file
command: "python3 -m unittest discover"
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 1,
"source": "hydrosurv_adapter",
......
{
"header": {
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "gui",
"destination": "soar.noc.autosub.alr-52.to_platform.mission_plan",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "mission_plan",
"platform_ID": "5-ah1",
"autonomy_engine_plan_ID": 1,
"emergency": true,
"plan": [
{
"action": "abort_now",
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -3.237143188645706
}
]
}
}
\ No newline at end of file
{
"header": {
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "gui",
"destination": "soar.noc.autosub.alr-52.to_platform.mission_plan",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "mission_plan",
"platform_ID": "5-ah1",
"autonomy_engine_plan_ID": 1,
"emergency": true,
"plan": [
{
"action": "move",
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -3.237143188645706,
"depth": 5.0
},
{
"action": "abort_now",
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -3.237143188645706
}
]
}
}
\ No newline at end of file
{
"header": {
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "autonomy_engine",
......@@ -15,40 +15,40 @@
"plan": [
{
"action": "move",
"start_point_latitude": -3.007143188645706,
"start_point_longitude": 50.37072283932642,
"target_waypoint_latitude": -3.237143188645706,
"target_waypoint_longitude": 52.37072283932642,
"start_point_latitude": 50.37072283932642,
"start_point_longitude": -3.007143188645706,
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -3.237143188645706,
"depth": 0.0,
"activate_payload": false,
"timeout": 200
},
{
"action": "dive",
"start_point_latitude": -3.237143188645706,
"start_point_longitude": 52.37072283932642,
"target_waypoint_latitude": -3.337143188645706,
"target_waypoint_longitude": 56.37072283932642,
"start_point_latitude": 52.37072283932642,
"start_point_longitude": -3.237143188645706,
"target_waypoint_latitude": 56.37072283932642,
"target_waypoint_longitude": -3.337143188645706,
"altitude": 10,
"activate_payload": false,
"timeout": 200
},
{
"action": "scanline",
"start_point_latitude": -3.337143188645706,
"start_point_longitude": 56.37072283932642,
"target_waypoint_latitude": -0.237143188645706,
"target_waypoint_longitude": 60.00000000000000,
"start_point_latitude": 56.37072283932642,
"start_point_longitude": -3.337143188645706,
"target_waypoint_latitude": 60.00000000000000,
"target_waypoint_longitude": -0.237143188645706,
"altitude": 10,
"activate_payload": true,
"timeout": 200
},
{
"action": "climb",
"start_point_latitude": -0.237143188645706,
"start_point_longitude": 60.00000000000000,
"target_waypoint_latitude": -0.237143188645706,
"target_waypoint_longitude": 52.37072283932642,
"action": "dive",
"start_point_latitude": 60.00000000000000,
"start_point_longitude": -0.237143188645706,
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -0.237143188645706,
"depth": 0.0,
"activate_payload": false,
"timeout": 200
......
{
"header": {
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "autonomy_engine",
......@@ -15,40 +15,40 @@
"plan": [
{
"action": "move",
"start_point_latitude": -3.007143188645706,
"start_point_longitude": 50.37072283932642,
"target_waypoint_latitude": -3.237143188645706,
"target_waypoint_longitude": 52.37072283932642,
"start_point_latitude": 50.37072283932642,
"start_point_longitude": -3.007143188645706,
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -3.237143188645706,
"depth": 0.0,
"activate_payload": false,
"timeout": 300
},
{
"action": "dive",
"start_point_latitude": -3.237143188645706,
"start_point_longitude": 52.37072283932642,
"target_waypoint_latitude": -3.337143188645706,
"target_waypoint_longitude": 56.37072283932642,
"start_point_latitude": 52.37072283932642,
"start_point_longitude": -3.237143188645706,
"target_waypoint_latitude": 56.37072283932642,
"target_waypoint_longitude": -3.337143188645706,
"altitude": 10,
"activate_payload": false,
"timeout": 300
},
{
"action": "scanline",
"start_point_latitude": -3.337143188645706,
"start_point_longitude": 56.37072283932642,
"target_waypoint_latitude": -0.237143188645706,
"target_waypoint_longitude": 60.00000000000000,
"start_point_latitude": 56.37072283932642,
"start_point_longitude": -3.337143188645706,
"target_waypoint_latitude": 60.00000000000000,
"target_waypoint_longitude": -0.237143188645706,
"altitude": 10,
"activate_payload": true,
"timeout": 300
},
{
"action": "climb",
"start_point_latitude": -0.237143188645706,
"start_point_longitude": 60.00000000000000,
"target_waypoint_latitude": -0.237143188645706,
"target_waypoint_longitude": 52.37072283932642,
"action": "dive",
"start_point_latitude": 60.00000000000000,
"start_point_longitude": -0.237143188645706,
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -0.237143188645706,
"depth": 0.0,
"activate_payload": false,
"timeout": 300
......
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "autonomy_engine",
"destination": "soar.hydrosurv.reav-60.reav-60-1.to_platform.mission_plan",
"destination": "soar.hydrosurv.reav60.usvdecibel.to_platform.mission_plan",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "mission_plan",
"platform_ID": "reav-60-1",
"platform_ID": "usvdecibel",
"autonomy_engine_plan_ID": 1,
"plan": [
{
"target_waypoint_latitude": -4.187143188645706,
"target_waypoint_longitude": 50.37072283932642
"target_waypoint_latitude": 50.37072283932642,
"target_waypoint_longitude": -4.187143188645706
},
{
"target_waypoint_latitude": -3.187143188645706,
"target_waypoint_longitude": 51.37072283932642
"target_waypoint_latitude": 51.37072283932642,
"target_waypoint_longitude": -3.187143188645706
},
{
"target_waypoint_latitude": -3.237143188645706,
"target_waypoint_longitude": 52.37072283932642
"target_waypoint_latitude": 52.37072283932642,
"target_waypoint_longitude": -3.237143188645706
}
]
}
......
{
"header": {
"message_ID": "t1237003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "t1237003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2023-03-16T00:00:00Z",
"version": 2,
"source": "autonomy_engine",
......
{
"header": {
"message_ID": "e1237003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "e1237003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2023-03-16T00:00:00Z",
"version": 2,
"source": "hermes.ecosub2",
......
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "gui",
"destination": "soar.all.all.all.from_platform.planning_configuration",
"delivery_type": "publish",
"destination": "",
"delivery_type": "broadcast",
"encoded": false
},
"payload":{
"message_type": "planning_configuration",
"planning_config_ID": 3,
"exclusion_zones": [
"planning_config_ID": 1,
"primitives": [
{
"geometry_coordinates": [
[
[
-4.187143188645706,
50.37072283932642
],
[
-4.202697005964865,
50.368816892405874
],
[
-4.203156724702808,
50.365640144076906
],
[
-4.19449868846155,
50.362267670845654
"instruction": "stay_outside",
"feature": {
"type": "Feature",
"properties": {
"name": "The Rock",
"type": "exclusion_zone"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-4.1777839187560915,
50.34173405662855
],
[
-4.1777839187560915,
50.33820949229701
],
[
-4.143667777943875,
50.33820949229701
],
[
-4.143667777943875,
50.34173405662855
],
[
-4.1777839187560915,
50.34173405662855
]
]
]
]
]
}
}
},
{
"instruction": "stay_inside",
"feature": {
"type": "Feature",
"properties": {
"name": "Survey Zone Charlie",
"type": "operating area"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-4.1777839187560915,
50.34173405662855
],
[
-4.1777839187560915,
50.33820949229701
],
[
-4.143667777943875,
50.33820949229701
],
[
-4.143667777943875,
50.34173405662855
],
[
-4.1777839187560915,
50.34173405662855
]
]
]
}
}
}
],
],
"squads": [
{
"squad_ID": 1,
"no_of_platforms": 1,
"squad_mission_type": "tracking",
"squad_state": "active",
"platforms": [
{
"operator": "hydrosurv",
"model": "reav",
"platform_ID": "reav-60-1",
"emergency": {
"additional_data": {},
"target_waypoint_latitude": -7.432,
"target_waypoint_longitude": 50.365,
"safe_command": "go_home",
"target_depth": 10.0
},
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"additional_data": {}
"platform_ID": "usvdecibel",
"active": true
}
],
"region_of_interest": {
"geometry_coordinates": [
[
[
-4.187143188645706,
50.37072283932642
],
[
-4.202697005964865,
50.368816892405874
],
[
-4.203156724702808,
50.365640144076906
],
[
-4.19449868846155,
50.362267670845654
]
]
]
}
]
},
{
"squad_ID": 2,
"no_of_platforms": 3,
"no_of_platforms": 4,
"squad_mission_type": "survey",
"squad_state": "active",
"platforms": [
{
"operator": "planet-ocean",
"platform_ID": "ecosub-1",
"model": "ecosub",
"active": true,
"beacon_ID": 10021,
"emergency": {
"additional_data": {},
"target_waypoint_latitude": -7.432,
"target_waypoint_longitude": 50.365,
"target_waypoint_latitude": 50.32933594228737,
"target_waypoint_longitude": -4.192219151149999,
"safe_command": "go_home",
"target_depth": 10.0
},
"min_altitude": 5.0,
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"target_altitude": 15.0,
"turning_radius": 1.5,
"endurance_relative_to_water_speed": {
"min_battery_rating": 2.25,
"max_battery_rating": 1.23,
"avg_battery_rating": 1.9
},
"scan_sensor": {
"sensor_type": "SIDESCAN",
"warmup_time": 60.0,
"swath_width": 38.0,
"frequency": 700.0,
"angle": 110.0
},
"additional_data": {
"scan_type": "DVL",
"swath_width": 10
"new_sensor_a": "test_sensor",
"range": 10.0
}
},
{
"operator": "planet-ocean",
"platform_ID": "ecosub-2",
"model": "ecosub",
"active": true,
"beacon_ID": 10021,
"emergency": {
"additional_data": {},
"target_waypoint_latitude": -0.432,
"target_waypoint_longitude": 20.365,
"target_waypoint_latitude": 50.32775207068519,
"target_waypoint_longitude": -4.192219151149999,
"safe_command": "go_home",
"target_depth": 0.0
},
"min_altitude": 5.0,
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"target_altitude": 15.0,
"turning_radius": 1.5,
"endurance_relative_to_water_speed": {
"min_battery_rating": 2.25,
"max_battery_rating": 1.23,
"avg_battery_rating": 1.9
},
"scan_sensor": {
"sensor_type": "SIDESCAN",
"warmup_time": 60.0,
"swath_width": 38.0,
"frequency": 700.0,
"angle": 110.0
},
"additional_data": {
"new_sensor_a": "test_sensor",
"range": 10.0
}
},
{
"operator": "planet-ocean",
"platform_ID": "ecosub-3",
"model": "ecosub",
"active": true,
"beacon_ID": 10021,
"emergency": {
"target_waypoint_latitude": 50.326744124905844,
"target_waypoint_longitude": -4.184550412882118,
"safe_command": "go_home",
"target_depth": 0.0
},
"min_altitude": 5.0,
"max_velocity": 0.9,
"min_velocity": 0.1,
"target_altitude": 15.0,
"turning_radius": 1.5,
"endurance_relative_to_water_speed": {
"min_battery_rating": 2.25,
"max_battery_rating": 1.23,
"avg_battery_rating": 1.9
},
"scan_sensor": {
"sensor_type": "SIDESCAN",
"warmup_time": 60.0,
"swath_width": 38.0,
"frequency": 700.0,
"angle": 110.0
},
"additional_data": {
"scan_type": "DVL",
"swath_width": 10
"new_sensor_a": "test_sensor",
"range": 10.0
}
},
{
"operator": "planet-ocean",
"platform_ID": "ecosub-4",
"model": "ecosub",
"active": true,
"beacon_ID": 10021,
"emergency": {
"target_waypoint_latitude": 50.32616814629094,
"target_waypoint_longitude": -4.188610333142037,
"safe_command": "go_home",
"target_depth": 0.0
},
"min_altitude": 5.0,
"max_velocity": 0.9,
"min_velocity": 0.1,
"target_altitude": 15.0,
"turning_radius": 1.5,
"scan_sensor": {
"sensor_type": "SIDESCAN",
"warmup_time": 60.0,
"swath_width": 38.0,
"frequency": 700.0,
"angle": 110.0
},
"additional_data": {
"new_sensor_a": "test_sensor",
"range": 10.0
}
}
]
......@@ -129,23 +243,39 @@
"squad_ID": 3,
"no_of_platforms": 1,
"squad_mission_type": "inspection",
"squad_state": "active",
"platforms": [
{
"operator": "noc",
"platform_ID": "ah-1",
"model": "autosub",
"active": true,
"beacon_ID": 2407,
"emergency": {
"additional_data": {},
"target_waypoint_latitude": 20.432,
"target_waypoint_longitude": 50.365,
"target_waypoint_latitude": 50.3342284629413,
"target_waypoint_longitude": -4.19759350502369,
"safe_command": "abort_now",
"target_depth": 0.0
},
"min_altitude": 5.0,
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"target_altitude": 15.0,
"turning_radius": 1.5,
"endurance_relative_to_water_speed": {
"min_battery_rating": 2.25,
"max_battery_rating": 1.23,
"avg_battery_rating": 1.9
},
"scan_sensor": {
"sensor_type": "SIDESCAN",
"warmup_time": 60.0,
"swath_width": 38.0,
"frequency": 700.0,
"angle": 110.0
},
"additional_data": {
"scan_type": "MBES"
"new_sensor_a": "test_sensor",
"range": 10.0
}
}
]
......
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "hermes",
......
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "b427003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "ecosub_c2",
......
{
"header": {
"message_ID": "t1237003c-0000-11aa-a1eb-bvcdfghjgfdd",
"message_ID": "t1237003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2023-03-16T00:00:00Z",
"version": 2,
"source": "hermes.ah1",
......
{
"header": {
"message_ID": "e1237003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2023-03-16T00:00:00Z",
"version": 2,
"source": "ecosub.ecosub-c2",
"destination": "soar.planet-ocean.ecosub.ecosub-2.from_platform.survey",
"delivery_type": "publish",
"encoded": false
},
"payload": {
"message_type": "survey",
"timestamp": "2026-12-21T00:00:00Z",
"latitude_A": 188.1,
"longitude_A": -10.122,
"latitude_B": 178.2,
"longitude_B": -10.122,
"latitude_C": 177.9,
"longitude_C": -10.122,
"latitude_D": 178.2,
"longitude_D": -11.122,
"latitude_E": 179.2,
"longitude_E": -11.122,
"platform_ID": "ecosub-2",
"track_ID": 12
}
}
\ No newline at end of file
{
"header": {
"message_ID": "t1237003c-0000-11aa-a1eb-b1cdf2342fdd",
"timestamp": "2023-03-16T00:00:00Z",
"version": 2,
"source": "hermes.ecosub-2",
"destination": "soar.noc.autosub.alr-52.from_platform.survey_encoded",
"delivery_type": "publish",
"encoded": true
},
"payload": {
"message_type": "survey_encoded",
"data": "HWYFBAAD+zwBySUAAAADVek72v1N2lUAAAAA9P2cP166ab+9cg==",
"file_name": "ecosub2-survey-data_03837434286438.sbd",
"mime_type": "application/gzip",
"is_binary": true
}
}
\ No newline at end of file