Skip to content

OnFlight Hub and Hub Plus / Developer Manual

UDP output format

Live Hub data, Stadia, heart rate, and metadata message layouts.

On this page

The Hub broadcasts these UDP messages to all devices on its Wi-Fi subnet using the subnet broadcast address, 192.168.23.255. Connect your receiving device to the Hub’s Wi-Fi network and listen on the ports your application needs.

Output ports

Name Port Direction Introduced Purpose
Hub data 2000 Output Firmware 1 Hub state and status; firmware 6 changed this to Hub-only data.
Stadia 2003 Output Firmware 6 Rebroadcast of Stadia data received over Bluetooth.
Heart rate 2004 Output Firmware 6 Rebroadcast of Bluetooth heart rate.
Metadata 2005 Output Firmware 6 Serial number and aircraft/pilot metadata.

Hub data is broadcast at 50 Hz, metadata at 1 Hz, and heart rate whenever Bluetooth heart rate data is received. Stadia data is rebroadcast whenever a new Bluetooth measurement is received.

GDL 90 is a separate output interface with a default configurable port of 4000. See GDL 90 output format for its framing and message definitions.

Reading a message

  1. Connect your computer or application device to the Hub’s Wi-Fi network.
  2. Receive broadcast UDP datagrams on port 2000.
  3. Read the first byte to identify the message version. Use that version’s field and status tables below.
  4. Check the status flags to see whether the navigation system is initialized, sensors are healthy, and readings are new.
  5. For UDP Hub version 2, listen to the relevant separate ports for external measurements, heart rate, and metadata.

Each UDP message starts with its version byte. It does not contain the log file’s two-byte header, payload length, or Fletcher-16 checksum.

Encoding

Read fields in the order listed in the table. The Type column gives each field’s size:

Notation Meaning
U1, U2, U4 Unsigned integer, 1 / 2 / 4 bytes
I1, I2, I4 Signed integer, 1 / 2 / 4 bytes
C1 One character byte
F4 Four-byte, single-precision floating point
[N] Array of N elements

Multiply the stored integer by the listed scale to obtain the measurement. For example, a stored pitch of 1234 with scale 1 / 100 means 12.34 degrees. Follow the description instead for fields containing status bits or an altitude/year offset.

Multibyte fields are little-endian: the least significant byte comes first. Fields are packed together without padding.

Rounding and saturation

For Hub UDP version 2, the sender rounds measurements to the nearest stored integer. Halfway values round away from zero. Values that exceed the integer’s range are limited to its minimum or maximum, so the transmitted value can understate the size of a measurement.

For example, horz_pos_acc_ft and vert_pos_acc_ft use U1 with a scale of 0.1 ft. Their largest encoded value is 255, which decodes to 25.5 ft; the actual estimated error can be larger. Similarly, vel_acc_kts tops out at 25.5 knots. These limits are not special invalid-value markers. Use the status flags to assess data health.

Hub message versions

Use the first byte of the port 2000 message to select a layout. Versions are listed in ascending order below.

Version Complete message size Contents
0 91 bytes Hub, external air-data, and AGL measurements.
1 99 bytes Adds calibrated airspeed, wind, and Stadia identification.
2 67 bytes Hub measurements only; external measurements use separate ports.

Hub version 0

Port 2000 · output · 50 Hz · version byte 0

This version includes external air-data and AGL measurements.

Version 0 data fields

The message is 91 bytes, including the version byte, with no padding between fields.

Type Name Scale Unit Description
U1 version - - Version number, 0.
U1[6] status - - Flags listed in the status table below.
I1 cpu_die_temp_c 1 C CPU die temperature.
I1 imu_die_temp_c 1 C IMU die temperature.
I1 mag_die_temp_c 1 C Magnetometer die temperature.
I1 pres_die_temp_c 1 C Static pressure die temperature.
I1 airdata_die_temp_c 1 C External airdata module die temperature.
I1 agl_alt_die_temp_c 1 C External AGL altimeter module die temperature.
U1 horz_pos_acc_ft 1 / 10 ft Horizontal position accuracy estimate from the GNSS receiver.
U1 vert_pos_acc_ft 1 / 10 ft Vertical position accuracy estimate from the GNSS receiver.
U1 vel_acc_kts 1 / 10 kts Velocity accuracy estimate from the GNSS receiver.
U1 gnss_fix_num_sv - - The lower 3 bits encode the GNSS fix (0 = no fix, 2 = 2D fix, 3 = 3D fix, 4 = differential GNSS fix). The upper 5 bits encode the number of satellite vehicles used in the GNSS solution.
U1 utc_year - - Year from the GNSS receiver; add 1970 to obtain the calendar year.
U1 utc_month - - UTC month from the GNSS receiver.
U1 utc_day - - UTC day from the GNSS receiver.
U1 utc_hour - - UTC hour from the GNSS receiver.
U1 utc_min - - UTC minute from the GNSS receiver.
U1 utc_sec - - UTC second from the GNSS receiver.
I2 pitch_deg 1 / 100 deg Pitch angle (+up).
I2 roll_deg 1 / 100 deg Roll angle (+right).
I2 mag_var_deg 1 / 100 deg Magnetic variation (+east).
U2 true_heading_deg 1 / 100 deg Heading angle, true, 0 - 360.
U2 gnd_spd_kts 1 / 100 kts Ground speed.
U2 gnd_track_deg 1 / 100 deg Ground track, true, 0 - 360.
I2 flt_path_deg 1 / 100 deg Flight path angle.
I2 climb_rate_ftpm 1 ft/min Climb rate.
I2 load_factor 1 / 1000 G Load factor.
I2 pitch_rate_dps 1 / 10 deg/s Pitch rate (+pitch up).
I2 roll_rate_dps 1 / 10 deg/s Roll rate (+roll right).
I2 yaw_rate_dps 1 / 10 deg/s Yaw rate (+yaw right).
I2 accel_x_g 1 / 1000 G Acceleration (+forward out the nose).
I2 accel_y_g 1 / 1000 G Acceleration (+right).
I2 accel_z_g 1 / 1000 G Acceleration (+down).
U2 alt_wgs84_ft - ft Altitude above the WGS84 ellipsoid, biased by +10,000 ft (i.e. alt = alt_wgs84_ft - 10000).
U2 alt_msl_ft - ft Altitude above Mean Sea Level (MSL), biased by +10,000 ft (i.e. alt = alt_msl_ft - 10000).
U2 cabin_pres_alt_ft - ft Cabin pressure altitude, biased by +10,000 ft (i.e. pres_alt = cabin_pres_alt_ft - 10000).
U2 cabin_pres_pa 2 Pa Cabin pressure.
U2 airdata_static_pres_pa 2 Pa External airdata module static pressure.
U2 airdata_diff_pres_pa 1 Pa External airdata module differential pressure.
I2 airdata_oat_c 1 / 100 C External airdata module Outside Air Temperature (OAT).
U2 airdata_ias_kts 1 / 100 kts External airdata module Indicated Air Speed (IAS).
U2 airdata_tas_kts 1 / 100 kts External airdata module True Air Speed (TAS).
U2 airdata_pres_alt_ft - ft External airdata pressure altitude, biased by +10,000 ft (pres_alt = airdata_pres_alt_ft - 10000).
U2 airdata_density_alt_ft - ft External airdata density altitude, biased by +10,000 ft (density_alt = airdata_density_alt_ft - 10000).
I2 airdata_aoa 1 / 100 - External angle of attack. The AOA type flag selects degrees or pressure ratio.
I2 agl_alt_in 1 in External AGL altimeter altitude.
I4 lat_deg 1e-7 deg Latitude.
I4 lon_deg 1e-7 deg Longitude.
U4 sys_time_ms - ms Elapsed time since power-on.

Version 0 status flags

Byte 0 is the first byte of status. A flag is set when the byte AND the listed mask is nonzero. Use this version’s table; log packets and other UDP versions assign the bits differently.

Byte Mask Meaning when set
0 0x01 Filtered input voltage between configured low and warning voltages.
0 0x02 Filtered input voltage below configured low voltage.
0 0x04 System die temperatures (CPU, IMU, magnetometer, and static pressure sensor) all reporting ok.
0 0x08 CPU die temperature within the allowed range, with a 10°C margin inside the sensor limits.
0 0x10 INS initialized.
0 0x20 INS healthy.
1 0x01 New IMU data received.
1 0x02 IMU healthy.
1 0x04 IMU die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x08 New magnetometer data received.
1 0x10 Magnetometer healthy.
1 0x20 Magnetometer die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x40 New GNSS data received.
1 0x80 GNSS healthy.
2 0x01 New static pressure data received.
2 0x02 Static pressure healthy.
2 0x04 Static pressure die temperature within the allowed range, with a 10°C margin inside the sensor limits.
3 0x01 New external airdata message received.
3 0x02 External airdata module connected.
3 0x04 External airdata battery status warning.
3 0x08 External airdata battery status critically low.
3 0x10 External airdata board die temperature ok.
3 0x20 External airdata OAT measurement available.
3 0x40 External airdata AOA measurement available.
3 0x80 External airdata new static pressure data received.
4 0x01 External airdata static pressure healthy.
4 0x02 External airdata new differential pressure data received.
4 0x04 External airdata differential pressure healthy.
4 0x08 External airdata new OAT data received.
4 0x10 External airdata OAT healthy.
4 0x20 External airdata new AOA data received.
4 0x40 External airdata AOA healthy.
4 0x80 AOA is in degrees when set; a pressure ratio when clear.
5 0x01 New external AGL altimeter message received.
5 0x02 External AGL altimeter module connected.
5 0x04 External AGL altimeter battery status warning.
5 0x08 External AGL altimeter battery status critically low.
5 0x10 External AGL altimeter board die temperature ok.
5 0x20 External AGL altimeter new sensor data received.
5 0x40 External AGL altimeter sensor healthy.
5 0x80 External AGL altimeter sensor in range.

Hub version 1

Port 2000 · output · 50 Hz · version byte 1

This version includes external air-data and AGL measurements.

Version 1 data fields

The message is 99 bytes, including the version byte, with no padding between fields.

Type Name Scale Unit Description
U1 version - - Version number, 1.
U1[8] status - - Flags listed in the status table below.
I1 cpu_die_temp_c 1 C CPU die temperature.
I1 imu_die_temp_c 1 C IMU die temperature.
I1 mag_die_temp_c 1 C Magnetometer die temperature.
I1 pres_die_temp_c 1 C Static pressure die temperature.
I1 airdata_die_temp_c 1 C External airdata module die temperature.
I1 agl_alt_die_temp_c 1 C External AGL altimeter module die temperature.
U1 horz_pos_acc_ft 1 / 10 ft Horizontal position accuracy estimate from the GNSS receiver.
U1 vert_pos_acc_ft 1 / 10 ft Vertical position accuracy estimate from the GNSS receiver.
U1 vel_acc_kts 1 / 10 kts Velocity accuracy estimate from the GNSS receiver.
U1 gnss_fix_num_sv - - The lower 3 bits encode the GNSS fix (0 = no fix, 2 = 2D fix, 3 = 3D fix, 4 = differential GNSS fix). The upper 5 bits encode the number of satellite vehicles used in the GNSS solution.
U1 utc_year - - Year from the GNSS receiver; add 1970 to obtain the calendar year.
U1 utc_month - - UTC month from the GNSS receiver.
U1 utc_day - - UTC day from the GNSS receiver.
U1 utc_hour - - UTC hour from the GNSS receiver.
U1 utc_min - - UTC minute from the GNSS receiver.
U1 utc_sec - - UTC second from the GNSS receiver.
I2 pitch_deg 1 / 100 deg Pitch angle (+up).
I2 roll_deg 1 / 100 deg Roll angle (+right).
I2 mag_var_deg 1 / 100 deg Magnetic variation (+east).
U2 true_heading_deg 1 / 100 deg Heading angle, true, 0 - 360.
U2 gnd_spd_kts 1 / 100 kts Ground speed.
U2 gnd_track_deg 1 / 100 deg Ground track, true, 0 - 360.
I2 flt_path_deg 1 / 100 deg Flight path angle.
I2 climb_rate_ftpm 1 ft/min Climb rate.
I2 load_factor 1 / 1000 G Load factor.
I2 pitch_rate_dps 1 / 10 deg/s Pitch rate (+pitch up).
I2 roll_rate_dps 1 / 10 deg/s Roll rate (+roll right).
I2 yaw_rate_dps 1 / 10 deg/s Yaw rate (+yaw right).
I2 accel_x_g 1 / 1000 G Acceleration (+forward out the nose).
I2 accel_y_g 1 / 1000 G Acceleration (+right).
I2 accel_z_g 1 / 1000 G Acceleration (+down).
U2 alt_wgs84_ft - ft Altitude above the WGS84 ellipsoid, biased by +10,000 ft (i.e. alt = alt_wgs84_ft - 10000).
U2 alt_msl_ft - ft Altitude above Mean Sea Level (MSL), biased by +10,000 ft (i.e. alt = alt_msl_ft - 10000).
U2 cabin_pres_alt_ft - ft Cabin pressure altitude, biased by +10,000 ft (i.e. pres_alt = cabin_pres_alt_ft - 10000).
U2 cabin_pres_pa 2 Pa Cabin pressure.
U2 airdata_static_pres_pa 2 Pa External airdata module static pressure.
U2 airdata_diff_pres_pa 1 Pa External airdata module differential pressure.
I2 airdata_oat_c 1 / 100 C External airdata module Outside Air Temperature (OAT).
U2 airdata_ias_kts 1 / 100 kts External airdata module Indicated Air Speed (IAS).
U2 airdata_cas_kts 1 / 100 kts External airdata module Calibrated Air Speed (CAS).
U2 airdata_tas_kts 1 / 100 kts External airdata module True Air Speed (TAS).
U2 airdata_pres_alt_ft - ft External airdata pressure altitude, biased by +10,000 ft (pres_alt = airdata_pres_alt_ft - 10000).
U2 airdata_density_alt_ft - ft External airdata density altitude, biased by +10,000 ft (density_alt = airdata_density_alt_ft - 10000).
I2 airdata_aoa 1 / 100 - External angle of attack. The AOA type flag selects degrees or pressure ratio.
U2 airdata_wind_spd_kts 1 / 100 kts External airdata module estimated wind speed, kts.
U2 airdata_wind_dir_true_deg 1 / 100 deg External airdata module estimated wind direction, true, deg.
I2 agl_alt_in 1 in External AGL altimeter altitude.
I4 lat_deg 1e-7 deg Latitude.
I4 lon_deg 1e-7 deg Longitude.
U4 sys_time_ms - ms Elapsed time since power-on.

Version 1 status flags

Byte 0 is the first byte of status. A flag is set when the byte AND the listed mask is nonzero. Use this version’s table; log packets and other UDP versions assign the bits differently.

Byte Mask Meaning when set
0 0x01 Filtered input voltage between configured low and warning voltages.
0 0x02 Filtered input voltage below configured low voltage.
0 0x04 System die temperatures (CPU, IMU, magnetometer, and static pressure sensor) all reporting ok.
0 0x08 CPU die temperature within the allowed range, with a 10°C margin inside the sensor limits.
0 0x10 INS initialized.
0 0x20 INS healthy.
1 0x01 New IMU data received.
1 0x02 IMU healthy.
1 0x04 IMU die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x08 New magnetometer data received.
1 0x10 Magnetometer healthy.
1 0x20 Magnetometer die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x40 New GNSS data received.
1 0x80 GNSS healthy.
2 0x01 New static pressure data received.
2 0x02 Static pressure healthy.
2 0x04 Static pressure die temperature within the allowed range, with a 10°C margin inside the sensor limits.
3 0x01 New external airdata message received.
3 0x02 External airdata module connected.
3 0x04 External airdata battery status warning.
3 0x08 External airdata battery status critically low.
3 0x10 External airdata board die temperature ok.
3 0x20 External airdata OAT measurement available.
3 0x40 External airdata AOA measurement available.
3 0x80 External airdata new static pressure data received.
4 0x01 External airdata static pressure healthy.
4 0x02 External airdata new differential pressure data received.
4 0x04 External airdata differential pressure healthy.
4 0x08 External airdata new OAT data received.
4 0x10 External airdata OAT healthy.
4 0x20 External airdata new AOA data received.
4 0x40 External airdata AOA healthy.
4 0x80 AOA is in degrees when set; a pressure ratio when clear.
5 0x01 External airdata KCAS available.
5 0x02 External airdata wind estimate available.
6 0x01 New external AGL altimeter message received.
6 0x02 External AGL altimeter module connected.
6 0x04 External AGL altimeter battery status warning.
6 0x08 External AGL altimeter battery status critically low.
6 0x10 External AGL altimeter board die temperature ok.
6 0x20 External AGL altimeter new sensor data received.
6 0x40 External AGL altimeter sensor healthy.
6 0x80 External AGL altimeter sensor in range.
7 0x01 External AGL altimeter is a Skeeter Enterprises LLC Stadia sensor.

This version has eight status bytes. Only bit 0x01 is defined in byte 7; ignore its other bits.

Hub version 2

Port 2000 · output · 50 Hz · version byte 2

External measurements are not included; receive them on their assigned ports.

Version 2 data fields

The message is 67 bytes, including the version byte, with no padding between fields.

Type Name Scale Unit Description
U1 version - - Version number, 2.
U1[2] status - - Flags listed in the status table below.
I1 cpu_die_temp_c 1 C CPU die temperature.
I1 imu_die_temp_c 1 C IMU die temperature.
I1 mag_die_temp_c 1 C Magnetometer die temperature.
I1 pres_die_temp_c 1 C Static pressure die temperature.
U1 horz_pos_acc_ft 1 / 10 ft Horizontal position accuracy estimate from the GNSS receiver.
U1 vert_pos_acc_ft 1 / 10 ft Vertical position accuracy estimate from the GNSS receiver.
U1 vel_acc_kts 1 / 10 kts Velocity accuracy estimate from the GNSS receiver.
U1 gnss_fix_num_sv - - The lower 3 bits encode the GNSS fix (0 = no fix, 2 = 2D fix, 3 = 3D fix, 4 = differential GNSS fix). The upper 5 bits encode the number of satellite vehicles used in the GNSS solution.
U1 utc_year - - Year from the GNSS receiver; add 1970 to obtain the calendar year.
U1 utc_month - - UTC month from the GNSS receiver.
U1 utc_day - - UTC day from the GNSS receiver.
U1 utc_hour - - UTC hour from the GNSS receiver.
U1 utc_min - - UTC minute from the GNSS receiver.
U1 utc_sec - - UTC second from the GNSS receiver.
I2 pitch_deg 1 / 100 deg Pitch angle (+up).
I2 roll_deg 1 / 100 deg Roll angle (+right).
I2 mag_var_deg 1 / 100 deg Magnetic variation (+east).
U2 true_heading_deg 1 / 100 deg Heading angle, true, 0 - 360.
U2 gnd_spd_kts 1 / 100 kts Ground speed.
U2 gnd_track_true_deg 1 / 100 deg Ground track, true, 0 - 360.
I2 flt_path_deg 1 / 100 deg Flight path angle.
I2 climb_rate_ftpm 1 ft/min Climb rate.
I2 load_factor 1 / 1000 G Load factor.
I2 pitch_rate_dps 1 / 10 deg/s Pitch rate (+pitch up).
I2 roll_rate_dps 1 / 10 deg/s Roll rate (+roll right).
I2 yaw_rate_dps 1 / 10 deg/s Yaw rate (+yaw right).
I2 accel_x_g 1 / 1000 G Acceleration (+forward out the nose).
I2 accel_y_g 1 / 1000 G Acceleration (+right).
I2 accel_z_g 1 / 1000 G Acceleration (+down).
U2 alt_wgs84_ft - ft Altitude above the WGS84 ellipsoid, biased by +10,000 ft (i.e. alt = alt_wgs84_ft - 10000).
U2 alt_msl_ft - ft Altitude above Mean Sea Level (MSL), biased by +10,000 ft (i.e. alt = alt_msl_ft - 10000).
U2 cabin_pres_alt_ft - ft Cabin pressure altitude, biased by +10,000 ft (i.e. pres_alt = cabin_pres_alt_ft - 10000).
U2 cabin_pres_pa 2 Pa Cabin pressure.
I4 lat_deg 1e-7 deg Latitude.
I4 lon_deg 1e-7 deg Longitude.
U4 sys_time_ms - ms Elapsed time since power-on.

Version 2 status flags

Byte 0 is the first byte of status. A flag is set when the byte AND the listed mask is nonzero. Use this version’s table; log packets and other UDP versions assign the bits differently.

Byte Mask Meaning when set
0 0x01 Filtered input voltage between configured low and warning voltages.
0 0x02 Filtered input voltage below configured low voltage.
0 0x04 CPU die temperature within the allowed range, with a 10°C margin inside the sensor limits.
0 0x08 INS initialized.
0 0x10 INS healthy.
0 0x20 New IMU data received.
0 0x40 IMU healthy.
0 0x80 IMU die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x01 New magnetometer data received.
1 0x02 Magnetometer healthy.
1 0x04 Magnetometer die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x08 New static pressure data received.
1 0x10 Static pressure healthy.
1 0x20 Static pressure die temperature within the allowed range, with a 10°C margin inside the sensor limits.
1 0x40 New GNSS data received.
1 0x80 GNSS healthy.

Stadia rebroadcast

Port 2003 · output · introduced in firmware 6

This message rebroadcasts Stadia AGL data received over Bluetooth. Altitude has the mounting-height bias removed.

Type Name Scale Unit Description
U1 version - - Message version number, 0.
U1 batt_prcnt 1 % Estimated battery life percentage reported from Stadia (100% is full, 0% is empty).
I2 agl_alt_in 1 in Above Ground Level (AGL) altitude reported from Stadia with the altitude bias removed, in.

Heart rate

Port 2004 · output · introduced in firmware 6

This message is broadcast whenever Bluetooth heart-rate data is received.

Type Name Scale Unit Description
U1 version - - Message version number, 0.
U1 heart_rate_bpm 1 BPM Heart rate beats per minute.

Metadata

Port 2005 · output · 1 Hz · introduced in firmware 6

This message contains the serial number, aircraft tail number, pilot name, and aircraft type. It begins with the version byte; there is no MD header, length byte, or Fletcher-16 checksum.

Type Name Scale Unit Description
U1 version - - Message version number, 0.
U1[6] serial_num - - OFH serial number.
C1[12] tail_num - - Aircraft tail number, if configured. Text ending with a null byte.
C1[24] pilot_name - - Pilot name, if configured. Text ending with a null byte.
C1[12] aircraft_type - - Aircraft type, if configured. Text ending with a null byte.