0%

HG255d + RTL-SDR = ?

博主一年前在网上花了 50 来块,买了 4 台华为 HG255d 路由器,最初只是想在上面运行 Shadowsocks-libev 做透明代理,但是后来由于 SS 开始出现断流现象,保险起见,于是将 SS 换成了 V2Ray,此后 HG255d 再也没开过机…

学校连续补了十二天课之后,终于大发慈悲,决定放一天假。趁着这一天假,博主赶紧打开积了一层灰的 HG255d,看看能折腾些什么。

偶然看到随手扔在书桌上的 RTL-SDR,于是萌生了在 HG255d 上运行 RTL-SDR 的奇怪想法。

HG255d 和 RTL-SDR

RTL-SDR 特写

先来看看 HG255d 的配置,作为一台低端路由器,拥有这样的配置很常见,就连路由器底部的标签都承认了自己很低端…

低端路由器

详细参数

纵然配置如此垃圾,可博主还是想试一试…

在 OpenWRT 选好对应固件并下载,刷入路由器。博主选用的是 OpenWRT 18.06.1 版。

刷机完成后接上 WAN、LAN 口,开机,登录 LuCI 管理界面,在 System –> Software –> Configuration –> Distribution feeds 一项中配置软件源,这里使用的是加拿大的 openwrt.freemirror.org,设置完成后,保存配置。

1
2
3
4
5
6
src/gz openwrt_core http://openwrt.freemirror.org/releases/18.06.1/targets/ramips/rt305x/packages
src/gz openwrt_base http://openwrt.freemirror.org/releases/18.06.1/packages/mipsel_24kc/base
src/gz openwrt_luci http://openwrt.freemirror.org/releases/18.06.1/packages/mipsel_24kc/luci
src/gz openwrt_packages http://openwrt.freemirror.org/releases/18.06.1/packages/mipsel_24kc/packages
src/gz openwrt_routing http://openwrt.freemirror.org/releases/18.06.1/packages/mipsel_24kc/routing
src/gz openwrt_telephony http://openwrt.freemirror.org/releases/18.06.1/packages/mipsel_24kc/telephony

此外,根据自己的网络状况,可以将 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 指示灯亮了。

USB 指示灯被点亮

已经成功了一半…

再次使用 PuTTY 连接路由器,在终端中执指令,检测是否已经识别了 RTL-SDR 设备…

1
2
3
root@OpenWrt:~# lsusb
Bus 001 Device 001: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

看来已经识别了设备。执行命令,测试 rtl_tcp 是否可以正常工作…

1
2
3
4
5
6
7
8
9
root@OpenWrt:~# rtl_tcp -a 0.0.0.0
Found 1 device(s).
Found Elonics E4000 tuner
Using Generic RTL2832U (e.g. hama nano)
Tuned to 100000000 Hz.
listening...

Use the device argument 'rtl_tcp=0.0.0.0:1234' in OsmoSDR (gr-osmosdr) source to receive
samples in GRC and control rtl_tcp parameters (frequency, gain, ...).

好开心,运行成功惹!

由于家里电脑没有安装 HDSDR,所以只有用手机上的 SDRTouch 凑合了… 不过 SDRTouch 也很好用,博主用的是在 Google Play 购买的收费版本…

在 SDRTouch 的 Pref. 菜单中设置采样率为 256000 Msps,直采 Q 通道信号,广播制式为 AM,频率嘛,找个信号强点的好了,比如 CNR2 经济之声 11.660 MHz… 连接!

听了一分钟左右,瀑布图和声音突然卡顿起来,紧接着路由器无线网的 SSID 消失了,重启后才恢复。

或许是内存不足的问题?

重启后,重新连接到路由器的 SSH,再研究一下稳定运行 rtl_tcp 有什么新的姿势。

1
2
3
4
5
6
7
8
9
10
11
12
root@OpenWrt:~# rtl_tcp --help
rtl_tcp, an I/Q spectrum server for RTL2832 based DVB-T receivers.

Usage: [-a listen address]
[-p listen port (default: 1234)]
[-f frequency to tune to [Hz]]
[-g gain (default: 0 for auto)]
[-s samplerate in Hz (default: 2048000 Hz)]
[-b number of buffers (default: 32, set by library)]
[-n max number of linked list buffers to keep (default: 500)]
[-d device index (default: 0)]
[-P ppm_error (default: 0)]

注意到有一个设置缓冲大小的项,默认值为 32,或许,我可以试着把它调节得很小???

再来一次!这次加上 -b 2 的选项。

1
2
3
4
5
6
7
8
9
root@OpenWrt:~# rtl_tcp -a 0.0.0.0 -b 2
Found 1 device(s).
Found Elonics E4000 tuner
Using Generic RTL2832U (e.g. hama nano)
Tuned to 100000000 Hz.
listening...

Use the device argument 'rtl_tcp=0.0.0.0:1234' in OsmoSDR (gr-osmosdr) source to receive
samples in GRC and control rtl_tcp parameters (frequency, gain, ...).

再次用 SDRTouch 连接到 SDR,最后博主稳定收听了四十多分钟,虽然偶尔还是会有卡顿,不过表现已经很不错了…

手机上的 SDRTouch

让 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 对于这种垃圾设备刚好合适,过高的采样率也会导致系统直接崩溃。

折腾成功,完结撒花!祝大家玩得开心。