<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>rtl-sdr on Samirtech</title>
    <link>https://samirtech.org/tags/rtl-sdr/</link>
    <description>Recent content in rtl-sdr on Samirtech</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 28 Oct 2026 11:04:23 +0000</lastBuildDate><atom:link href="https://samirtech.org/tags/rtl-sdr/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>I Turned an Old Raspberry Pi 3B into a Live Aircraft Tracker</title>
      <link>https://samirtech.org/posts/raspberry-pi-adsb-aircraft-tracker/</link>
      <pubDate>Wed, 28 Oct 2026 11:04:23 +0000</pubDate>
      
      <guid>https://samirtech.org/posts/raspberry-pi-adsb-aircraft-tracker/</guid>
      <description>The first military aircraft I watched appear live on my own map was DESTRO41, an RAF Eurofighter Typhoon. By then, the receiver had quietly recorded several other military aircraft without me noticing.
That moment made the project feel different from opening a commercial flight-tracking app. The aircraft on the screen had been received directly by a small antenna in my home, decoded by an old Raspberry Pi 3B and plotted on a map running on my own network.</description>
      <content>&lt;p&gt;The first military aircraft I watched appear live on my own map was &lt;strong&gt;DESTRO41&lt;/strong&gt;, an RAF Eurofighter Typhoon. By then, the receiver had quietly recorded several other military aircraft without me noticing.&lt;/p&gt;
&lt;p&gt;That moment made the project feel different from opening a commercial flight-tracking app. The aircraft on the screen had been received directly by a small antenna in my home, decoded by an old Raspberry Pi 3B and plotted on a map running on my own network.&lt;/p&gt;
&lt;p&gt;I built the receiver with an &lt;a href=&#34;https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/&#34;&gt;RTL-SDR Blog V3&lt;/a&gt; and the prebuilt &lt;a href=&#34;https://adsb.im/&#34;&gt;ADSB.im&lt;/a&gt; image. It now runs headlessly over Wi-Fi, shares reception data with &lt;a href=&#34;https://adsb.lol/&#34;&gt;adsb.lol&lt;/a&gt; and sends me Gotify alerts when it detects military or unidentified aircraft.&lt;/p&gt;
&lt;h2 id=&#34;hardware-and-cost&#34;&gt;Hardware and cost&lt;/h2&gt;
&lt;p&gt;I already owned the Raspberry Pi 3B, microSD card, power supply and network equipment. The main purchase was an RTL-SDR Blog V3 kit for about &lt;strong&gt;£51&lt;/strong&gt;. It included the USB receiver, a dipole antenna, coax and mounting hardware.&lt;/p&gt;
&lt;p&gt;A stable 5 V supply matters on a Pi 3B, especially with a USB radio attached. I connected the SDR directly to the Pi and kept the antenna cable as short as practical. If I move the receiver into the loft, I will extend the mains side rather than depend on a long, poor-quality micro-USB lead.&lt;/p&gt;
&lt;h2 id=&#34;how-ads-b-reception-works&#34;&gt;How ADS-B reception works&lt;/h2&gt;
&lt;p&gt;Many aircraft broadcast their identity, altitude, position and movement using Automatic Dependent Surveillance–Broadcast, or ADS-B. In the UK and much of Europe, the main frequency is &lt;strong&gt;1090 MHz&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The RTL-SDR only receives; it does not transmit. Software on the Pi decodes the broadcasts, plots aircraft on a local map and forwards reception reports to a feeder network. What appears on my map depends on what the antenna can hear, so aircraft altitude, terrain, buildings, antenna position and cable loss all affect the result.&lt;/p&gt;
&lt;h2 id=&#34;preparing-the-antenna&#34;&gt;Preparing the antenna&lt;/h2&gt;
&lt;p&gt;At 1090 MHz, a quarter wavelength is about &lt;strong&gt;6.9 cm&lt;/strong&gt;. I extended each half of the supplied dipole to roughly that length and mounted it vertically, with one element pointing up and the other down.&lt;/p&gt;
&lt;p&gt;The receiver worked indoors, but antenna position made the biggest difference to range. A higher position with a clearer view of the horizon should outperform almost any software adjustment. Thick walls, metal objects and nearby electronics can all weaken reception, while long coax runs introduce additional loss at 1090 MHz.&lt;/p&gt;
&lt;h2 id=&#34;installing-adsbim&#34;&gt;Installing ADSB.im&lt;/h2&gt;
&lt;p&gt;I used the prebuilt 64-bit ADSB.im image for Raspberry Pi models 2, 3, 4 and 5 instead of assembling the decoder, map and feeder containers manually. I checked the downloaded &lt;code&gt;img.xz&lt;/code&gt; archive, carefully confirmed the microSD card&amp;rsquo;s device name and then wrote the image to it.&lt;/p&gt;
&lt;p&gt;That device check is worth taking seriously: writing an image destroys the existing contents of whichever disk is selected. I waited for buffered writes to finish and safely ejected the card before moving it to the Pi.&lt;/p&gt;
&lt;h3 id=&#34;the-headless-wi-fi-fallback&#34;&gt;The headless Wi-Fi fallback&lt;/h3&gt;
&lt;p&gt;I initially tried to preload the Wi-Fi configuration on the boot partition. It did not connect on the first boot, so ADSB.im created its temporary setup hotspot instead.&lt;/p&gt;
&lt;p&gt;I joined that network from a phone, opened the setup page and entered the normal 2.4 GHz Wi-Fi details. The Pi then joined the home network without needing a monitor or keyboard. The fallback made the failed preconfiguration an inconvenience rather than a blocked installation.&lt;/p&gt;
&lt;h2 id=&#34;the-first-live-results&#34;&gt;The first live results&lt;/h2&gt;
&lt;p&gt;Once the radio was detected, the dashboard began showing messages, positions and aircraft. The bias tee remained off because the bundled dipole is passive, and the decoder reported no dropped SDR samples.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://samirtech.org/images/posts/adsb/adsb-feeder-dashboard.webp&#34; alt=&#34;Sanitised ADSB.im dashboard showing receiver and feeder health&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The ADSB.im dashboard confirmed that the decoder was receiving aircraft and sending data to the configured feeder. The private device name has been removed.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I left the receiver running overnight in an ordinary indoor position. It stayed online without USB faults, container restarts or memory failures. During that initial run it decoded &lt;strong&gt;more than 429,000 valid messages&lt;/strong&gt;, produced &lt;strong&gt;more than 18,000 positions&lt;/strong&gt; and built &lt;strong&gt;1,778 tracks&lt;/strong&gt;. Its best range was about &lt;strong&gt;77 km (48 miles)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Those are not spectacular figures for a roof-mounted ADS-B antenna, but that was not the point of the first test. It proved that the old Pi, SDR, image, Wi-Fi connection and data feed all worked together reliably.&lt;/p&gt;
&lt;h2 id=&#34;the-local-aircraft-map&#34;&gt;The local aircraft map&lt;/h2&gt;
&lt;p&gt;The included tar1090 interface turns the received messages into a responsive local map. It shows aircraft identity, altitude, speed, track, signal source and distance from the receiver. Its range outline also makes the effect of walls and terrain visible: indoor reception is rarely symmetrical.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://samirtech.org/images/posts/adsb/tar1090-coverage-map.webp&#34; alt=&#34;Sanitised tar1090 map showing live aircraft and the receiver&amp;amp;rsquo;s coverage&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Live aircraft received by the Pi. The receiver marker and surrounding area are deliberately concealed; the image reveals only the broad region.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The map is available only on my local networks. Household devices can reach a restricted map view, while administration remains limited to a trusted management device.&lt;/p&gt;
&lt;h2 id=&#34;sharing-data-and-using-mlat&#34;&gt;Sharing data and using MLAT&lt;/h2&gt;
&lt;p&gt;I configured the receiver to feed &lt;a href=&#34;https://adsb.lol/&#34;&gt;adsb.lol&lt;/a&gt;. The normal ADS-B feed has remained healthy.&lt;/p&gt;
&lt;p&gt;MLAT, or multilateration, is an additional process that estimates an aircraft&amp;rsquo;s position by comparing the arrival time of its transponder messages at several receivers. It has occasionally disconnected and reconnected on the Pi 3B, but that does not stop direct ADS-B reception. The older Pi is adequate for this project, although its timing is less ideal than newer hardware for MLAT.&lt;/p&gt;
&lt;p&gt;I kept the number of feeder services modest and left this RTL-SDR dedicated to ADS-B. A single tuner cannot listen to 1090 MHz aircraft transmissions and an unrelated radio band at the same time. I would use a second receiver if I wanted to monitor AIS, radiosondes or other signals continuously.&lt;/p&gt;
&lt;h2 id=&#34;military-and-unidentified-aircraft-alerts&#34;&gt;Military and unidentified-aircraft alerts&lt;/h2&gt;
&lt;p&gt;Seeing DESTRO41 live made me check the receiver&amp;rsquo;s stored history. It had recorded four military airframes in total at that point, including the Eurofighter, a Canadian military aircraft and two RAF training aircraft.&lt;/p&gt;
&lt;p&gt;The live map later caught two UK military Eurofighters: &lt;strong&gt;DESTRO41&lt;/strong&gt; (ZK379) and &lt;strong&gt;DESTRO42&lt;/strong&gt; (ZK367). Both were shown at 14,000 feet and positioned through MLAT rather than a directly broadcast ADS-B position.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://samirtech.org/images/posts/adsb/military-typhoons.webp&#34; alt=&#34;Aircraft panels identifying DESTRO41 and DESTRO42 as military Eurofighters&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Two Eurofighter Typhoons received by the Pi. The source screenshots were cropped to retain the aircraft identities while excluding the map and location-related telemetry.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I added a small watcher that reads the receiver&amp;rsquo;s aircraft data every 15 seconds and sends a &lt;a href=&#34;https://gotify.net/&#34;&gt;Gotify&lt;/a&gt; notification when it finds something interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aircraft marked as military trigger an immediate alert;&lt;/li&gt;
&lt;li&gt;unidentified targets trigger after remaining unidentified for 60 seconds;&lt;/li&gt;
&lt;li&gt;repeat notifications for the same aircraft and category are suppressed for 12 hours; and&lt;/li&gt;
&lt;li&gt;each alert includes the available ICAO address, callsign, registration, type, altitude and tracking source.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here, &lt;strong&gt;unidentified&lt;/strong&gt; has a precise and fairly ordinary meaning: the receiver has a transponder target but no callsign, registration, aircraft type or description for it. It does not mean the receiver has discovered an extraterrestrial craft. Sometimes the missing identity appears a little later, which is why the watcher waits before alerting.&lt;/p&gt;
&lt;h2 id=&#34;network-and-security&#34;&gt;Network and security&lt;/h2&gt;
&lt;p&gt;The receiver sits on an isolated device network rather than the same network as my main computers. The router initially blocked management access across that boundary, so I added a narrow rule for one trusted computer instead of weakening isolation for every device.&lt;/p&gt;
&lt;p&gt;I also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;assigned the Pi a fixed private address outside the automatic allocation pool;&lt;/li&gt;
&lt;li&gt;created a non-root administrator account;&lt;/li&gt;
&lt;li&gt;enabled SSH public-key authentication;&lt;/li&gt;
&lt;li&gt;disabled password and root SSH login;&lt;/li&gt;
&lt;li&gt;restricted access with router and host firewall rules;&lt;/li&gt;
&lt;li&gt;enabled automatic security updates without automatic reboots; and&lt;/li&gt;
&lt;li&gt;confirmed that the receiver had no internet-facing port forwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The map needed to remain convenient on phones and tablets. I exposed a restricted, map-only path to the isolated household network instead of granting those devices general access to the Pi or trusted LAN.&lt;/p&gt;
&lt;p&gt;Private addresses, hostnames, Wi-Fi details and the receiver&amp;rsquo;s exact map location are intentionally absent from this article and its screenshots.&lt;/p&gt;
&lt;h2 id=&#34;monitoring-the-receiver&#34;&gt;Monitoring the receiver&lt;/h2&gt;
&lt;p&gt;A small health collector records a sample every five minutes. It checks receiver and feeder state, decoder statistics, Pi temperature, memory use, load, Wi-Fi, time synchronisation, container state and recent MLAT events.&lt;/p&gt;
&lt;p&gt;The first version broke after I hardened SSH because it still expected root access. The public statistics remained available, but the private system checks failed. I changed it to use the restricted administrator account and limited &lt;code&gt;sudo&lt;/code&gt; to the Docker checks that actually needed it.&lt;/p&gt;
&lt;p&gt;That was a useful reminder: a security improvement is not complete until the monitoring and recovery paths have been tested again.&lt;/p&gt;
&lt;h2 id=&#34;problems-and-fixes&#34;&gt;Problems and fixes&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;What fixed it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Preloaded Wi-Fi settings did not connect&lt;/td&gt;
&lt;td&gt;I used the temporary ADSB.im setup hotspot.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The management computer could not reach the isolated Pi&lt;/td&gt;
&lt;td&gt;I added one narrow router rule instead of removing network isolation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Pi&amp;rsquo;s address changed&lt;/td&gt;
&lt;td&gt;I assigned a fixed private address outside the DHCP pool and updated the related rules.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Root SSH access was still partly enabled&lt;/td&gt;
&lt;td&gt;I checked the effective OpenSSH configuration, corrected the ordering and verified that root login was rejected.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolated tablets could not open the map&lt;/td&gt;
&lt;td&gt;I added a restricted map-only route rather than general network access.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLAT occasionally disconnected&lt;/td&gt;
&lt;td&gt;I confirmed direct ADS-B remained healthy and that MLAT later reconnected.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring failed after SSH hardening&lt;/td&gt;
&lt;td&gt;I moved it to the restricted account and narrowly scoped the required &lt;code&gt;sudo&lt;/code&gt; access.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;is-the-raspberry-pi-3b-still-enough&#34;&gt;Is the Raspberry Pi 3B still enough?&lt;/h2&gt;
&lt;p&gt;For this job, yes. The Pi 3B is old, but it can run the decoder, local map, modest feeder workload, health checks and alert watcher without becoming the bottleneck.&lt;/p&gt;
&lt;p&gt;Stable power, storage, Wi-Fi and antenna placement matter more than replacing it simply because a newer Pi exists. A newer model would provide more headroom and might improve MLAT consistency, but the current receiver does not need an upgrade to perform its main task. I would avoid loading it with unrelated, CPU-heavy services.&lt;/p&gt;
&lt;p&gt;The same applies to replacing the RTL-SDR Blog V3 with a V4. For a dedicated 1090 MHz receiver, antenna height, cable loss, local interference and filtering are likely to matter more than changing between those dongles.&lt;/p&gt;
&lt;h2 id=&#34;what-i-would-improve-next&#34;&gt;What I would improve next&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Move the antenna to a higher, safely secured position with a clearer view of the horizon.&lt;/li&gt;
&lt;li&gt;Keep the coax short and away from large metal objects.&lt;/li&gt;
&lt;li&gt;Compare message rate, aircraft count and maximum range before and after moving it.&lt;/li&gt;
&lt;li&gt;Check temperature, voltage and Wi-Fi stability after relocation.&lt;/li&gt;
&lt;li&gt;Consider a 1090 MHz filter or low-noise amplifier only if the new position reveals a problem they would solve.&lt;/li&gt;
&lt;li&gt;Add a separate RTL-SDR if I want another radio service running continuously.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;was-it-worth-doing&#34;&gt;Was it worth doing?&lt;/h2&gt;
&lt;p&gt;Yes. The Pi boots without a monitor, reconnects to Wi-Fi, detects the SDR, decodes aircraft, updates its local map, shares data and alerts me when it sees selected targets. It achieved all of that with hardware I already owned apart from the £51 radio kit.&lt;/p&gt;
&lt;p&gt;The indoor test proved the complete system. The first live military detection made it memorable. The next meaningful upgrade is not a new computer or another software rebuild; it is simply giving the antenna a better view of the sky.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
