Unofficial test opkg feed for readsb-wiedehopf. Built once against upstream 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.
echo 'src/gz blackoutsecure https://openwrt.blackoutsecure.dev/23.05-SNAPSHOT/packages/aarch64_cortex-a53/blackoutsecure' >> /etc/opkg/customfeeds.conf
opkg update
opkg install readsb-wiedehopf
echo 'src/gz blackoutsecure https://openwrt.blackoutsecure.dev/23.05-SNAPSHOT/packages/aarch64_cortex-a53_neon-vfpv4/blackoutsecure' >> /etc/opkg/customfeeds.conf
opkg update
opkg install readsb-wiedehopf
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).
| Arch | Index | Compressed |
|---|---|---|
aarch64_cortex-a53 | Packages | Packages.gz |
aarch64_cortex-a53_neon-vfpv4 | Packages | Packages.gz |
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.readsb (and readsb-geoip): 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
# uci add_list readsb.main.net_connector='feed.adsbexchange.com,30005,beast_reduce_out'
# 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.
To feed an aggregator (FlightAware, ADS-B Exchange, FR24, airplanes.live, adsb.lol, …): either install the aggregator's own client and point it at localhost:30005 (Beast), or add a net_connector directly per upstream § BeastReduce output.
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 \
/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 \
/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 from this feed and detaches the custom feed entry. The package's prerm stops and disables the service for you, and its postrm cleans up /var/run/readsb, so you don't need to touch /etc/init.d/ or wipe runtime state by hand:
opkg remove readsb-wiedehopf viewadsb-wiedehopf
sed -i '/blackoutsecure/d' /etc/opkg/customfeeds.conf
opkg update
Command failed: Not found. opkg prints this when a named package isn't in its status DB (e.g. you only ever installed readsb-wiedehopf and not its sub-packages) or when a prerm exits non-zero. Either way the rest of the removal still proceeds — opkg processes args in order and reports per-arg.
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
blackoutsecure/packages @ feat-add-pkg-readsb-wiedehopf.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 it's merged there, mainline OpenWrt users get it from downloads.openwrt.org automatically; this Cloudflare feed will keep serving GL.iNet ApNos owners until a firmware bundles it.