おうち LTE ネットワーク構築レシピ

この記事のまとめ:
  • OpenAirInterface と Open5GS を使って一般家庭で LTE 網を構築するレシピを紹介します。
背景:

最近、テレコム周りでも OSS 界隈が面白くなってきたのと、RF デバイスは基本的に高価なイメージがあったんですが、LimeSDR mini などの安価な Software Defined Radio (SDR) ボードが手に入るようになったり、Alibaba から安い RF デバイスが入手できるようになったりしてきていて、家で十分遊べるだけのものが揃うようになってきました。そんなわけで勉強を兼ねつつ、OSS を使った LTE の構築をしてみます。

なお、RF を扱いますが電波法に触れないようにすべて有線系かつ RF デバイスはシールド対策をして構築しています

もくじ

  1. 全体概要
  2. 材料
  3. 下準備
    1. SIM カードの書き込み
    2. RF デバイスのシールド
  4. OpenAirInterface
    1. OpenAirInterface 用の PC 設定
    2. LimeSDR 用の OpenAirInterface の Docker コンテナーの準備
    3. OpenAirInterface の送受信電力調整
  5. Open5GS
    1. Open5GS の HSS に SIM カード情報を登録
  6. UE
  7. 動作確認

1. 全体概要

全体構成は次の図のようになっています。 RF で接続されるところはすべて有線接続、かつ RF デバイスは完全にシールドにして、電波が外に放射しないようにします。免許なしに微弱電波以上の電力で電波発射すると電波法違反になりますので、かなり配慮しています。

UE として、ラップトップ用の LTE モジュールを使います。有線接続するためには、アンテナ端子が付いている必要がありますが、電波法の関係で日本ではそのようなデバイスはほとんど扱われていいません*。その中でも簡単かつ安価に手に入るデバイスといえば ラップトップ用の LTE モジュールです**。

*電波免許の申請は無線機だけでなく、アンテナ込みで申請しなければならず、免許が通っているといってもアンテナの交換はできないためです。ガラケーの初期の時代に光るアンテナなど交換用のアンテナが売っていましたが電波法的には違法ですね。

** 技適マークがついている LTE モジュールもありますが、上の理由で任意のアンテナを付けて電波発射することは違法です。

eNB、EPC にはそれぞれ OpenAirInterface と Open5GS を使います。

2. 材料

一部の材料は AliExpress で調達しています。日本のサイトだけで(安価に)すべての材料が手に入らないところが残念なところです。

材料 個数 お値段 備考
Core iシリーズ搭載 PC 1 台 時価 eNB 用
適度な PC 2 台 時価 EPC 用(Linux)、UE 用(Windows)
LimeSDR mini 1 個 $159 余裕があれば $299 のアルミケース入りの方が楽かも
同軸ケーブル SMA 端子 5 セット ¥2,750 1 セット 2 本入り
L型 SMA コネクター 1 セット ¥749 1 セット 2 個入り
パネルマウント用 SMA コネクター 3 セット ¥599 1 セット 2 個入り
LTE Band 用デュプレクサー 1 個 $30.58
RF コンバイナー・スプリッター 1 個 $1.93 必須ではない
RF アッテネーター 20 dB 3 個 ¥3,150
RF ターミネーター 1 セット ¥1,190 1 セット 2 個入り
LTE モジュール 1 個 ¥3,980 デュプレクサーのバンド対応のもの
SIM カードスロット付き M.2 用ネットワークアダプター 1 個 $13.59
同軸ケーブル MHF4⇔SMA端子 2 本 ¥880
USB 3.0 延長ケーブル 2 本 ¥1,156 LimeSDR mini用、LTE モジュール用
アルミケース 3 個 ¥3,848
アクリル板 3 枚 ¥1,734 アルミケース用 110 x 70 mm
M3六角スペーサーセット 1 セット ¥998
プログラマブルSIMカード、リーダーライター、専用ソフトウェア付き 1 セット $46.19
両面導電性アルミテープ 1 個 ¥1,199 導電性の素材でガスケットになるものがあればそれでも可
工具 少々 精密ドライバー、リューター、精密ヤスリ等々
3. 下準備
3-a. SIM カードの書き込み

SIM カードには OYEITIMES 製のプログラマブル SIM カードを使っています。使い方は以前当ブログで紹介していますのでそちらをご覧ください。

SIM カードに任意の情報を書き込みますが、IMSI、K、OPc については後で HSS に登録する必要があるのでそれらを情報をメモしておきます。

3-b. RF デバイスのシールド

全体構成図に載せたように、RF デバイスは3つのコンポーネントに分けて、それぞれアルミケースに収納します。特に、AliExpress で購入した RF デバイスの素性がわからないのと、見た感じで RF を通す回路としては露出している銅箔面が大きすぎて電波漏洩しているかもしれないので、要注意です。

LTE モジュールはこんな感じにマウント。

デュプレクサーと RF コンバイナー・スプリッターを詰め込んだらぎゅうぎゅうです。

LimeSDR mini は発熱がかなりあるので放熱フィン付きです。

(RF ケーブルってこんなに曲げたらだめだよなーとは思いながらも気にしない…)

多少の隙間では電波が漏れることはないと思いますが、多少シールドとして不安があるので、すべての開口部を導電性のアルミテープで埋めていきます。なお、アルミテープで貼り合わせると次に開けるのが面倒です。導電性のガスケットなどで埋められると楽だったのですが、安価で手に入る製品がなかったので致し方なしです。

なお、シールドについては村田製作所のページによい記事がありますのでこちらが参考になると思います。

4. OpenAirInterface (OAI)

OpenAirInterfaceOpenAirInterface Software Alliance (OSA) が開発するオープンソースの 4G LTE eNodeB のソフトウェアで、さまざまな SDR ボードを RF フロントエンドとして、Intel x86 プラットフォーム上で動作します。 日本語で概要説明されている記事がすでにありますので概要等はそちらにお任せします。なお、日本企業としては富士通と京セラが加入されています。

参考:

4-a. OpenAirInterface 用の PC 設定

OAI は x86 プラットフォーム上で動作するとは言え、LTE eNodeB は非常に負荷の高い処理を低遅延で必要とするために、PC 側に低遅延かつ高速処理用の設定を行います。具体的には次のようなことを行います。

それぞれ、公式サイトのリンクを貼っておいたので、その通りに実行すれば問題ありませんが、いくつか注意すべき点があったのでメモしておきます。

Ubuntu 16.04 用 Low latency kernel のバージョン指定

公式の OpenAirInterface の事前準備の手順の中の “Ubuntu 16.04 LTS/Linux Kernel version 4.8 or higher” に記載の通り、Ubuntu に low latency kernel をインストールする必要があります。ただし、カーネルバージョンを指定してインストールしないと 4.8 より低いバージョンが入ることもありますので、インストール可能なカーネルバージョンを指定してインストールすることをお勧めします。

また、PC の起動時のカーネルを指定したい場合は、/etc/default/grub を次のように変更すればよいです(バージョン名は環境に合わせて変更してください)。

sudo vim /etc/default/grub
~~~
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.15.0-76-lowlatency"
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=false
~~~
sudo update-grub
4-b. LimeSDR 用の OpenAirInterface の Docker コンテナーの準備

公式の Wiki 等に OpenAirInterface のインストール手順が書いてあったりしますが、結構うまくいかないケースがあったり、ポータビリティもなかったりと手軽に使えないので、LimeSDR mini 用の OpenAirInterface を Docker コンテナー化しました。

そのため、Docker と docker-compose を使いますので、予めインストールしておきます。

上記の Git リポジトリーをクローンすると docker-openairinterface-enb/config/enb.band1.tm1.25PRB.lmssdr.conf に設定ファイルがあります。

設定ファイルのうち下記のように設定されている MME の IP アドレスは環境に応じて変更する必要がありますので、MME を起動する PC の IP アドレスに書き換えます(MME のコンテナーに付与される IP アドレスではなく、PC の IP アドレスです)。

    ////////// MME parameters:
    mme_ip_address = (
      {
        ipv4       = "192.168.0.20";
        ipv6       = "192:168:30::17";
        active     = "yes";
        preference = "ipv4";
      }
    );

使い方はリポジトリーの README に書いてありますので、LimeSDR mini を USB で接続して、手順通りに実行すれば OAI が起動し、すぐに電波発射します(その他の設定もあるので、実行は最後にします)。

4-c. OpenAirInterface の送受信電力調整

設定ファイルの中に送受信電力のパラメーターがいくつかあります。これらをうまく調整しないと UE と eNB がうまく通信ができません。その理由は、 eNB が UE から送られてくる UL 信号を想定している受信電力となるように UE に送信電力調整をさせなければ、過入力や弱電力となり、受信ができなくなるためです。また、UE が受信する DL の受信電力が大きすぎたり、小さすぎたりして、送信電力調整できる範囲を超えるケースもあるかもしれません。

ここで面倒なのは LimeSDR mini の送受信ゲインと実際の送受信電力のバランスがわからないことと、UE (特に LTE モジュール)の挙動が安定してくれないことでした。

OpenAirInterface eNB の送受信電力調整に関わるパラメーターは下記の7つほどです。

パラメーター
rach_preambleInitialReceivedTargetPower -118 (dBm)
pucch_p0_Nominal -118 (dBm)
pusch_p0_Nominal -118 (dBm)
max_pdschReferenceSignalPower -36 (dBm)
att_tx 72
att_rx 0
max_rxgain 100

はじめは理論的にパラメーターの調整をしていたのですが結果的に全く思ったように動きませんでした。結果的にこのパラメーター値は、試行錯誤して調整した結果の1つの参考値です。RF デバイスのロスだとか UE によって若干振る舞いが変わる可能性があります。

パラメーター調整の参考として、att_tx についてはこちらで参考値を出してくれています(結果的に私は少し変更しましたが…)。なお、Tx ゲインが正しく設定できているとすると上記のパラメーターでは参照信号電力が -36 dBm ですので、送受信機間を直接接続すると UE の送信電力制御できる範囲を超えてしまい、動作が不安定になります。そのため、最低でも 40 dB のアッテネーターを入れたほうがよいでしょう。

UE の最小送信電力は標準上 -40 dBm (TS 36.521-1 の Table 6.3.2.3-1 で規定) です。UE の送信電力は、上記のターゲットの受信電力などのパラメーターを使った計算によって決定されますが、パスロスが小さすぎると計算結果が -40 dBm を簡単に下回ってしまいます。正直、今回 40 dB のアッテネーターだけでも足りないかと思っていたのですが、なぜだかうまくいきました。おそらく、RF デバイスによるロスやフィーダーロスが想定よりも大きいことや、実際の送信電力は -36 dBm より少し小さくて、 受信ゲイン 0 dB よりも少し低い設定になっていることなどによってうまくいっているのだと想定されます。また、最小送信電力の -40 dBm というのは標準規格に準拠するための最低限の値であって、モデムメーカーによってはさらに低い送信電力で送信できるようになっているものもあり、その違いによってパラメーターの調整の難しさが変わってくると思います。

max_rxgain は T-Tracer GUI の Input signal のノイズフロアが下図のように 30 前後になるとよいと書いてありました(どこに書いてあったか再度見つけられませんでしたが…)。

att_rx についてはソースコードをたどっていくとわかりますが、Rx ゲインの値として max_rxgain-att_rx という計算をしているので基本的に0で問題ないです。

5. Open5GS

Open5GS は個人(?)の方が開発されているオープンソースの 4G LTE EPC のソフトウェアで、Intel x86 プラットフォームや arm プラットフォームでも動作します。現在も継続的に開発されており、今年中に 5G コアもリリースされる予定となっています。OSA も OpenAir-CN という EPC を開発されていますが、少しインストールが面倒、かつ Open5GS では開発者の方が Dockerfile を用意しておいてくれているので、パラメーター設定と各機能を起動するだけで手軽に使えます。

こちらも docker-compose として予めパラメーターや起動スクリプトを用意しておいたものを私のリポジトリーにおいておきました。

こちらも使い方はリポジトリーの README に書いてありますので、手順通りに実行すれば Open5GS の MME、SGW、PGW、PCRF、HSS、MongoDB、WebUI のコンテナーの起動と、 MME 向けの S1-MME メッセージ (SCTP) を転送するため iptables の設定ができます。普通に使う分には特にパラメーター類は変更しなくても問題ないと思います。

5-a. Open5GS の HSS に SIM カード情報を登録

コンテナーを起動したサーバーの 3000 番ポートにブラウザーでアクセスすると Open5GS の WebUI が表示されます。ログイン ID/ Pass はデフォルトのままで admin/ 1423 です。

ログインすると画面右下の “+” マークから SIM カード情報を登録できます。3-a で登録した SIM カードの情報を入力します。

6. UE

今回使用する UE はラップトップ用の LTE モジュールです。それの M.2 インターフェースを USB に変換しただけですが、Windows OS であれば何のインストールもしなくても認識してくれました。一応今回使用した LTE モジュールは Dell のラップトップ用のもので、最新のファームウェアが Dell からリリースされていたのでそれはインストールしました。

APN の追加は、LTE モジュールを認識すると「設定 → ネットワークとインターネット → 携帯電話 → 詳細オプション → APN を追加します」から設定ができます。APN 情報は Open5GS の WebUI から確認できますが、デフォルトだと特に認証もなく APN 名を 「internet」とするだけです。

7. 動作確認

ここまで準備が整ったら EPC、eNB、UE を起動するだけです。 トップの画像は eNB で T-Tracer GUI を表示した時のものです。うまく UE が接続で来たらさまざまなログが表示されていきます。ちなみに私の環境でのスループットは帯域幅 5 MHz で DL 17 Mbps、UL 8 Mbps 程度でした。まだまだ改善の余地はありそうですね。


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

コメント

このブログの人気の投稿

PythonでPosgreSQLを操作する

Python + dlibで顔検出を行う

Python + OpenCVで顔検出を行う

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