A milestone day. I completed and deployed the central server component that ties the entire platform together — the real-time geolocation engine that processes RF observations from the scanner hardware and produces location estimates for radio transmitters.
The architecture is a three-node pipeline. An Android phone provides continuous GPS coordinates and acts as the user interface. A scanner unit captures RF signal data from P25 radio systems using software-defined radio hardware and decodes control channel traffic with OP25, an open-source P25 decoder. The server receives RF observations stamped with the device's GPS position and signal strength measurements, then runs a Bayesian grid search algorithm to estimate where the transmitter is located.
The geolocation math works by treating each RF observation as a probability distribution over space. Given the received signal strength and the device's location, the engine computes the likelihood that a transmitter exists at each point on a grid surrounding the observation. Multiple observations from different positions create overlapping probability distributions, and the intersection narrows the estimate. It's fundamentally the same triangulation principle used in cellular network positioning, adapted for passive monitoring of public safety radio.
I also built the first version of the jurisdiction-aware control channel switching system. As the user drives between counties, each of which operates its own P25 system on different frequencies, the platform automatically detects the boundary crossing via GPS and reconfigures the scanner hardware to tune to the correct control channel. This required coordinating across all three components: the server detects the jurisdiction change, pushes a configuration update to the Android device, which forwards it to the scanner unit, which restarts the decoder on the new frequency. The first implementation supports three jurisdictions along my primary test corridor.