BlackOut Secure · OpenWrt Package Feed 23.05-SNAPSHOT

Unofficial test opkg feed for WIP packages destined for upstream openwrt/packages. Built once against OpenWrt 23.05.6 (Cortex-A53) and republished under multiple ABI-compatible arch labels so the same base URL works on mainline OpenWrt and on GL.iNet ApNos firmware.

Add the feed to your router

Pick the snippet that matches your router's firmware. The opkg arch label is a literal-string match, so the right URL matters even though the binaries are identical across labels. Run this once; then install whichever package(s) you want from the section below.

Mainline OpenWrt on Cortex-A53 (e.g. ipq60xx, ipq807x)

echo 'src/gz blackoutsecure https://openwrt.blackoutsecure.dev/23.05-SNAPSHOT/packages/aarch64_cortex-a53/blackoutsecure' >> /etc/opkg/customfeeds.conf
opkg update

GL.iNet ApNos firmware (AXT1800 / AX1800, 23.05-based)

echo 'src/gz blackoutsecure https://openwrt.blackoutsecure.dev/23.05-SNAPSHOT/packages/aarch64_cortex-a53_neon-vfpv4/blackoutsecure' >> /etc/opkg/customfeeds.conf
opkg update

Packages in this feed

Pick a package for its install command, configuration, and uninstall steps. All packages live in the single feed configured above.

readsb-wiedehopf from feat-add-pkg-readsb-wiedehopf

Install

After adding the feed above, install with:

Mainline OpenWrt on Cortex-A53 (e.g. ipq60xx, ipq807x)

opkg install readsb-wiedehopf

GL.iNet ApNos firmware (AXT1800 / AX1800, 23.05-based)

opkg install readsb-wiedehopf

Configuring readsb-wiedehopf

This page only documents the OpenWrt-specific layer (UCI, init, hotplug, geoip). For the readsb daemon itself — every CLI flag, the autogain algorithm, BeastReduce, MLAT, pushing to aggregators, tar1090, the JSON/API outputs — see upstream:

github.com/wiedehopf/readsb

The mapping is direct: each UCI option in /etc/config/readsb translates to the same-named --flag on the daemon command line (underscores become dashes). So upstream's --net-connector=... is option net_connector '...' here, --net-beast-reduce-filter-dist=... is option net_beast_reduce_filter_dist '...', etc.

Naming. The package is readsb-wiedehopf but PROVIDES:=readsb, so the binary is /usr/bin/readsb, the init script is /etc/init.d/readsb, and the UCI config is /etc/config/readsb. Either name satisfies a readsb dependency.

What the OpenWrt glue adds on top of upstream readsb

The init script and hotplug helper handle the things upstream's Debian package does via /etc/default/readsb plus hand-editing — automated for OpenWrt:

  • USB hotplug auto-config (/etc/hotplug.d/usb/30-readsb, gated on option hotplug '1', default on). Recognises the full librtlsdr known-device list (Realtek 0bda:2832/2838, Hauppauge, Terratec, Compro, MyGica, Astrometa, Nooelec, RTL-SDR Blog v3/v4, etc.). On add it sets device_type=rtlsdr, pins device=<USB serial>, clears net_only, sets enabled=1, and restarts readsb. On boot the init script replays ACTION=add for every already-attached SDR so an SDR plugged in before install behaves the same as a hot-insert.
  • Boot-time reconciler. If hotplug is on but no SDR is present at boot (e.g. unplugged while powered off), the section is normalized back to net_only=1 and device_type cleared, so the daemon doesn't try to open a missing radio.
  • Auto-fill lat/lon via /usr/sbin/readsb-geoip (ipapi.co with ip-api.com fallback) when both are empty. City-level accuracy — set lat/lon manually for correct CPR/range decoding or MLAT.
  • Cold-boot waits. geoip_wait_timeout (default 60 s) blocks startup until WAN is routable enough for geoip to resolve; usb_wait_timeout (default 0 = off) optionally waits for a USB SDR to appear.
  • Multi-aggregator feeder framework. config feeder <name> sections in /etc/config/readsb — define zero, one, or many. Each enabled section becomes one outbound --net-connector using a built-in preset (adsblol, airplaneslive, adsbfi, planespotters, theairtraffic, flyitaly, avdelphi, adsbexchange, flyrealtraffic) or a user-supplied custom host/port. Inspect/probe with readsb-feeder list / probe / url / presets. Generate the optional station UUID with readsb-uuid. Full details in Feeding aggregators below.
  • Logging via syslog under tag readsb (and readsb-geoip / readsb-feeder / readsb-uuid for the helpers): logread -e readsb -f. The periodic stats block (option stats '1', cadence stats_every) is on by default.

So for a typical RTL-SDR install: plug it in, install the package, done.

UCI cheatsheet

The shipped /etc/config/readsb defaults to net_only=1 with net=1 so the daemon comes up as a feeder/passthrough; the hotplug helper flips it into SDR mode the moment a known USB radio is attached. Common overrides:

uci show readsb                          # current effective config
# cat /etc/config/readsb                 # raw file view

# Override the geoip-detected location with your real receiver coordinates.
# uci set readsb.main.lat='12.3456'
# uci set readsb.main.lon='-65.4321'

# Gain. 'auto' is upstream's ADS-B autogain (see upstream README § Autogain).
# With system log_level=debug the init script promotes this to 'auto-verbose'
# automatically. Or pin a manual dB value from the list in `readsb --help`.
uci set readsb.main.gain='auto'
# uci set readsb.main.gain='49.6'

uci set readsb.main.mlat='1'             # emit MLAT timestamps in Beast OUT
# Aggregator feeders: see "Feeding aggregators" below — prefer `config feeder`
# sections (presets + per-feeder UUID + readsb-feeder helpers). The legacy
# `list net_connector 'host,port,protocol'` form still works for one-off endpoints.

# Manual SDR / net-only setup — only needed if hotplug didn't fire
# (non-RTL-SDR receiver, hotplug disabled, or pure net-only ingest).
# uci set readsb.main.enabled='1'
# uci set readsb.main.device_type='rtlsdr'   # rtlsdr | modesbeast | gnshulc | ifile
# uci set readsb.main.device='00001090'      # USB serial of a specific dongle
# uci set readsb.main.net_only='1'           # net-only (no SDR)

uci commit readsb                        # procd reload trigger picks it up
/etc/init.d/readsb status
logread -e readsb -f
viewadsb                                 # text UI of live aircraft
# readsb-geoip --force                   # re-run geoip lookup (overwrite lat/lon)

For the meaning of every option, search upstream readsb --help for the dash-form name (UCI net_beast_reduce_filter_dist--net-beast-reduce-filter-dist).

Default network listeners

As shipped in /etc/config/readsb:

PortUCI optionDirectionNotes
30001net_ri_portRaw INAVR-format raw input
30002net_ro_portRaw OUTAVR-format raw output
30003net_sbs_portSBS BaseStation OUTfor Virtual Radar Server etc.
30004,30104net_bi_portBeast INfeed raw Beast frames in
30005net_bo_portBeast OUTfor piaware / fr24feed / tar1090
30006net_beast_reduce_out_portBeastReduce OUTfor aggregators (see upstream § BeastReduce)

net_api_port, net_json_port, write_globe_history, heatmap, and the rest are unset by default — enable them in /etc/config/readsb as described upstream.

Feeding aggregators (zero, one, or many)

Outbound feeding is configured with config feeder <name> sections in /etc/config/readsb. Each enabled section becomes one outbound --net-connector; readsb shares the same decoded message stream across all of them with no priority or order between feeders.

  • Zero sections — no outbound feeding (the shipped default). The daemon still decodes locally and serves net_bo_port (30005) etc. for LAN clients (tar1090, vendor feeders running on another host, …).
  • One section — feed a single aggregator.
  • Many sections — feed several aggregators in parallel. No fixed upper limit beyond memory and uplink bandwidth.

Built-in presets. All ship the same protocol (beast_reduce_plus_out, BeastReduce-Plus over TCP). Pick a preset by name and the helper resolves host/port for you. Endpoints can change without notice — readsb-feeder presets always prints the live list.

PresetEndpointSite
adsblolin.adsb.lol:30004adsb.lol (per-station map at api.adsb.lol/0/my)
airplaneslivefeed.airplanes.live:30004airplanes.live
adsbfifeed.adsb.fi:30004adsb.fi
planespottersfeed.planespotters.net:30004planespotters.net
theairtrafficfeed.theairtraffic.com:30004theairtraffic.com
flyitalydati.flyitalyadsb.com:4905flyitalyadsb.com
avdelphidata.avdelphi.com:24999avdelphi.com
adsbexchangefeed1.adsbexchange.com:30004adsbexchange.com (rssi-stats uploader is out of scope; readsb-feeder url adsbexchange prints the per-UUID page)
flyrealtrafficfeed.flyrealtraffic.com:30004flyrealtraffic.com
custom(user-supplied)set host/port/protocol yourself

Enable feeders. The shipped /etc/config/readsb includes every preset above as a commented-out example — uncomment what you want and flip option enabled to '1', or append from the shell:

# One aggregator (the most common case):
cat >> /etc/config/readsb <<'EOF'

config feeder 'adsblol'
	option enabled '1'
	option preset 'adsblol'
	option silent_fail '1'
EOF

# Many — just stack more sections, one per aggregator:
cat >> /etc/config/readsb <<'EOF'

config feeder 'airplaneslive'
	option enabled '1'
	option preset 'airplaneslive'
	option silent_fail '1'

config feeder 'adsbexchange'
	option enabled '1'
	option preset 'adsbexchange'
	option silent_fail '1'
EOF

uci commit readsb
/etc/init.d/readsb reload     # picks up the new connectors

Custom endpoint (anything not in the preset table):

config feeder 'mycustom'
	option enabled '1'
	option preset 'custom'
	option host 'feed.example.com'
	option port '30004'
	option protocol 'beast_reduce_plus_out'
	option silent_fail '1'
	# option uuid ''      # override the main section's UUID for this feed only
	# option extra ''     # comma-separated modifiers passed verbatim

Mute a feeder without removing the section:

uci set readsb.adsbexchange.enabled='0'
uci commit readsb && /etc/init.d/readsb reload

Station UUID. Aggregators that authenticate or de-duplicate by UUID need a stable value. Generate one once in the main section and every config feeder inherits it:

readsb-uuid                # generate (or print existing — idempotent)
# readsb-uuid -p           # print only, never write
# readsb-uuid -f           # force regenerate (do NOT do this after registering with an aggregator)
/etc/init.d/readsb reload

Resolution order per section: option uuid on the section → option uuid in main → omitted (aggregator de-dupes by source IP only). Set a per-section UUID only when you registered separately with that aggregator under a different identity.

Inspect and probe.

readsb-feeder list       # all sections + resolved host/port/protocol
readsb-feeder probe      # TCP-probe each enabled feeder's host:port
readsb-feeder url        # per-UUID stats page URL (where one is published)
readsb-feeder presets    # current preset list with endpoints
logread -e readsb-feeder # script-side log lines from the helpers above

Aggregators NOT supported by this package. FlightAware (piaware), FlightRadar24 (fr24feed), RadarBox (rbfeeder), Planefinder (pfclient), and AussieADSB use closed-source vendor clients that do their own per-station enrolment and MLAT — none of which fits inside readsb. To feed them, leave them out of /etc/config/readsb, expose net_bo_port (default 30005, Beast OUT) on this device, and run the vendor's client on another host pointed at <router-ip>:30005.

MLAT. Multilateration is out of scope here — it requires a separate mlat-client process per aggregator. Each Family A aggregator above advertises its own MLAT endpoint (commonly mlat.<host>:31090); consult the aggregator's own docs.

Stubborn leftovers after opkg remove

If opkg remove reports Not found even though the package was previously installed, opkg's status DB no longer tracks it but the package-shipped files may still be on disk. Check and clean manually:

pgrep -af readsb     # nothing should be running; if it is: kill it first
ls -l /usr/bin/readsb /usr/bin/viewadsb \
      /usr/sbin/readsb-geoip /usr/sbin/readsb-feeder /usr/sbin/readsb-uuid \
      /etc/init.d/readsb /etc/hotplug.d/usb/30-readsb \
      /usr/lib/readsb/functions.sh 2>/dev/null
rm -f /usr/bin/readsb /usr/bin/viewadsb \
      /usr/sbin/readsb-geoip /usr/sbin/readsb-feeder /usr/sbin/readsb-uuid \
      /etc/init.d/readsb /etc/hotplug.d/usb/30-readsb
rm -rf /usr/lib/readsb

The bundled deps librtlsdr and libzstd are not removed automatically. Confirm nothing else needs them before dropping:

opkg whatdepends librtlsdr
opkg whatdepends libzstd
opkg remove librtlsdr libzstd     # only if no other dependents

Uninstall

Removes the package(s) installed for readsb-wiedehopf. The package's own prerm stops and disables its service for you, and its postrm cleans up /var/run/readsb:

opkg remove readsb-wiedehopf viewadsb-wiedehopfadsbexchange-stats|feat-add-package-adsbexchange-stats|

Optional — also discard the conffile. opkg deliberately preserves your edits on remove (and saves the package default as *-opkg if it differs):

rm -f /etc/config/readsb /etc/config/readsb-opkg

Architectures published

Each arch directory carries the same set of .ipk files plus a signed Packages index. The build is native for aarch64_cortex-a53; other labels are repacks (control.tar.gz rewritten with the new Architecture: line, data tarball untouched). Architecture-independent packages (PKGARCH:=all) are copied verbatim into every arch dir.

ArchIndexCompressed
aarch64_cortex-a53PackagesPackages.gz
aarch64_cortex-a53_neon-vfpv4PackagesPackages.gz

About this feed