A minimal GDL90 (over WiFi) tester using selected AvareX code (thanks ZK) as a base, with additional decoding and instrumentation. I use on Android (mostly) as a simple, portable, stand-alone app to assert GDL90 over WiFi reception, message types, help out Avare* forum users, diagnose my non-compliant new Dynon HDX :-( , etc.
You will have to "side-load" the (latest) .apk from this page (0.0.10 is current). If that's not something you understand or are comfortable with, then I can't help you with additional support. This information from Avare* may help.
To minimize file sizes (~13-17 MB), there are three separate versions of the
app-*.apkfiles here. Choose the version corresponding to your Android device's Application Binary Interface (ABI). The primary ABIs arearm64-v8a(64-bit, most modern devices),armeabi-v7a(32-bit, common older devices), andx86_64(emulators and some Intel-based devices).
The "refresh" button at the bottom right flushes the console queue to control scrolling, etc. That console window is scrollable, but doesn't (yet?) update until you click the refresh button (do it often).
The example screenshot below (against stratux v1.6r1-eu027) shows various GDL90 message counts at the top, plus more per-message detail in the Console by port (4000 in this case). Selected values explained:
- Heartbeat shows 36 messages of standard GDL90 Heartbeat and 33 of the stratux-identifying Heartbeat plus some bit decoding)
- Ownship shows 33 messages, decoded as N342ME/mode-S plus lat/long and integrity bit decoding
- 90 Traffic messages, latest target is SWA2276 with pressure altitude
- Unknown shows 33 messages of type 0x53 which is a non-standard GDL90 message the tester is currently not decoding, such as:
- 0x53 is "second stratux status" msg (SX message, from Hilton software)
- 0x65 is stratux ForeFlight "ID Message" (see stratux GDL message code, ForeFlight links below)
- Counts by port: AvareX 4000, 43211, 49002, 5557 (as of 0.55) plus 8384 for proprietary Dynon msgs (in-progress beta adds counts by Dynon msg type and some detail if unfiltered)
Reflecting the base AvareX code we listen on ports 4000, 43211, 49002, 5557
(storage.dart).
AvareX message_factory.dart defines the known message types
and processing, but the tester will decode the stratux Heartbeat and report any message type, including "unknown" types. AvareX summary:
Hex Message Process?
0x00 heartBeat no
0xCC stratux Heartbeat no, but PR submitted for PFD roll-orientation reversal
0x07 uplink yes
0x0A ownShip yes
0x0B ownShipGeometricAltitude yes
0x14 trafficReport yes
0x1E basicReport no [but reported by this tester]
0x1F longReport no [but reported by this tester]
0x4C ahrsReport yes
0x7A deviceReport no [but reported by this tester]
stratux encodes the GPS fix state but only in the stratux-specific HeartBeat (0xCC) message in byte1 bit 1 (along with AHRS enabled bit 0) -- but NOT in the GDL90 Heartbeat message status byte 1 bit 7 per the spec! (see p. 10). If the stratux has no GPS fix, only the 0xCC msg will reflect this, along with no Ownship msg with position every second (1 Hz).
The GDL90 spec allows a GPS fix of 0,0 to be sent (see section 3.4 p. 16) and this along with NIC=0 is supposed to signify an invalid fix, although at least AvareX ignores this scenario and assumes 0,0 is valid without checking NIC or HeartBeats(s), etc. stratux is also non-compliant and does not use the 0x00 msg bit and just stops sending Ownship (spec says send ownship but 0,0 and NIC=0 means invalid). Either I misunderstand the spec or many hardware/software implementors are out of spec.
Using my tester I confirmed that my new (March 2025) Dynon Skyview HDX is not GDL90-compliant: the HDX sends no Heartbeat or Ownship messages! These issues have been reported by me and others and I've discussed with Dynon over tickets and in-person, but no traction yet for Dynon to shore up basic GDL90 standard compliance. Frankly, I'm surprised (and disappointed) that Dynon with their reputation isn't GDL90 standard compliant.
The screenshot below from 2026-01-30 shows this, including that HDX includes my ship (N342ME) in the Traffic report rather than filtering from received (TIS-B?) and just emitting as a proper Ownship for N342ME. The HDX should know my tail number as integrated avionics, whereas the stratux requiries configuring your tail/ICAO, or ideally, at the EFB client (consider a CFI moving their stratux between aircraft: better to configure from a menu/list at the EFB, but some people argue this point).
Warning
As of 0.0.10 there is Dynon proprietary protocol (port 8384) detection and counting of all message types. If the "filter" icon (bottom right, next to refresh) is removed (default: enabled, detail suppressed), then decoded message detail is provided in the console. WARNING -- there can be a LOT due to ADAHRS and other high-frequency messages, so be careful with removing the default filtering. Future use (e.g. flight plan push/pull, GDL90 AHRS support) is possible.
You can cut&paste console outout for exporting data from the tester. No, no output saved to a file (yet, maybe ever).
Here is a sample which includes Dynon protocol detail.
I wanted a stand-alone tool for Android (my use case, and occasionally Windows), so I decided to use the multi-platform Flutter framework (despite the extra multi-platform overhead) since that's what AvareX uses and I was already developing some code contributions for AvareX (Nexrad/layer opacity/sliders, TFRs fix after FAA change, bug fixes, etc.). Perhaps this instrumentation/diagnostic code will work back into AvareX at some point, if ZK allows it...
- GDL90 spec: https://www.faa.gov/sites/faa.gov/files/air_traffic/technology/adsb/archival/GDL90_Public_ICD_RevA.PDF
- ForeFlight extensions: https://www.foreflight.com/connect/spec/
- stratux identifying Heartbeat, etc.: https://github.com/cyoung/stratux/blob/master/notes/app-vendor-integration.md
- stratux GDL90-ish message code: https://github.com/cyoung/stratux/blob/master/main/gen_gdl90.go#L629
- Dynon issues reported: https://forum.flydynon.com/threads/ads-b-over-wifi.15650/page-2#post-92735
- Andrew Sarangan's ADS-B Monitor (Android): https://github.com/asarangan/ADSB_Monitor2
- Done: Add timeout for Ownship if older than, say, 5 sec (should be 1/sec)
- Note any GPS fix bits when 0/false (or NIC/NACp are noteworthy)
- Collect exemplary iLevil screenshot from Oshkosh 2025 (looks compliant, yay iLevil)


