ネットワーク越しの RTL-SDR で SDR# を使う方法

この記事のまとめ:
  • rtl_tcp を使ってネットワーク越しの RTL-SDR (RTL2832U 搭載デバイス) が観測する信号をローカルの SDR# で表示する方法を紹介しています。
  • rtl_tcp などの RTL-SDR やそれらを動かすために必要なパッケージ類を Docker コンテナー化して Linux 上で動かす方法を紹介しています。
背景

LimeSDR のテストを SDR# で周波数スペクトルを見ながら行おうと思ったのですが、作業場所を日々変えることもあるので家の中でどこからでも SDR# を使いたい状況でした。そのため、Linux サーバーに常時それらを接続し、Windows のラップトップから SDR# を起動して RTL-SDR が受信する信号の周波数スペクトルを見ようと思った次第です。

なお、SDR# を Linux で起動して X11 で飛ばすこともやってみましたが、そもそも SDR# は Windows 用にしか開発されていません。Linux で .NET アプリケーションを動かす mono を使って SDR# を動かしてみましたがあまり動作が良くなかったので、SDR# は Windows のネイティブで動かすことにしました。

構成

以前 RTL-SDR を紹介した際には RTL-SDR を接続した Windows PC で直接 SDR# などを動かして、周波数スペクトルを表示していました。

今回は、次の2台のマシンを使って役割を分割させます。

  • Linux PC: RTL-SDR を接続し、rtl_tcp というソフトウェアで受信信号をクライアントに伝送する
  • Windows PC: SDR# を使って、rtl_tcp から受信信号を受け取り、周波数スペクトルを表示させる

なお、RTL-SDR という単語について、人によって定義が異なるようです。 RTL-SDR.COM の説明では、RTL2832 を搭載した USB ドングルのことであると述べていますが、osmocom では RTL2832 ベースのドングルを SDR 受信機にするためのソフトウェアであると述べています。

本記事では、大文字で RTL-SDR と書いたときには、RTL2832 を搭載した USB ドングルのデバイスを指し、小文字で rtl-sdr と書いたときには osmocom の RTL2832 用のソフトウェアを指すものとします。

rtl-sdr の Docker コンテナー

Linux で RTL-SDR デバイスを SDR 受信機として使うためのソフトウェアとして、osmocom / rtl-sdr があります。この中には SDR 受信機として使うためドライバーや基本的なアプリケーションが含まれています。そのアプリケーションの1つに受信信号をネットワーク越しで引き渡すためのサーバーである rtl_tcp があります。

これらを使うためには、ソースコードをダウンロードしてきてコンパイルする必要がありますが、いつものごとく Docker で行います。 Dockerfile などのファイルは私の GitLab リポジトリーにおいておきました。

rtl-sdr の動作確認

RTL-SDR が認識しているかどうかは次のように rtl_test で確認ができます。問題がなければ、基本情報を表示してくれます。

$ docker run -it --rm --device=/dev/bus/usb:/dev/bus/usb registry.gitlab.com/hassiweb-programming/docker-rtl-sdr/rtl-sdr:1.0 rtl_test -t
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Elonics E4000 tuner
Supported gain values (14): -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0
Sampling at 2048000 S/s.
Benchmarking E4000 PLL...
[E4K] PLL not locked for 51000000 Hz!
[E4K] PLL not locked for 2171000000 Hz!
[E4K] PLL not locked for 1086000000 Hz!
[E4K] PLL not locked for 1258000000 Hz!
E4K range: 52 to 2170 MHz
E4K L-band gap: 1086 to 1258 MHz

ただし、 Ubuntu などの OS では、RTL2832U 用のドライバーとして dvb_usb_rtl28xxu がデフォルトで入っている可能性があります。それがアクティブになっている場合、rtl-sdr が使えない可能性があります。その場合は次の表に表示されます。

$ docker run -it --rm --device=/dev/bus/usb:/dev/bus/usb registry.gitlab.com/hassiweb-programming/docker-rtl-sdr/rtl-sdr:1.0 rtl_test -t
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM

Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

usb_claim_interface error -6
Failed to open rtlsdr device #0.

そういった場合には、単純に記載されているとおり、ドライバーを無効化すればよいです。たとえば、次のように etc/modprobe.d/ に当該ドライバーをブロックするようにファイルを作ります。PC を再起動し、うまくドライバーをブロックできていれば、rtl_test が問題なく実行できるようになっているはずです。

# echo "blacklist dvb_usb_rtl128xxu" > /etc/modprobe.d/blacklist-rtl.conf
rtl_tcp の実行

rtl_tcp を実行する準備は Dockerfile 内に書き込んであるので、次のようにコンテナーを実行すれば自動的に rtl_tcp が実行されます。次のように表示されれば、1234 番ポートで待ち受け状態となっています。

$ docker run -it --rm --device=/dev/bus/usb:/dev/bus/usb -p 1234:1234 registry.gitlab.com/hassiweb-programming/docker-rtl-sdr/rtl-sdr:1.0
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Elonics E4000 tuner
Tuned to 100000000 Hz.
listening...
Use the device argument 'rtl_tcp=172.17.0.2:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).
SDR# の起動

SDR# を AirSpy のダウンロードページからダウンロードしてきて、起動します。画面左側の Source: プルダウンリストから RTL-SDR (TCP) を選択します。

また、左上のセッティングボタンを押し、セッティング画面を開きます。 Host に rtl_tcp を起動した PC の IP アドレスを入力すれば準備完了です。

あとは、スタートボタンを押せば、すべて問題がなければ記事トップのスクリーンショットのようにリアルタイムの周波数スペクトルを表示してくれます。


今回は以上です。 最後まで読んでいただき、ありがとうございます。
関連記事



コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法