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.
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.
echo 'src/gz blackoutsecure https://openwrt.blackoutsecure.dev/23.05-SNAPSHOT/packages/aarch64_cortex-a53/blackoutsecure' >> /etc/opkg/customfeeds.conf
opkg update
echo 'src/gz blackoutsecure https://openwrt.blackoutsecure.dev/23.05-SNAPSHOT/packages/aarch64_cortex-a53_neon-vfpv4/blackoutsecure' >> /etc/opkg/customfeeds.conf
opkg update
Pick a package for its install command, configuration, and uninstall steps. All packages live in the single feed configured above.
feat-add-pkg-readsb-wiedehopfAfter adding the feed above, install with:
opkg install readsb-wiedehopf
opkg install 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:
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.
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.
The init script and hotplug helper handle the things upstream's Debian package does via /etc/default/readsb plus hand-editing — automated for OpenWrt:
/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.net_only=1 and device_type cleared, so the daemon doesn't try to open a missing radio./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.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.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.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.
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).
As shipped in /etc/config/readsb:
| Port | UCI option | Direction | Notes |
|---|---|---|---|
30001 | net_ri_port | Raw IN | AVR-format raw input |
30002 | net_ro_port | Raw OUT | AVR-format raw output |
30003 | net_sbs_port | SBS BaseStation OUT | for Virtual Radar Server etc. |
30004,30104 | net_bi_port | Beast IN | feed raw Beast frames in |
30005 | net_bo_port | Beast OUT | for piaware / fr24feed / tar1090 |
30006 | net_beast_reduce_out_port | BeastReduce OUT | for 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.
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.
net_bo_port (30005) etc. for LAN clients (tar1090, vendor feeders running on another host, …).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.
| Preset | Endpoint | Site |
|---|---|---|
adsblol | in.adsb.lol:30004 | adsb.lol (per-station map at api.adsb.lol/0/my) |
airplaneslive | feed.airplanes.live:30004 | airplanes.live |
adsbfi | feed.adsb.fi:30004 | adsb.fi |
planespotters | feed.planespotters.net:30004 | planespotters.net |
theairtraffic | feed.theairtraffic.com:30004 | theairtraffic.com |
flyitaly | dati.flyitalyadsb.com:4905 | flyitalyadsb.com |
avdelphi | data.avdelphi.com:24999 | avdelphi.com |
adsbexchange | feed1.adsbexchange.com:30004 | adsbexchange.com (rssi-stats uploader is out of scope; readsb-feeder url adsbexchange prints the per-UUID page) |
flyrealtraffic | feed.flyrealtraffic.com:30004 | flyrealtraffic.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-client process per aggregator. Each Family A aggregator above advertises its own MLAT endpoint (commonly mlat.<host>:31090); consult the aggregator's own docs.
opkg removeIf 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
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
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.
| Arch | Index | Compressed |
|---|---|---|
aarch64_cortex-a53 | Packages | Packages.gz |
aarch64_cortex-a53_neon-vfpv4 | Packages | Packages.gz |
blackoutsecure/packages — each package is built from its own branch, linked in the package's panel above.aarch64_cortex-a53_neon-vfpv4; mainline OpenWrt on the same SoC tags everything plain aarch64_cortex-a53. The two strings describe an identical ABI (NEON + VFPv4 are mandatory in ARMv8-A), but opkg's filter is a literal match. The workflow builds once and relabels.openwrt/packages. Once merged there, mainline OpenWrt users get them from downloads.openwrt.org automatically; this Cloudflare feed will keep serving GL.iNet ApNos owners until a firmware bundles them.