Signal DF v0.3
RF direction-finding bearings from a KrakenSDR on the ATAK map.
01 What it does
Signal DF puts RF direction-finding bearings from a KrakenSDR onto the ATAK map.
The operator has a KrakenSDR — five coherent RTL-SDR receivers and a Raspberry Pi running the open-source `krakensdr_doa` software — on a vehicle or at a fixed site. It produces a direction of arrival several times a second. Today that lives in a web page on the Pi, or is relayed into TAK by a script on a laptop. This plugin reads it directly and draws it where the crew is already looking.
Technical details features in full, requirements, network
Features in full
Intended for search and rescue on a beacon or a handheld, interference hunting (a stuck mic, a keyed repeater, a transmitter desensing a fire channel), and locating an unknown transmitter on a tactical channel.
Version 0.2 does the whole hunt. It connects to the radio and draws a bearing per active VFO with its provenance stated; it collects bearings while the vehicle drives, crosses them into a position with a 95% error ellipse, draws every bearing it collected so a reflection is visible as the one line missing the crowd, and puts a waypoint where driving next will tighten the answer fastest. Bearings can be transmitted live to a TAK Server Data Sync feed, with a stale time, so a team sees them and nothing is left stored.
It finds the radio whichever output mode it was left in, falling back between the interfaces by itself. It states in words where the array heading came from, takes that heading from ATAK's own GPS track when the array is vehicle-mounted, and draws nothing at all on the map when nothing knows which way the array points. It sizes the antenna array for a frequency, naming the hole on KrakenRF's printed arms, the position on the 3D-printed template and the plain measurement, and says how long to extend each whip. It shows the age of the newest bearing, greys the line when the feed goes stale, and distinguishes a radio that has stopped answering from one that is answering but not producing.
It also opens the radio's own web interface inside ATAK, so tuning, gain, squelch and calibration are reachable without leaving the map application.
Nothing leaves the device. Bearings are drawn locally and are not published to a TAK server or to other users.
Planned: the power lobe from the DoA spectrum, a weighted maximum-likelihood fix with an error ellipse and advice on the collection geometry, and bearings shared between several operators so one crew's receivers all contribute to one fix.
Equipment required
- A KrakenSDR five-channel coherent receiver with its own power supply.
- A Raspberry Pi 4 or 5 running the KrakenRF `krakensdr_doa` image.
- Five identical antennas on identical lengths of coaxial cable, in the array geometry the radio is configured for.
- An Android EUD running ATAK-CIV, on the same network as the receiver.
Works with
- KrakenSDR, `krakensdr_doa` 1.8.1. Earlier versions are expected to work; the plugin reads the interfaces that software has published across releases and falls back between them.
- Uniform circular and uniform linear antenna arrays, as configured on the radio.
- Receiver reached over its own WiFi access point, over a shared network, or over a wired connection to the vehicle's router.
Network and security
All traffic is outbound from the EUD to the operator's own KrakenSDR receiver on the local network. The plugin opens no listening ports, requires no inbound access, and contacts no internet host.
| Direction | Protocol | Port | Purpose | |---|---|---|---| | Outbound to the receiver | TCP / HTTP | 8081 | Reads the direction-of-arrival status files the radio publishes (`doa.xml`, `DOA_value.html`) | | Outbound to the receiver | TCP / HTTP | 8080 | Opens the radio's own configuration web interface, on operator request only |
Traffic is plaintext HTTP because that is the only service the KrakenSDR offers. Those status files are unauthenticated on the radio itself; no credentials, position data or mission data are transmitted to it. The host address is entered by the operator and is validated to be a host name or IP address only, so no path, query or alternate scheme can be introduced through it.
The plugin requests no Android permissions of its own.
