1. はじめに
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 に空白ページしか表示されない場合は、ブラウザで WebGL が有効になっていないか、WebGL を有効にする方法については、 https://superuser.com/a/836833 をご参照ください。
以降のセクションでは、OTNS-CLI
と OTNS-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
のさまざまな要素に注目してください。
5. ノードを追加する
OTNS-CLI を使用してノードを追加する
シミュレーションに Thread Router を追加します。
> add router 1 Done
OTNS-Web
に作成されたノードが表示されます。ノードはルータとして起動し、数秒後にリーダーになります。
シミュレーションをインタラクティブに簡単に開始できるように、新しい OpenThread ノードはデフォルトで標準のネットワーク パラメータセットで構成されます。
OTNS-CLI
を使用してノードを追加する
次に、さまざまなタイプのノードを追加します。
> add fed 2 Done > add med 3 Done > add sed 4 Done
ノードが 1 つのパーティションに統合されるまで数秒待ちます。OTNS-Web
にノードが表示されます。
また、OTNS-Web
で任意のノードを選択すると、そのノードに関する詳細情報を表示するパネルが表示されます。たとえば、次の図ではノード 1 が選択されています。パネルの [役割] エントリで、リーダーであることを確認します。
OTNS-Web
でノードを追加する
OTNS-Web
を使用してノードを追加することもできます。Action Bar
の New Router
ボタンをクリックします。選択したノードの右側に、作成中のノードが表示されます。新しいルーターを既存の Thread パーティションに接続します。
アクションバーの FED、MED、SSED、BR ボタンをクリックして、他のタイプのノードを作成することもできます。これで、合計 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 回クリックして選択します。
無線通信をOFF
アクションバーの ボタンをクリックして、リーダーノードの無線をオフにします。リーダーは、無線をオフにするとメッセージを送受信できなくなります。
他のルーターまたはボーダー ルータが新しいリーダーになるまで 12 秒ほど(シミュレーション時間では 120 秒)待ちます。
Thread ネットワークは、新しいリーダーで新しいパーティションを形成することで、リーダーの障害から自動的に復旧します。新しいパーティションには、新しいパーティションの色も設定されます。
無線通信をON
無線がオフになっているリーダーを選択します。Action Bar
の ボタンをクリックして、無線接続を復元します。
無線接続が復元されたら、リーダーはネットワークに再接続する必要があります。
8. ノードを移動する
OTNS では、ユーザーは OTNS-CLI
または OTNS-Web
を使用してノードを簡単に移動できます。
OTNS-CLI
を介してノードを移動する
境界ルータ ノード 9 を新しい場所に移動します。
> move 9 50 50 Done
OTNS-Web でノードを移動する
ノードをドラッグして右下に移動します。ノード 5 は他のルーターの無線通信範囲外にあるため、新しいパーティション ID を持つ独自のパーティションを形成します。パーティション ID は、ノードをクリックしてノード情報パネルで確認できます。
ノード 5 とノード 9 の間には、引き続き 1 本の緑色の線が引かれます。これは、子に関する古い情報が、以前の親の子テーブルに残っていることが原因で発生することがよくあります。または、ノード 9 とノード 5 間の以前のルーター間リンクに関する古い情報である可能性があります。(この場合はレンダリング バグである可能性もあります)。適切なタイムアウト後に、古い情報はノードでクリーンアップされます。
9. ノードを削除する
OTNS-CLI
でノードを削除する
ノード 5 を削除します。
> del 5 Done
ノード 5 がシミュレーションから消えます。
OTNS-Web
でノードを削除する
境界ルーター ノード 9 を選択し、Action Bar
の ボタンをクリックしてノード 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_
です。たとえば、ログファイルの抜粋を次に示します。
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 パケット検査の例を以下のスクリーンショットに示します。
復号鍵を設定するには、メニューで [編集] > [設定] を選択します。次に、設定ウィンドウで [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-CLI
と OTNS-Web
の両方を使用して、シミュレーションをさまざまな方法で操作する方法を学びました。
OTNS の概要と、OTNS を使用して OpenThread ネットワークをシミュレートする方法について説明しました。
次のステップ
以下の Codelab をご覧ください。
- OpenThread による Thread ネットワークのシミュレーション
- Docker で OpenThread を使用して Thread ネットワークをシミュレートする
- nRF52840 ボードと OpenThread を使用して Thread ネットワークを作成する