博主一年前在网上花了 50 来块,买了 4 台华为 HG255d 路由器,最初只是想在上面运行 Shadowsocks-libev 做透明代理,但是后来由于 SS 开始出现断流现象,保险起见,于是将 SS 换成了 V2Ray,此后 HG255d 再也没开过机…
学校连续补了十二天课之后,终于大发慈悲,决定放一天假。趁着这一天假,博主赶紧打开积了一层灰的 HG255d,看看能折腾些什么。
偶然看到随手扔在书桌上的 RTL-SDR,于是萌生了在 HG255d 上运行 RTL-SDR 的奇怪想法。
先来看看 HG255d 的配置,作为一台低端路由器,拥有这样的配置很常见,就连路由器底部的标签都承认了自己很低端…
纵然配置如此垃圾,可博主还是想试一试…
在 OpenWRT 选好对应固件并下载,刷入路由器。博主选用的是 OpenWRT 18.06.1 版。
刷机完成后接上 WAN、LAN 口,开机,登录 LuCI 管理界面,在 System –> Software –> Configuration –> Distribution feeds 一项中配置软件源,这里使用的是加拿大的 openwrt.freemirror.org,设置完成后,保存配置。
1 | src/gz openwrt_core http://openwrt.freemirror.org/releases/18.06.1/targets/ramips/rt305x/packages |
此外,根据自己的网络状况,可以将 option check_signature 1
(检查签名)一行注释或是删除掉。
为了防止 IP 地址与上级网络设备冲突,所以博主将 HG255d 的 LAN 口改到了 192.168.155.1。
使用 PuTTY 连接路由器,在终端中执行指令,更新软件列表。
1 | root@OpenWrt:~# opkg update |
RTL-SDR 通过 USB 连接到路由器,所以需要安装 USB 的相关驱动。以下的 Package,是用于 HG255d 的 USB 驱动。
1 | root@OpenWrt:~# opkg install kmod-usb-dwc2 kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport usbutils |
需要注意的是,HG255d 存在一个问题:如果短时间写入大量文件到 Flash 中,会出现 I/O 错误,随后整块分区会变成只读,唯有重刷系统才可以解决。
所以,为了避免踩坑,上述的命令,最好改成一次只安装两个包。
安装完成,然后进入 LuCI 管理界面,在 System –> LED Configuration –> USB 一项,选中 Trigger 为 usbport,并勾选 USB Ports 的 Hub 1, Port 1,保存配置。
回到终端,安装 rtl-sdr。
1 | root@OpenWrt:~# opkg install rtl-sdr |
值得一提的是,OpenWRT 已经内置了 RTL-SDR 的驱动,省去了用户交叉编译再上传到路由器的麻烦。
重启路由器,并插入 RTL-SDR 设备。
1 | root@OpenWrt:~# reboot |
重启完成后,HG255d 右下角的 USB 指示灯亮了。
已经成功了一半…
再次使用 PuTTY 连接路由器,在终端中执指令,检测是否已经识别了 RTL-SDR 设备…
1 | root@OpenWrt:~# lsusb |
看来已经识别了设备。执行命令,测试 rtl_tcp
是否可以正常工作…
1 | root@OpenWrt:~# rtl_tcp -a 0.0.0.0 |
好开心,运行成功惹!
由于家里电脑没有安装 HDSDR,所以只有用手机上的 SDRTouch 凑合了… 不过 SDRTouch 也很好用,博主用的是在 Google Play 购买的收费版本…
在 SDRTouch 的 Pref. 菜单中设置采样率为 256000 Msps,直采 Q 通道信号,广播制式为 AM,频率嘛,找个信号强点的好了,比如 CNR2 经济之声 11.660 MHz… 连接!
听了一分钟左右,瀑布图和声音突然卡顿起来,紧接着路由器无线网的 SSID 消失了,重启后才恢复。
或许是内存不足的问题?
重启后,重新连接到路由器的 SSH,再研究一下稳定运行 rtl_tcp 有什么新的姿势。
1 | root@OpenWrt:~# rtl_tcp --help |
注意到有一个设置缓冲大小的项,默认值为 32,或许,我可以试着把它调节得很小???
再来一次!这次加上 -b 2
的选项。
1 | root@OpenWrt:~# rtl_tcp -a 0.0.0.0 -b 2 |
再次用 SDRTouch 连接到 SDR,最后博主稳定收听了四十多分钟,虽然偶尔还是会有卡顿,不过表现已经很不错了…
让 rtl_tcp 开机后台启动,这里需要借助 screen,但是 OpenWRT 没有提供现成的包,于是博主自己编译了一份,适用于 mipsel_24kc 架构的路由器。
下载 screen_4.6.2-1_mipsel_24kc.ipk
用 WinSCP 上传到路由器 /tmp 目录下,安装 screen。
1 | root@OpenWrt:~# opkg install /tmp/screen_4.6.2-1_mipsel_24kc.ipk |
然后,编辑 /etc/rc.local
。
1 | root@OpenWrt:~# vi /etc/rc.local |
在 exit 0
前加入 rtl_tcp 启动命令。
1 | screen -dmS rtl_tcp rtl_tcp -a 0.0.0.0 -b 3 |
第二次启动后,登入终端,可以使用如下命令查看 rtl_tcp 的输出。
1 | root@OpenWrt:~# screen -r rtl_tcp |
如果这台路由器的上一级的网络设备需要访问到 SDR,则需要在 HG255d 的 firewall 中开放对应的端口,在 Network –> Firewall –> Port Forwards 中开放 192.168.155.1 的 TCP 1234 端口。
最后是博主总结的一点经验,以供参考。
- 不要使用 USB Hub、延长线来连接 RTL-SDR 设备,否则会因供电不足而导致无法打开设备,或是在运行过一段时间后死机。
- 对于小内存设备,调小 rtl_tcp 的缓冲值可以提高运行效率,避免死机。
- 运行 rtl_tcp 之后,系统负载直接飙到了 1.53 1.88 2.01,所以运行 rtl_tcp 后就不要再在上面运行其他程序了。
- 采样率一定要调小,256000 Msps 对于这种垃圾设备刚好合适,过高的采样率也会导致系统直接崩溃。
折腾成功,完结撒花!祝大家玩得开心。