OTNS を使用してスレッド ネットワークをシミュレートする

1. はじめに

5abd22afa2f2ee9a.png

Thread とはOTNS

Thread は IP ベースの低消費電力ワイヤレス メッシュ ネットワーク プロトコルであり、デバイス間およびデバイス間のセキュアな通信を可能にします。スレッド ネットワークは、トポロジの変更に適応して単一障害点を回避できます。

Google がリリースした OpenThread は、Thread のオープンソース実装です。OpenThread は、コードサイズとメモリ使用量が小さいにもかかわらず、スレッド仕様で定義されているすべての機能をサポートしています。

OpenThread Network Simulator(OTNS)を使用すると、シミュレートされた OpenThread ノードを posix プラットフォームで実行し、Thread ネットワークをシミュレートできます。OTNS は、シミュレートされた Thread ネットワークを可視化して操作するための使いやすいウェブ インターフェース(OTNS-Web)を提供します。

学習内容

  • OTNS とその依存関係をインストールする
  • OTNS 用の OpenThread をビルドする
  • OTNS-Web でノードを追加、移動、削除する方法
  • OTNS-Web のその他の便利な機能を使用してネットワーク・シミュレーションを実行する
  • OpenThread の単一障害点がないことを確認する

この Codelab では、OTNS-CLI と OTNS-Web を中心に説明します。Python スクリプトなど、OTNS の他の機能は取り上げません。

必要なもの

  • Linux x86_64 または Mac OS です。
  • Git
  • Go 1.13 以降
  • ウェブブラウザ。OTNS-Web は、ウェブブラウザを使用してシミュレーションを表示します。
  • Thread Primer。この Codelab で学習する内容を理解するには、Thread の基本コンセプトを理解しておく必要があります。

2. 設置方法

Go をインストールする

OTNS をビルドするには、Go 1.13 以降が必要です。

  1. https://golang.org/dl/ から Go をインストールします。
  2. $(go env GOPATH)/bin(通常は $HOME/go/bin)を $PATH に追加します。
$ export PATH=$PATH:$(go env GOPATH)/bin

OTNS コードを取得

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

依存関係のインストール

$ ./script/install-deps
grpcwebproxy installed: /usr/local/google/home/simonlin/go/bin/grpcwebproxy

sudo のパスワードの入力を求められる場合があります。

otns のインストール

otns$GOPATH/bin にインストールします。

$ ./script/install
otns installed: /usr/local/google/home/simonlin/go/bin/otns

otns が正しくインストールされているか確認しましょう

  1. which otns を実行して、otns 実行可能ファイルが $PATH. で検索可能かどうかを確認します。
  2. otns コマンドが見つからない場合は、$(go env GOPATH)/bin$PATH. に追加されていることを確認します。

3. OTNS 用の OpenThread をビルドする

GitHub から OpenThread コードを取得する

$ mkdir -p ~/src
$ git clone https://github.com/openthread/openthread ~/src/openthread

OTNS=1 を使用して OpenThread をビルドする

$ cd ~/src/openthread
$ ./script/cmake-build simulation -DOT_OTNS=ON -DOT_SIMULATION_VIRTUAL_TIME=ON -DOT_SIMULATION_VIRTUAL_TIME_UART=ON -DOT_SIMULATION_MAX_NETWORK_SIZE=999

OpenThread 実行可能ファイルは build ディレクトリにあります。

$ ls ~/src/openthread/build/simulation/examples/apps/cli/
ot-cli-ftd        ot-cli-mtd        ot-cli-radio

それでは、OTNS を実行しましょう...

4. OTNS を実行する

otns を実行します。

$ cd ~/src/openthread/build/simulation/examples/apps/cli
$ otns
> ← OTNS-CLI prompt

OTNS が正常に起動すると、CLI コンソール(OTNS-CLI)に入り、ネットワークの可視化と管理用のウェブブラウザ(OTNS-Web)が起動します。

a0e05178d66929b1.png

OTNS-Web の空白ページのみが表示される場合は、ブラウザで WebGL が有効になっていない可能性があります。WebGL を有効にする方法については、https://superuser.com/a/836833 をご覧ください。

以降のセクションでは、OTNS-CLIOTNS-Web を使用して OTNS シミュレーションを管理する方法について説明します。

5. OTNS-CLI についてOTNS ウェブ

OTNS-CLI

OTNS-CLI は、OTNS シミュレーションを管理するためのコマンドライン インターフェース(CLI)を提供します。

$ cd ~/src/openthread/build/simulation/examples/apps/cli
$ otns
> ← OTNS-CLI prompt

OTNS-CLI でコマンドを入力できます。コマンドの完全なリストについては、OTNS CLI リファレンスをご覧ください。この Codelab では一部のコマンドのみを使用しますので、ご安心ください。

OTNS ウェブ

OTNS-Web は、OTNS のネットワーク可視化および管理ツールです。シミュレーションされた Thread ネットワークのノード、メッセージ、リンクが視覚的に表示されます。OTNS-Web のさまざまな要素に注意してください。

4c5b43509a2ca0d0.png

6. ノードを追加

OTNS-CLI からノードを追加する

位置(300、100)にルーターを追加

> add router x 300 y 100
1
Done

OTNS-Web にノードが作成されるはずです。ノードは Router として起動し、数秒後にリーダーになります。

6ca8c2e63ed9818d.png

OTNS-CLI を使用してノードを追加する

> add fed x 200 y 100
2
Done
> add med x 400 y 100
3
Done
> add sed x 300 y 200
4
Done

ノードが 1 つのパーティションにマージされるまで数秒待ちます。OTNS-WEB にノードが表示されます。

3ee67903c01aa612.png

OTNS-Webまでにノードを追加

OTNS-Web を使用してノードを追加することもできます。Action Bar の [New Router] ボタンをクリックします。[New Router] ボタンのすぐ上にノードが作成されていることがわかります。OTNS-CLI で作成したリーダーの近くにノードをドラッグします。すべてのノードが最終的に 1 つのパーティションにマージされるはずです。

420258bb92561146.png

また、アクションバーの FED、MED、SED のボタンをクリックして、他のタイプのノードを作成します。既存のノードの近くの位置にドラッグして、その Thread ネットワークに接続します。

fe15d6f9726a099e.png

これで、多くのノードを含む 1 つのパーティションの Thread ネットワークが作成されました。次のセクションでは、シミュレーションの速度を調整して、シミュレーションの実行を高速化します。

7. 速度を調整

現時点では、シミュレーションは 1X の速度で実行されているはずです。つまり、シミュレーションの現時点までの経過時間は、最初のノードを作成してからの実際の時間と同じです。

OTNS-CLIで速度を調整

シミュレーションの速度は OTNS-CLI で調整できます。

シミュレーション速度を 100X に設定

> speed 100
Done

ノードが以前よりもはるかに頻繁にメッセージを送信することがわかります。

シミュレーション速度を MAX に設定

> speed max
Done

OTNS はできるだけ迅速にシミュレートしようと試みます。そのため、ノードが大量のメッセージを送信していることがわかります。

シミュレーションの一時停止

> speed 0
Done

速度のシミュレーションを 0 に設定すると、シミュレーションは一時停止します。

通常の速度でシミュレーションを復元

> speed 1
Done

シミュレーション速度を 0 より大きい値に設定すると、シミュレーションが再開されます。

OTNS-Webで速度を調整

速度コントロール ボタン

Action Bar で速度コントロール ボタン 9329157c1bd12672.png を探します。ボタンには現在のシミュレーション速度が表示され、シミュレーション速度の調整や、シミュレーションの一時停止/再開に使用できます。

シミュレーションを高速化

速度が MAXf5f460b2586d299b.png)になるまで 39b88331779277ad.png ボタンをクリックすると、シミュレーションの速度を上げることができます。

速度低下のシミュレーション

31cca8d5b52fa900.png ボタンをクリックすると、シミュレーションの速度を下げることができます。

シミュレーションの一時停止

実行中のシミュレーションを一時停止するには、46cc2088c9aa7ab6.png ボタンをクリックします。ボタンが「ce25eda3496ffcd4.png」に変わります。

シミュレーションを再開

一時停止時にシミュレーションを再開するには、ce25eda3496ffcd4.png ボタンをクリックします。ボタンが 46cc2088c9aa7ab6.png に戻ります。

シミュレーション速度を 10X に設定

時間を節約するには、

OTNS-CLI : シミュレーション速度を

10X これにより、ネットワーク内のトポロジ変化をより迅速にモニタリングできます。

> speed 10
Done

8. ラジオのオン/オフ

シミュレーションには 2 つのルーター(六角形)と多数の子が含まれ、10 倍の速度で実行されるはずです。

2 台のルーターの現在のリーダー(赤い枠線)を 1 回クリックして選択します。

8c6a2e191cdae0c7.png

無線通信をOFF

アクションバーの 7ca085f470491dd4.png ボタンをクリックして、リーダーノードのラジオボタンをオフにします。

a3bf58d9d125f95f.png

ラジオがオフの場合、リーダーはメッセージを送受信できません。

もう一方のルーターが新しいリーダーになるまで 12 秒(シミュレーション時間のシミュレーションでは 120 秒)待ちます。

e3d32f85c4a1b990.png

Thread ネットワークは、新しいリーダーで新しいパーティションを形成することで、リーダーの障害から自動的に回復します。新しいパーティションの色も新しくなりました。

無線通信をON

無線通信がオフになっているリーダーを選択します。Action Bar2d9cecb8612b42aa.png ボタンをクリックして、無線接続を復元します。

7370a7841861aa3a.png

リーダーは、無線接続が回復した後、ネットワークに再接続する必要があります。

9. ノードの移動

OTNS を使用すると、OTNS-CLI または OTNS-Web を介してノードを簡単に移動できます。

OTNS-CLI を介してノードを移動する

ノード 5 を新しい場所に移動します。

> move 5 600 300
Done

ノード 5 は他の Router から遠く離れているため、互いの接続が失われ、約 12 秒(シミュレーション時間で 120 秒)後に両方ともが自身のパーティションのリーダーになります。

c06b4d0a4f183299.png

OTNS-Web を介してノードを移動する

ドラッグしてノード 5 を元の場所に戻します。2 つのパーティションが 1 つのパーティションにマージされます。

9ba305c4c5a5f892.png

10. ノードの削除

OTNS-CLI でノードを削除する

ノード 8 を削除します。

> del 8
Done

Node 8 がシミュレーションに表示されなくなります。

18156770d9f8bf83.png

OTNS-Web でノードを削除する

ノード 5 を選択し、Action Bar7ff6afd565f4eafc.png ボタンをクリックしてノード 5 を削除します。

d4079cceea0105f0.png

Node 1 がリーダーになり、Node 7 はどのルーターにも接続できないため、切断する必要があります。

シミュレーションをクリア(すべてのノードを削除)

シミュレーションをクリアするには、OTNS-Web ですべてのノードを削除します。

Action Bar.89618191721e79a0.png ボタンをクリックします。すべてのノードが同時に非表示になります。

続行する前に...

このチュートリアルを続行できるように、ノードを自身でシミュレーションに追加します。

11. OTNS-CLI ノードのコンテキスト

OTNS-CLI は、デベロッパーがノードのステータスを診断できるように、ノードと簡単にやり取りできるノード コンテキスト モードを提供します。

ノード コンテキスト モードを開始する

ノード 1 のノード コンテキストを入力します。

> node 1
Done
node 1>

CLI プロンプトが node 1> に変わり、現在のノード コンテキストを示します。OpenThread CLI コマンドを入力すると、ノードを直接操作しているかのようにノードで実行されます。

ノードのコンテキストでコマンドを実行する

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
OpenThread
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:d800
fdde:ad00:beef:0:2175:8a67:1000:6352
fe80:0:0:0:2075:82c2:e9e9:781d
Done

別のノード コンテキストに切り替える

node 1> node 2
Done
node 2> 

ノードのコンテキストを終了

node 1> exit
Done
>

12. 完了

これで、最初の OTNS シミュレーションの実行が完了しました。

OTNS とその依存関係をインストールする方法について学習しました。OTNS 用の OpenThread を作成し、OpenThread シミュレーション インスタンスで OTNS シミュレーションを開始しました。OTNS-CLIOTNS-Web の両方を通じて、シミュレーションをさまざまな方法で操作する方法を学びました。

これで、OTNS とは何か、OTNS を使用して OpenThread ネットワークをシミュレートする方法を理解しました。

次のステップ

以下の Codelab をご覧ください。

リファレンス ドキュメント