MQTT Payload Specification

Reference documentation for the MQTT message format used by GDS Dashboards test stations.

Connection Details
Parameter Value
Hostdashboards.carlalsford.com (or localhost in dev)
Port1883
QoS0 (At most once)
ProtocolMQTT v3.1.1 / v5
Topicgds/station/{"{clientId}"}/data
Security

The broker enforces three checks on every external client:

Registered client_id only. Connections whose MQTT client_id doesn't match a registered station are rejected with ClientIdentifierNotValid.

Per-station credentials. If a station has a username/password configured, the broker validates them and rejects with BadUserNameOrPassword on mismatch.

Topic namespace. External clients can only publish to topics under gds/station/{"{their-clientId}"}/ — cross-station publishes are silently dropped.

Heads up: 1883 is plain TCP. Credentials travel in clear, so don't reuse a sensitive password here. A TLS endpoint (port 8883) is on the roadmap.

Test Type Payloads
Triaxial Test

Demo topic: gds/triaxial
Station topic: gds/station/{"{clientId}"}/data

JSON Payload

{
  "id":                 0,          // int
  "timestamp":          "2026-01-01T00:00:00Z", // DateTime (ISO 8601)
  "phase":              "Idle",     // string - "Idle" / "Saturation" / "Consolidation" / "Shear"
  "cell_pressure":      0.0,        // double (kPa) - applied confining stress
  "back_pressure":      0.0,        // double (kPa) - applied pore pressure
  "pore_pressure":      0.0,        // double (kPa) - measured pore water pressure
  "deviator_stress":    0.0,        // double (kPa) - q = sigma1 - sigma3
  "axial_displacement": 0.0,        // double (mm)
  "axial_strain":       0.0,        // double (%)
  "volume_change":      0.0,        // double (mL)
  "axial_force":        0.0,        // double (N)
  "effective_stress":   0.0,        // double (kPa) - sigma3' = cell - pore
  "b_value":            0.0,        // double - Skempton's B parameter
  "elapsed_seconds":    0.0         // double - time since phase start
}
Consolidation Test

Demo topic: gds/consolidation
Station topic: gds/station/{"{clientId}"}/data

JSON Payload

{
  "id":                     0,          // int
  "timestamp":              "2026-01-01T00:00:00Z", // DateTime (ISO 8601)
  "phase":                  "Idle",     // string - "Idle" / "Loading" / "Unloading" / "Complete"
  "load_stage":             0,          // int - current stage number
  "applied_stress":         0.0,        // double (kPa) - vertical stress
  "settlement":             0.0,        // double (mm) - total settlement
  "void_ratio":             0.0,        // double - e, current void ratio
  "pore_pressure":          0.0,        // double (kPa) - excess pore pressure
  "degree_consolidation":   0.0,        // double (%) - U
  "cv":                     0.0,        // double (m2/year) - coefficient of consolidation
  "volume_change":          0.0,        // double (mL)
  "sqrt_time":              0.0,        // double (sqrt-min) - for plotting
  "elapsed_seconds":        0.0         // double
}
Direct Shear Test

Demo topic: gds/directshear
Station topic: gds/station/{"{clientId}"}/data

JSON Payload

{
  "id":                     0,          // int
  "timestamp":              "2026-01-01T00:00:00Z", // DateTime (ISO 8601)
  "phase":                  "Idle",     // string - "Idle" / "Stage1" / "Stage2" / "Stage3" / "Complete"
  "stage":                  0,          // int
  "normal_stress":          0.0,        // double (kPa)
  "shear_stress":           0.0,        // double (kPa)
  "shear_displacement":     0.0,        // double (mm) - horizontal
  "vertical_displacement":  0.0,        // double (mm) - dilation/compression
  "shear_strain":           0.0,        // double (%)
  "peak_shear_stress":      0.0,        // double (kPa) - peak so far
  "friction_angle":         0.0,        // double (degrees) - calculated
  "cohesion":               0.0,        // double (kPa) - calculated
  "elapsed_seconds":        0.0         // double
}
Permeability Test

Demo topic: gds/permeability
Station topic: gds/station/{"{clientId}"}/data

JSON Payload

{
  "id":                     0,          // int
  "timestamp":              "2026-01-01T00:00:00Z", // DateTime (ISO 8601)
  "phase":                  "Idle",     // string - "Idle" / "Saturation" / "Permeation" / "Complete"
  "cell_pressure":          0.0,        // double (kPa)
  "back_pressure":          0.0,        // double (kPa) - upstream
  "outlet_pressure":        0.0,        // double (kPa) - downstream
  "differential_pressure":  0.0,        // double (kPa)
  "flow_rate":              0.0,        // double (mL/min)
  "cumulative_flow":        0.0,        // double (mL)
  "hydraulic_conductivity": 0.0,        // double (m/s) - k value
  "temperature":            0.0,        // double (deg C)
  "hydraulic_gradient":     0.0,        // double - i = delta-h / L
  "elapsed_seconds":        0.0         // double
}
Cyclic Triaxial Test

Demo topic: gds/cyclictriaxial
Station topic: gds/station/{"{clientId}"}/data

JSON Payload

{
  "id":                     0,          // int
  "timestamp":              "2026-01-01T00:00:00Z", // DateTime (ISO 8601)
  "phase":                  "Idle",     // string - "Idle" / "Consolidation" / "Cycling" / "Complete"
  "cycle_number":           0,          // int
  "cell_pressure":          0.0,        // double (kPa)
  "deviator_stress":        0.0,        // double (kPa) - cyclic load
  "axial_strain":           0.0,        // double (%) - total
  "pore_pressure":          0.0,        // double (kPa)
  "excess_pore_ratio":      0.0,        // double - ru = delta-u / sigma'c
  "cyclic_stress_ratio":    0.0,        // double - CSR = qcyc / (2 x sigma'c)
  "axial_strain_amplitude": 0.0,        // double (%) - per cycle
  "resilient_modulus":      0.0,        // double (MPa)
  "damping_ratio":          0.0,        // double (%)
  "elapsed_seconds":        0.0         // double
}

All numeric fields default to 0 or 0.0. Timestamps are ISO 8601 UTC. The phase field indicates the current stage of the test and defaults to "Idle". For custom payloads, just publish whatever JSON you like to the station's topic — the Detect from payload wizard on the Stations page will introspect the last message and offer to create matching variables.