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

この Codelab について
schedule30 分
subject最終更新: 2025年5月15日
account_circle作成者: Simon Lin, Colin Tan, Esko Dijk

1. はじめに

Thread メッシュ ネットワーク トポロジの概要

Thread と OTNS とは

Thread は、デバイス間通信とデバイスとクラウド間の通信を安全に行うための IP ベースの低電力ワイヤレス メッシュ ネットワーク プロトコルです。Thread ネットワークは、トポロジの変更に適応して単一障害点を回避できます。

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

OpenThread ネットワーク シミュレーター(OTNS)を使用すると、POSIX プラットフォームでシミュレートされた OpenThread ノードを実行して、Thread ネットワークをシミュレートできます。OTNS には、シミュレートされた Thread ネットワークを可視化して操作するための使いやすいウェブ インターフェース(OTNS-Web)が用意されています。スクリプトによるシミュレーション(Python を使用)も可能です。

学習内容

  • OTNS とその依存関係をインストールする
  • OTNS-CLI の基本を学ぶ
  • OTNS-Web で OpenThread ノードを追加、移動、削除する方法
  • OTNS-Web のその他の便利な機能を使用してネットワーク シミュレーションを制御する
  • OpenThread の単一障害点なしを確認する
  • Wireshark で OpenThread ノード間のデータ トラフィックを確認する

この Codelab では、インタラクティブな使用を目的とした OTNS-CLI と OTNS-Web に焦点を当てます。Python スクリプトなど、OTNS の他の機能は対象外です。

必要なもの

  • できれば Linux x86_64 または Homebrew を搭載した Mac OS をおすすめします。Windows の WSL2 で Ubuntu 22/24 も動作しますが、設定を手動で調整する必要がある場合があります。
  • Git
  • ウェブブラウザ。OTNS-Web は、ウェブブラウザを使用してシミュレーションを表示します。
  • スレッドの概要。この Codelab の内容を理解するには、スレッドの基本コンセプトを理解しておく必要があります。

用語

「ルーター」という用語は、Thread メッシュ エクステンダーの技術用語として使用されます。これは、最初は Thread ルーターと呼ばれていました。「ノード」とは、OTNS シミュレーションでシミュレートされた OpenThread デバイスを指します。

2. インストール

OTNS コードを取得する

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

この Codelab の以降のコンソールコマンドはすべて、otns ディレクトリから実行します。

ブートストラップとインストール

bootstrap スクリプトにより、依存関係(Python3 や Go/Golang など、必要に応じて)がインストールされ、OTNS がインストールされます。また、シミュレーションで直接使用できるさまざまな OT ノードタイプを構築し、いくつかの基本的なテストを実行します。ノードビルドのため、数分かかることがあります。

$ ./script/bootstrap
....
....
OTNS installed - use 'otns' to start it.
$

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

otns が正しくインストールされていない場合

スクリプトで次のようなエラーが報告されることがあります。

....
OTNS installed - please add ~/go/bin to your PATH variable first, to use it.
$

この場合は、$PATH.$(go env GOPATH)/bin を追加する必要があります。

その他のエラーの場合は、GitHub の問題を作成できます。

3. OTNS を初めて実行する

otns を実行します。

$ otns
>_ ← OTNS-CLI prompt

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

起動時の OTNS-Web ウィンドウ

OTNS-Web に空白ページしか表示されない場合は、ブラウザで WebGL が有効になっていないか、WebGL を有効にする方法については、 https://superuser.com/a/836833 をご参照ください。

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

4. OTNS-CLI と OTNS-Web の概要

OTNS-CLI

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

$ otns
>_ ← OTNS-CLI prompt

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

help コマンドを入力して、CLI コマンドの概要を確認します。このリストは CLI リファレンスと同じです。

> help
add             Add a node to the simulation and get the node ID.
....
....
Done
> 

特定のコマンドの詳細なヘルプを表示するには、コマンド名を使用します。次に例を示します。

> help add
add
  Add a node to the simulation and get the node ID.
  
Definition:
....
....
> 

OTNS-Web

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

OTNS のウェブ要素の説明

5. ノードを追加する

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

シミュレーションに Thread Router を追加します。

> add router
1
Done

OTNS-Web に作成されたノードが表示されます。ノードはルータとして起動し、数秒後にリーダーになります。

リーダーロールの 1 つのノード

シミュレーションをインタラクティブに簡単に開始できるように、新しい OpenThread ノードはデフォルトで標準のネットワーク パラメータセットで構成されます。

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

次に、さまざまなタイプのノードを追加します。

> add fed
2
Done
> add med
3
Done
> add sed
4
Done

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

4 つのノードを含む Thread ネットワーク

また、OTNS-Web で任意のノードを選択すると、そのノードに関する詳細情報を表示するパネルが表示されます。たとえば、次の図ではノード 1 が選択されています。パネルの [役割] エントリで、リーダーであることを確認します。

4 つのノードを持つスレッド ネットワーク(ノード 1 が選択されています)

OTNS-Web でノードを追加する

OTNS-Web を使用してノードを追加することもできます。Action BarNew Router ボタンをクリックします。選択したノードの右側に、作成中のノードが表示されます。新しいルーターを既存の Thread パーティションに接続します。

ルーターを追加して、合計 5 ノード

アクションバーの FED、MED、SSED、BR ボタンをクリックして、他のタイプのノードを作成することもできます。これで、合計 9 個のノードになります。必要に応じて、一部のノードを他の位置にドラッグして、別の物理ネットワーク トポロジを作成します。

複数の新しいノードが追加され、合計 9 ノード

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

6. 速度を調整する

現在、シミュレーションは 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 の速度調節ボタン 速度調整ボタン を見つけます。ボタンには現在のシミュレーション速度が表示され、シミュレーション速度の調整やシミュレーションの一時停止/再開に使用できます。

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

速度が MAX: シミュレーションの最大速度インジケーター に達するまで 速度を上げるボタン ボタンをクリックすると、シミュレーションを高速化できます。

シミュレーションを遅くする

シミュレーションの速度を落とすには、速度を下げるボタン ボタンをクリックします。

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

シミュレーションの実行中に 一時停止ボタン ボタンをクリックして一時停止します。ボタンが 再生ボタン に変わります。

シミュレーションを再開する

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

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

時間を節約するために、

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

10X これにより、ネットワークのトポロジの変化をより迅速に観察できます。

> speed 10
Done

7. ラジオのオン/オフを切り替える

これで、シミュレーションには少なくとも 2 つのルーター(六角形)、必要に応じて境界ルーター(正方形)と多数の子ノードが含まれ、10 倍の速度で実行されます。

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

リーダーノード 1 が選択されたスレッド ネットワーク

無線通信をOFF

アクションバーの ラジオのオフボタン ボタンをクリックして、リーダーノードの無線をオフにします。リーダーは、無線をオフにするとメッセージを送受信できなくなります。

他のルーターまたはボーダー ルータが新しいリーダーになるまで 12 秒ほど(シミュレーション時間では 120 秒)待ちます。

ノード 9 を新しいリーダーとして新しいパーティションが形成されます。

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

無線通信をON

無線がオフになっているリーダーを選択します。Action Barラジオのオンボタン ボタンをクリックして、無線接続を復元します。

無線が再びオンになった後、ノード 1 がパーティションに参加します。

無線接続が復元されたら、リーダーはネットワークに再接続する必要があります。

8. ノードを移動する

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

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

境界ルータ ノード 9 を新しい場所に移動します。

> move 9 50 50
Done

OTNS-Web でノードを移動する

ノードをドラッグして右下に移動します。ノード 5 は他のルーターの無線通信範囲外にあるため、新しいパーティション ID を持つ独自のパーティションを形成します。パーティション ID は、ノードをクリックしてノード情報パネルで確認できます。

ノード 5 が他のノードから移動され、新しいパーティションが形成されます。

ノード 5 とノード 9 の間には、引き続き 1 本の緑色の線が引かれます。これは、子に関する古い情報が、以前の親の子テーブルに残っていることが原因で発生することがよくあります。または、ノード 9 とノード 5 間の以前のルーター間リンクに関する古い情報である可能性があります。(この場合はレンダリング バグである可能性もあります)。適切なタイムアウト後に、古い情報はノードでクリーンアップされます。

9. ノードを削除する

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

ノード 5 を削除します。

> del 5
Done

ノード 5 がシミュレーションから消えます。

ノード 5 がシミュレーションから削除される

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

境界ルーター ノード 9 を選択し、Action Bar削除ボタン ボタンをクリックしてノード 9 を削除します。

境界ルーターのノード 9 が削除される

Node 1 が新しいパーティションのリーダーになり、残りのノードはすべてノード 1 に子としてアタッチされます。

10. 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
otns
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:b400
fd00:f00d:cafe:0:2505:8719:3685:ebfb
fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb
fe80:0:0:0:e86a:e07:ec97:777
Done

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

node 1> node 2
Done
node 2> 

終了ノード コンテキスト

node 1> exit
Done
>

ノードのコンテキストを終了する別の方法として、node 0 コマンドを使用することもできます。

11. ノードログとパケット キャプチャの表示

OpenThread ノードログ

デフォルトでは、OTNS は、シミュレートされたすべての OpenThread ノードの詳細なログファイルを生成します。これらは ./tmp ディレクトリで確認できます。ファイル名は 0_.log です。たとえば、ログファイルの抜粋を次に示します。

7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-:     src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6    | ..&..!.eSZCN.Y.  |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-:     src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---:     12 0x3000 - me - leader

左側には、マイクロ秒単位の絶対シミュレーション時間が示されます。hh:mm:ss タイムスタンプは、OpenThread ノードの独自のログタイムスタンプを示します。これは、絶対シミュレーション時間とは異なる場合があります。

Wireshark パケット キャプチャ

デフォルトでは、送信されたすべての IEEE 802.15.4 フレームは PCAP ファイル current.pcap にキャプチャされます。このファイルは、シミュレーション中またはシミュレーション後に Wireshark で読み取ることができます。Thread のリンクレイヤ暗号化のため、OTNS の復号鍵を適切に設定するには、Wireshark で 1 回限りの構成アクションが必要です。デフォルトでは、Wireshark によるフレームの復号が容易になるように、1 つの well-known ネットワーク キーが使用されます。

Wireshark での OpenThread パケット検査の例を以下のスクリーンショットに示します。

Wireshark での OpenThread パケット分析のスクリーンショット

復号鍵を設定するには、メニューで [編集] > [設定] を選択します。次に、設定ウィンドウで [Protocols] -> [IEEE 802.15.4] を選択します。[復号鍵] の横にある [編集...] ボタンをクリックします。[+] をクリックして新しいエントリを作成し、キー 00112233445566778899aabbccddeeff(32 文字)を入力し、[キーハッシュ] フィールドで [スレッドハッシュ] を選択します。[復号鍵インデックス] は 0 のままにします。[OK]、[OK] の順にクリックします。これで、OTNS PCAP ファイルが読み込まれたときに適切に復号されるようになります。

[時間] 列に表示されるタイムスタンプ(秒単位)は、OpenThread ノードルグに表示される絶対シミュレーション時間値に対応しています。これにより、ログ メッセージを送受信された無線フレームと関連付けやすくなります。ただし、通常、値は 1 マイクロ秒の精度まで同じではありません。シミュレートされた IEEE 802.15.4 無線ハードウェアは、OpenThread スタックから無線フレームの送信がリクエストされた後に、追加の遅延が生じる可能性があります。

12. 完了

これで、最初の OTNS シミュレーションが正常に実行されました。

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

OTNS の概要と、OTNS を使用して OpenThread ネットワークをシミュレートする方法について説明しました。

次のステップ

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

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