Chapter 25
Technical Reference
In this chapter
#Architecture
The app is written in Kotlin. A foreground service (AprsIsService) owns the APRS-IS connection, the packet stream, the station map, messaging, beaconing, iGating and alerting. The phone interface, the widget, the Quick Settings tiles and the Android Auto screens are views onto it. Received packets from every source are parsed by one APRS decoder and merged.
#Supported APRS formats
| Format | Notes |
|---|---|
| Uncompressed position | ! = / @, with and without timestamp (DHM zulu/local, HMS); position ambiguity; course/speed, PHG, RNG, DFS, altitude /A=. |
| Compressed position | Base-91 lat/lon, course/speed, range or altitude from the cs bytes. |
| Mic-E | Current and old Mic-E, all message codes, speed and course, altitude, manufacturer suffix, overlays. |
| DAO | !DAO! extra precision (human-readable and base-91). |
| Weather | Positionless _, and weather after a position with the _ symbol: wind, gust, temperature, rain 1 h / 24 h / since midnight, humidity, pressure, luminosity, snow. |
| Objects and items | ; and ), live and killed, compressed or uncompressed. |
| Telemetry | T# packets, comment telemetry |ss11|, PARM/UNIT/EQNS/BITS messages. |
| Messages | Messages, acks, rejects, reply-acks, bulletins, announcements, NWS. |
| Status, capabilities, queries | > status (with Maidenhead), < capabilities, ? queries. |
| Third-party | } packets are unwrapped. |
| NMEA | $GPRMC and $GPGGA raw GPS. |
| Maidenhead beacon | [IO93ab]. |
The decoder was validated against the reference test vectors of the Perl Ham::APRS::FAP library and differentially against the aprslib Python library on thousands of real and generated packets, and fuzz-tested with millions of malformed inputs without a crash.
#Protocols and interfaces
| Item | Detail |
|---|---|
| APRS-IS | TCP, login vers G7JJF-AprsClient + app version, keepalive 240 s, read timeout 30 s, retry 10 s. |
| Tocall | APZGJJ |
| KISS | FEND 0xC0, FESC 0xDB, TFEND 0xDC, TFESC 0xDD; data frames on port 0. |
| Bluetooth SPP | UUID 00001101-0000-1000-8000-00805F9B34FB, paired devices. |
| BLE | Nordic UART 6E400001-B5A3-F393-E0A9-E50E24DCCA9E (write …0002, notify …0003); Mobilinkd BLE KISS 00000001-ba2a-46c9-ae49-01b0961f68bb (write …0002, notify …0003); Radtel 0000FFE0 (notify FFE1, write FF31 or FFE2); HM-10 serial 0000FFE0 (FFE1 both ways). |
| AGWPE | Frames G, k (raw monitor), K (raw), V (unproto). |
| USB serial | usb-serial-for-android; CP2102, CH34x, FTDI, CDC-ACM; 8N1. |
| AX.25 | v2.0 modulo 8 connected mode; UI frames control 0x03, PID 0xF0. |
#Storage and retention
| Data | Kept |
|---|---|
| Station log | Saved every 10 minutes; stations heard in the last 7 days are reloaded. |
| Packet cache | The last 100 packets are saved for the next start; up to 500 in memory. |
| Messages | Your own and those to you, 500 on disk. |
| Weather history | 30 days. |
| Bulletins | 200; those from the last 48 hours are reloaded. |
| Track log | 10 000 points. |
| Stream logs | 7 daily files. |
| Crash logs | 5 newest. |
| Map tiles | 50 MB. |
| App log | Trimmed to the last 400 lines when it exceeds 200 kB. |
#Build information
| Item | Value |
|---|---|
| Package | com.g7jjf.aprsclient |
| Version | 1.9.9 (versionCode 55) |
| SDK | minSdk 26, compileSdk and targetSdk 36 |
| Toolchain | Kotlin 1.9.22, Gradle 8.7, JVM 17 |
| Libraries | androidx.car.app 1.7.0 · play-services-location 21.2.0 · android-mail 1.6.7 · usb-serial-for-android 3.7.2 · datastore-preferences 1.0.0 · gson 2.10.1 · kotlinx-coroutines 1.7.3 |