G7JJF APRS Client · Manual App home PDF

Chapter 25

Technical Reference

#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

FormatNotes
Uncompressed position! = / @, with and without timestamp (DHM zulu/local, HMS); position ambiguity; course/speed, PHG, RNG, DFS, altitude /A=.
Compressed positionBase-91 lat/lon, course/speed, range or altitude from the cs bytes.
Mic-ECurrent and old Mic-E, all message codes, speed and course, altitude, manufacturer suffix, overlays.
DAO!DAO! extra precision (human-readable and base-91).
WeatherPositionless _, 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.
TelemetryT# packets, comment telemetry |ss11|, PARM/UNIT/EQNS/BITS messages.
MessagesMessages, 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

ItemDetail
APRS-ISTCP, login vers G7JJF-AprsClient + app version, keepalive 240 s, read timeout 30 s, retry 10 s.
TocallAPZGJJ
KISSFEND 0xC0, FESC 0xDB, TFEND 0xDC, TFESC 0xDD; data frames on port 0.
Bluetooth SPPUUID 00001101-0000-1000-8000-00805F9B34FB, paired devices.
BLENordic 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).
AGWPEFrames G, k (raw monitor), K (raw), V (unproto).
USB serialusb-serial-for-android; CP2102, CH34x, FTDI, CDC-ACM; 8N1.
AX.25v2.0 modulo 8 connected mode; UI frames control 0x03, PID 0xF0.

#Storage and retention

DataKept
Station logSaved every 10 minutes; stations heard in the last 7 days are reloaded.
Packet cacheThe last 100 packets are saved for the next start; up to 500 in memory.
MessagesYour own and those to you, 500 on disk.
Weather history30 days.
Bulletins200; those from the last 48 hours are reloaded.
Track log10 000 points.
Stream logs7 daily files.
Crash logs5 newest.
Map tiles50 MB.
App logTrimmed to the last 400 lines when it exceeds 200 kB.

#Build information

ItemValue
Packagecom.g7jjf.aprsclient
Version1.9.9 (versionCode 55)
SDKminSdk 26, compileSdk and targetSdk 36
ToolchainKotlin 1.9.22, Gradle 8.7, JVM 17
Librariesandroidx.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