TL;DR: the Scout ADS-B receiver transmits its data using a proprietary, undocumented format that I cannot decode, but perhaps with scrutiny it could be decoded and used for fun projects. Come for the story of my process; stay for the crappy responses from ForeFlight and uAvionix tech support. This article is part 1, wouldn’t it be nice if there were a part 2…?

The uAvionix Scout is a dual-band ADS-B receiver designed for use in private aviation. For those not familiar, ADS-B is a technology used to communicate traffic and inflight weather information to pilots; a typical use-case is to enhance the pilot’s situational awareness by displaying this info on the pilot’s iPad which is running an “electronic flight bag” app like ForeFlight. (ADS-B data itself is free to use, is subscriptionless, and is transmitted from FAA stations, all of which is paid for with your tax dollar.)
Although the Scout device has been discontinued you can find them on eBay for less than $200 US. It’s a compact piece of gear, about the size of a pack of gum, and is powered by 5V micro-USB.
ForeFlight summarizes its feature set nicely on https://foreflight.com/support/scout/ :
Scout provides dual-band ADS-B In capabilities. With antennas for both the 978 MHz and 1090 MHz frequency bands, Scout enables the display of inflight weather and traffic on ForeFlight Mobile. Scout supports the full range of FIS-B weather and data, including animated regional and CONUS NEXRAD, METARs, TAFs, AIR/SIGMETs, PIREPs, winds and temps aloft, TFRs, NOTAMs, and SUA information. Scout can also receive air-to-air traffic information from ADS-B Out equipped aircraft and re-broadcast traffic information (ADS-R and TIS-B) from FAA ground towers. Keep in mind that if your aircraft is not equipped with ADS-B Out, then you will have a limited view of traffic on ForeFlight.
That’s a wealth of data that would be wonderful to read and display.
I acquired a Scout some time ago and used it happily prior to upgrading to a more featureful Stratux unit. Afterward the Scout languished in a drawer until I wondered if it would be possible to use the Scout data on the ground, outside the cockpit.1
The typical way a ForeFlight user utilizes the Scout (or the Stratux) is over Wi-Fi: the Scout maintains a low-power open network which the iPad joins. Upon powering the unit the Scout advertises an unencrypted Wi-Fi access point with ESSID “Scout-A702” in my case – and of course any device can join, not just iPads.
I attached to the Wi-Fi with my computer and fired off nmap scans of TCP and UDP to see what ports might be available. The Scout was at 192.168.4.1, and it provided my computer the IP address 192.168.4.100 via DHCP.
$ nmap -sT 192.168.4.1
Starting Nmap 7.92 ( https://nmap.org ) at ___
Nmap scan report for 192.168.4.1
Host is up (0.046s latency).
Not shown: 999 closed tcp ports (conn-refused)
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.80 seconds
$ sudo nmap -sU 192.168.4.1
Starting Nmap 7.92 ( https://nmap.org ) at ___
Nmap scan report for 192.168.4.1
Host is up (0.019s latency).
Not shown: 999 closed udp ports (port-unreach)
PORT STATE SERVICE
4000/udp open|filtered icq
MAC Address: a:b:c:d:e:f (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 1.85 seconds
I would come back to UDP 4000 in a bit; I wanted to examine that webserver first.
It turns out that there is a very tiny web page there:

Interesting. Those two Update hyperlinks point to /update and /pingUpdate. Those might be worth exploring later. ForeFlight notes, “You can update Scout’s firmware directly through ForeFlight.” Perhaps ForeFlight uses these two HTTP endpoints for this purpose.
Before proceeding I ran feroxbuster (a Rust-based utility similar to gobuster or dirbuster) to try to discover any hidden API endpoints on the unit. I was unable to find any additional endpoints using this technique.
feroxbuster -d 1 --url http://192.168.4.1 -w SecLists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-small.txt
The next logical step was to let ForeFlight and the Scout talk to each other and observe their network traffic. The observation computer was Linux-based, so it was a trivial matter to put its Wi-Fi adapter in monitor mode, set it to channel 1 (the channel of Scout-A702), and begin monitoring the 802.11 traffic between ForeFlight and the Scout.2
The first thing I noticed was ForeFlight advertising this JSON string as a UDP broadcast on port 63093 every five seconds:3
{"App":"ForeFlight","GDL90":{"port":4000}}
Interesting. ForeFlight was advertising some sort of service or API on UDP port 4000, the same open port that nmap revealed on the Scout. I also noticed ForeFlight regularly broadcasting a curious string:
i-want-to-play-ffm-udp
A little googling brought me to this page: https://www.foreflight.com/connect/spec/ , “GDL 90 Extended Specification”. Being unfamiliar with said spec I did more googling; it turns out that GDL 90 is a Garmin aviation ADS-B datalink transceiver as well as a data interchange specification apparently based on this device.
The Specification website above said,
ForeFlight offers the industry-standard GDL 90 Data Interface Specification defined below for third-party devices to transmit live inflight data to ForeFlight Mobile. Properly configured devices will be able to display ADS-B weather and traffic, AHRS, device name information, and GPS data in the ForeFlight Mobile app.
…
ForeFlight expects data sent using UDP to port 4000 on the iOS device.
The website went on to describe the ForeFlight broadcast JSON on port 63093 that I noted with Wireshark, as well as the message specification. This was exciting! This might be the information I needed to decipher the messages flowing between ForeFlight and the Scout. On this site was a link to a FAA-hosted Garmin PDF titled “GDL 90 Data Interface Specification”. I saved this for later reference.
I continued to monitor the connection in Wireshark. The UDP traffic flowing from the Scout into ForeFlight port 4000 had evident UDP payloads but of differing lengths: 34 bytes, 35 bytes, and 52 bytes.



I referred to the Garmin PDF mentioned earlier and discovered information about decoding the payload in section 2.2.1:
The basic message structure is as follows (see Figure 1): 1) A Flag Byte character (0x7E). 2) A one-byte Message ID which specifies the type of message being transmitted. 3) The Message Data, which can be of variable lengths. 4) A message Frame Check Sequence (FCS). The FCS is a 16-bit CRC with the least significant byte first. 5) Another Flag Byte character (0x7E).
Observing the captured payloads above it was clear that these adhered somewhat (but not totally) to the Garmin spec: they began and ended with 0x7e as specified, but the second byte (the identifying Message ID) was a puzzler: in each case it is 0x26 (decimal 38). The Garmin document stipulated a number of Message ID values in section 3, “Message Definitions.” None of these were 0x26 / decimal 38.
I referred back to ForeFlight’s “Extended Specification” website discovered earlier. It too did not define any message with ID 0x26. (It did, by implication, indicate that ForeFlight was happy to extend the Garmin messaging spec with their own message types. Clearly I was observing undocumented extensions.)
I googled further and stumbled across an IEEE paper titled GDL90fuzz: Fuzzing – GDL-90 Data Interface Specification Within Aviation Software and Avionics Devices — A Cybersecurity Pentesting Perspective available at https://ieeexplore.ieee.org/document/9709804 . This was an interesting analysis in its own right and I encourage you to read it; there’s some impressive work done therein.
The paper yielded this notable gem that was relevant to my Scout work:
Some vendors have their own interpretation of the protocol outside of the Garmin standard. For example, uAvionix’s SkyEcho2 mainly uses the standard messaging types, but it outputs its ownship message with the message type code 101. On the other hand, ForeFlight’s Sentry extends the protocol and does not communicate with the standard message types. Sentry transmits messages with IDs 37 and 38, which are longer than the standard heartbeat, ownship, and traffic messages and most likely contain multiple message types in a single packet.4
The IEEE researchers had seen exactly what I was seeing: message traffic using undocumented / nonstandard IDs.
I also belatedly realized that the 52-byte message above was in fact two concatenated messages in one payload: ID 38 followed by ID 37.
Further research turned over no new data on what these undocumented messages might contain. I decided to try a bit of a Hail Mary: I would ask the vendors if they had any documentation to share. (It seemed like a reasonable request; after all, ForeFlight maintains a nice public website with their “extended specification.”)
I emailed the support addresses of these two firms:
Hi. I’m trying to find documentation on the GDL90 protocol extensions embraced by the Scout and Sentry products — in particular I’m seeking documentation on the nonstandard message IDs 37 (0x25) and 38 (0x26).
I’ve consulted Foreflight’s page here : https://www.foreflight.com/connect/spec/ but unfortunately it doesn’t mention these two message IDs.
Are you able to forward me some documentation on this, please?
The responses I got back seemed to be wary and dripping with suspicion. ForeFlight sulkily quizzed me on where I had found the nonstandard messages and chided me that their existing public documentation was complete. I replied with my Wireshark data; ForeFlight then shut down the conversation:
Thank you for your request. The messages you are inquiring about are part of the proprietary data sent between ForeFlight Mobile and the Sentry line of products that we co-developed with uAvionix. Unfortunately, we are unable to provide additional documentation regarding these UDP messages.
uAvionix was even less friendly, replying tersely:
Thank you for contacting uAvionix, unfortunately we are not able to provide information on those proprietary messages.
So there you have it. The Scout (and presumably Sentry) communicate with ForeFlight using a private messaging extension to the open GDL-90 spec. It’s a shame that neither firm will disclose the contents or formats of these messages, as it would be delightful to decode them and use them for other fun tasks. I would love insight into the byte layout of messages 0x25 and 0x26.
- Yes, I understand that receiving ADS-B data on the ground can be challenging; ADS-B works best at altitude when in proximity to an ADS-B ground station. It is still possible to receive broadcasts from in-range aircraft and rebroadcast ground station data. It really just depends on location factors. ↩︎
- Could I have just associated the computer to the Scout’s open network? Sure. But in my experience promiscuous-mode wifi capture doesn’t always work perfectly; monitor mode is a few extra steps but more reliable. ↩︎
- Unlike TCP, UDP can broadcast since it is connectionless. ↩︎
- The IEEE paper also mentions, “When the app is accepting traffic, it sends ‘i-want-to-play-ffm-udp’; and when it goes to sleep it sends ‘i-cannot-play-ffm-udp.’” I observed the former but not the latter. ↩︎

