Docker で OpenThread を使用して Thread ネットワークをシミュレートする

1. はじめに

26b7f4f6b3ea0700.png

Google がリリースした OpenThread は、Thread ネットワーキング プロトコルのオープンソース実装です。Google Nest は、Nest 製品で使用されているテクノロジーをデベロッパーが幅広く利用できるように OpenThread をリリースし、スマートホーム製品の開発を加速させています。

Thread 仕様では、ホーム アプリケーション向けの IPv6 ベースの信頼性が高く安全な低消費電力のワイヤレス デバイス間通信プロトコルを定義しています。OpenThread は、IPv6、6LoWPAN、MAC セキュリティ付き IEEE 802.15.4、メッシュリンク確立、メッシュ ルーティングなど、すべての Thread ネットワーキング レイヤを実装しています。

この Codelab では、Docker を使用してエミュレートされたデバイスで Thread ネットワークをシミュレートする手順について説明します。

学習内容

  • OpenThread ビルド ツールチェーンを設定する方法
  • Thread ネットワークをシミュレートする方法
  • Thread ノードを認証する方法
  • OpenThread Daemon で Thread ネットワークを管理する方法

必要なもの

  • Docker
  • Linux、ネットワーク ルーティングに関する基本的な知識

2. Docker を設定する

この Codelab は、Linux、Mac OS X、または Windows マシンで Docker を使用するように設計されています。Linux が推奨環境です。

Docker のインストール

選択した OS に Docker をインストールします。

Docker イメージを pull する

Docker がインストールされたら、ターミナル ウィンドウを開き、openthread/environment Docker イメージを pull します。このイメージには、この Codelab で使用する OpenThread と OpenThread Daemon がプリビルドされ、すぐに使用できる状態で含まれています。

$ docker pull openthread/environment:latest

完全にダウンロードされるまで数分かかることがあります。

ターミナル ウィンドウで、イメージから Docker コンテナを起動し、その bash シェルに接続します。

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

--rm オプションは、コンテナを終了するとコンテナを削除します。コンテナを削除したくない場合は、このオプションを使用しないでください。

この Codelab に必要なフラグに注意してください。

  • --sysctl net.ipv6.conf.all.disable_ipv6=0 - コンテナ内で IPv6 を有効にします。
  • --cap-add=net_admin - NET_ADMIN 機能を有効にします。これにより、IP ルートの追加などのネットワーク関連のオペレーションを実行できます。

コンテナに入ると、次のようなプロンプトが表示されます。

root@c0f3912a74ff:/#

上記の例では、c0f3912a74ff はコンテナ ID です。Docker コンテナのインスタンスのコンテナ ID は、この Codelab のプロンプトに示されているものとは異なります。

Docker の使用

この Codelab は、Docker の基本的な使用方法を理解していることを前提としています。Codelab の演習中は、Docker コンテナに留まる必要があります。

3. Thread ネットワークをシミュレートする

この Codelab で使用するサンプル アプリケーションは、基本的なコマンドライン インターフェース(CLI)を介して OpenThread の構成インターフェースと管理インターフェースを公開する最小限の OpenThread アプリケーションを示しています。

この演習では、エミュレートされた Thread デバイスから別のエミュレートされた Thread デバイスに ping を送信するために必要な最小限の手順を説明します。

次の図は、基本的な Thread ネットワーク トポロジを示しています。この演習では、緑色の円内の 2 つのノード(Thread Leader と Thread Router)をエミュレートします。これらのノード間には 1 つの接続があります。

6e3aa07675f902dc.png

ネットワークを作成する

1. ノード 1 を起動する

まだ行っていない場合は、ターミナル ウィンドウで Docker コンテナを起動し、その bash シェルに接続します。

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

Docker コンテナで、ot-cli-ftd バイナリを使用して、エミュレートされた Thread デバイスの CLI プロセスを生成します。

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

注: このコマンドを実行しても > プロンプトが表示されない場合は、enter を押します。

このバイナリは OpenThread デバイスを実装します。IEEE 802.15.4 無線ドライバは UDP の上に実装されます(IEEE 802.15.4 フレームは UDP ペイロード内で渡されます)。

1 の引数は、エミュレートされたデバイスの「工場で割り当てられた」IEEE EUI-64 の最下位ビットを表すファイル記述子です。この値は、IEEE 802.15.4 無線エミュレーションの UDP ポートへのバインド時にも使用されます(ポート = 9000 + ファイル記述子)。この Codelab のエミュレートされた Thread デバイスの各インスタンスは、異なるファイル記述子を使用します。

注: エミュレートされたデバイスのプロセスを生成する場合は、この Codelab で説明したように、1 以上のファイル記述子のみを使用してください。0 のファイル記述子は他の用途のために予約されています。

新しい運用データセットを作成し、アクティブなデータセットとしてコミットします。オペレーショナル データセットは、作成する Thread ネットワークの構成です。

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Network Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

このデータセットをアクティブなデータセットとしてコミットします。

> dataset commit active
Done

IPv6 インターフェースを起動します。

> ifconfig up
Done

Thread プロトコル オペレーションを開始します。

> thread start
Done

数秒待ってから、デバイスが Thread リーダーになったことを確認します。リーダーは、ルーター ID の割り当てを管理するデバイスです。

> state
leader
Done

Node 1 の Thread インターフェースに割り当てられた IPv6 アドレスを表示します(出力は異なります)。

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

特定の IPv6 アドレスタイプをメモします。

  • fd = mesh-local で始まる
  • fe80 で始まる = リンクローカル

メッシュローカル アドレスタイプはさらに分類されます。

  • ff:fe00 = ルーター ロケータ(RLOC)を含む
  • ff:fe00 = エンドポイント識別子(EID)を含まない

コンソール出力で EID を特定し、後で使用するためにメモしておきます。上記のサンプル出力では、EID は次のとおりです。

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. ノード 2 を起動する

新しいターミナルを開き、現在実行中の Docker コンテナで bash シェルを実行して、Node 2 で使用します。

$ docker exec -it codelab_otsim_ctnr bash

この新しい bash プロンプトで、引数 2 を使用して CLI プロセスを生成します。これは、2 つ目のエミュレートされた Thread デバイスです。

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

注: このコマンドを実行しても > プロンプトが表示されない場合は、enter を押します。

Node 1 のオペレーショナル データセットと同じ値を使用して、Thread ネットワーク キーと PAN ID を構成します。

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

このデータセットをアクティブなデータセットとしてコミットします。

> dataset commit active
Done

IPv6 インターフェースを起動します。

> ifconfig up
Done

Thread プロトコル オペレーションを開始します。

> thread start
Done

デバイスは自動的に子供として初期化されます。Thread Child は End Device と同等です。これは、Parent デバイスとのみユニキャスト トラフィックを送受信する Thread デバイスです。

> state
child
Done

2 分以内に、状態が child から router に切り替わります。Thread ルーターは、Thread デバイス間のトラフィックをルーティングできます。親とも呼ばれます。

> state
router
Done

ネットワークを確認する

メッシュ ネットワークを簡単に確認するには、ルーター テーブルを確認します。

1. 接続を確認します。

ノード 2 で RLOC16 を取得します。RLOC16 は、デバイスの RLOC IPv6 アドレスの最後の 16 ビットです。

> rloc16
5800
Done

ノード 1 で、ノード 2 の RLOC16 のルーター テーブルを確認します。Node 2 が最初にルーター状態に切り替わっていることを確認します。

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In  | LQ Out  | Age | Extended MAC   |
+----+--------+----------+-----------+--------+-------+---+--------------------+
| 20 | 0x5000 |       63 |         0 |      0 |     0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |      3 |     3 |  23 | 5a4eb647eb6bc66c |

ノード 2 の RLOC 0x5800 がテーブルにあり、メッシュに接続されていることが確認できます。

2. ノード 2 からノード 1 に ping を送信する

2 つのエミュレートされた Thread デバイス間の接続を確認します。ノード 2 で、ノード 1 に割り当てられた EID を ping します。

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms

enter キーを押して、> CLI プロンプトに戻ります。

ネットワークをテストする

2 つのエミュレートされた Thread デバイス間で ping が正常に実行できるようになったので、1 つのノードをオフラインにしてメッシュ ネットワークをテストします。

ノード 1 に戻り、スレッドを停止します。

> thread stop
Done

ノード 2 に切り替えて、状態を確認します。2 分以内に、ノード 2 がリーダー(ノード 1)がオフラインであることを検出し、ノード 2 がネットワークの leader に移行します。

> state
router
Done
...
> state
leader
Done

確認したら、Thread を停止し、Node 2 を出荷時の設定にリセットしてから、Docker bash プロンプトに戻ります。出荷時の設定にリセットするのは、この演習で使用した Thread ネットワークの認証情報が次の演習に引き継がれないようにするためです。

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

factoryreset コマンドの後に > プロンプトを戻すには、enter を数回押す必要がある場合があります。Docker コンテナを終了しないでください。

また、Node 1 を出荷時の設定にリセットして終了します。

> factoryreset
>
> exit
root@c0f3912a74ff:/#

使用可能なすべての CLI コマンドについては、OpenThread CLI リファレンスをご覧ください。

4. コミッショニングでノードを認証する

前の演習では、2 つのシミュレートされたデバイスで Thread ネットワークを設定し、接続を確認しました。ただし、これにより、認証されていない IPv6 リンクローカル トラフィックのみがデバイス間で通過できるようになります。ノード間で(および Thread ボーダー ルーター経由でインターネットとの間で)グローバル IPv6 トラフィックをルーティングするには、ノードを認証する必要があります。

認証を行うには、1 つのデバイスが Commissioner として動作する必要があります。コミッショナーは、現在選出されている新しい Thread デバイスの認証サーバーであり、デバイスがネットワークに参加するために必要なネットワーク認証情報を提供する認可者です。

この演習では、以前と同じ 2 ノード トポロジを使用します。認証では、Thread リーダーが Commissioner、Thread ルーターが Joiner として機能します。

d6a67e8a0d0b5dcb.png

Docker

残りの演習の各ノード(ターミナル ウィンドウ)で、OpenThread ビルドで Docker コンテナを実行していることを確認してください。前の演習から続行する場合は、同じ Docker コンテナ内に 2 つの bash プロンプトがすでに開いているはずです。そうでない場合は、Docker のトラブルシューティングの手順を参照するか、Thread ネットワークをシミュレートする演習をやり直してください。

1. ネットワークの作成

Node 1 で、CLI プロセスを生成します。

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

注: このコマンドを実行しても > プロンプトが表示されない場合は、enter を押します。

新しいオペレーショナル データセットを作成し、アクティブなデータセットとしてコミットして、Thread を開始します。

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Network Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

このデータセットをアクティブなデータセットとしてコミットします。

> dataset commit active
Done

IPv6 インターフェースを起動します。

> ifconfig up
Done

Thread プロトコル オペレーションを開始します。

> thread start
Done

数秒待ってから、デバイスが Thread リーダーになったことを確認します。

> state
leader
Done

2. コミッショナーの役割を開始する

Node 1 に接続した状態で、Commissioner ロールを開始します。

> commissioner start
Done

J01NME Joiner Credential を持つすべての Joiner(* ワイルドカードを使用)がネットワークにコミッショニングできるようにします。Joiner は、人間の管理者がコミッショニングされた Thread ネットワークに追加するデバイスです。

> commissioner joiner add * J01NME
Done

3. 参加者ロールを開始する

2 つ目のターミナル ウィンドウで、Docker コンテナに新しい CLI プロセスを生成します。これはノード 2 です。

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

ノード 2 で、J01NME Joiner 認証情報を使用して Joiner ロールを有効にします。

> ifconfig up
Done
> joiner start J01NME
Done

... 確認のため数秒待ちます ...

Join success

参加デバイス(ノード 2)は、コミッショナー(ノード 1)で正常に認証され、Thread ネットワークの認証情報を取得しました。

ノード 2 が認証されたので、Thread を開始します。

> thread start
Done

4. ネットワーク認証を検証する

ノード 2 の state を確認して、ネットワークに参加したことを検証します。2 分以内に、ノード 2 が child から router に移行します。

> state
child
Done
...
> state
router
Done

5. 構成をリセット

次の演習に備えて、構成をリセットします。各ノードで、Thread を停止し、出荷時設定にリセットして、エミュレートされた Thread デバイスを終了します。

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

factoryreset コマンドの後に > プロンプトを戻すには、enter を数回押す必要がある場合があります。

5. OpenThread Daemon でネットワークを管理する

この演習では、1 つの CLI インスタンス(1 つの組み込み SoC Thread デバイス)と 1 つの Radio Co-Processor(RCP)インスタンスをシミュレートします。

ot-daemon は、UNIX ソケットを入力と出力として使用する OpenThread Posix アプリのモードです。これにより、OpenThread コアをサービスとして実行できます。クライアントは、OpenThread CLI をプロトコルとして使用してソケットに接続することで、このサービスと通信できます。

ot-ctl は、RCP の管理と構成を行うために ot-daemon によって提供される CLI です。これを使用して、RCP を Thread デバイスによって作成されたネットワークに接続します。

Docker

この演習の各ノード(ターミナル ウィンドウ)で、OpenThread ビルドで Docker コンテナを実行していることを確認してください。前の演習から続行する場合は、同じ Docker コンテナ内に 2 つの bash プロンプトがすでに開いているはずです。そうでない場合は、Docker のトラブルシューティングの手順をご覧ください。

ot-daemon を使用する

この演習では、次の 3 つのターミナル ウィンドウを使用します。

  1. シミュレートされた Thread デバイス(ノード 1)の CLI インスタンス
  2. ot-daemon プロセス
  3. ot-ctl CLI インスタンス

1. ノード 1 を起動する

最初のターミナル ウィンドウで、エミュレートされた Thread デバイスの CLI プロセスを生成します。

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

注: このコマンドを実行しても > プロンプトが表示されない場合は、enter を押します。

新しいオペレーショナル データセットを作成し、アクティブなデータセットとしてコミットして、Thread を開始します。

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Network Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

このデータセットをアクティブなデータセットとしてコミットします。

> dataset commit active
Done

IPv6 インターフェースを起動します。

> ifconfig up
Done

Thread プロトコル オペレーションを開始します。

> thread start
Done

Node 1 の Thread インターフェースに割り当てられた IPv6 アドレスを表示します。

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

Thread ネットワークをシミュレートするの手順で説明したように、1 つのアドレスはリンクローカル(fe80)で、3 つはメッシュローカル(fd)です。EID は、アドレスに ff:fe00 が含まれていないメッシュローカル アドレスです。この出力例では、EID は fd55:cf34:dea5:7994:460:872c:e807:c4ab です。

ipaddr 出力から、ノードとの通信に使用される特定の EID を特定します。

2. ot-daemon を起動

2 番目のターミナル ウィンドウで、tun デバイスノードを作成し、読み取り/書き込み権限を設定します。

root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200
root@c0f3912a74ff:/# chmod 600 /dev/net/tun

このデバイスは、仮想デバイスでのパケットの送信と受信に使用されます。デバイスがすでに作成されている場合はエラーが発生することがありますが、これは正常な動作であり、無視してかまいません。

RCP ノード(Node 2)の ot-daemon を開始します。-v 詳細フラグを使用して、ログ出力を確認し、実行中であることを確認します。

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty:///openthread/build/examples/apps/ncp/ot-rcp?forkpty-arg=2'

成功すると、詳細モードの ot-daemon は次のような出力を生成します。

ot-daemon[31]: Running OPENTHREAD/297a880; POSIX; Feb  1 2022 04:43:39
ot-daemon[31]: Thread version: 3
ot-daemon[31]: Thread interface: wpan0
ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb  1 2022 04:42:50

このターミナルは開いたままにして、バックグラウンドで実行します。これ以上コマンドを入力することはありません。

3. ot-ctl を使用してネットワークに参加する

Node 2(ot-daemon RCP)はまだどの Thread ネットワークにもコミッショニングされていません。ここで ot-ctl が役立ちます。ot-ctl は OpenThread CLI アプリと同じ CLI を使用します。そのため、他のシミュレートされた Thread デバイスと同じ方法で ot-daemon ノードを制御できます。

3 つ目のターミナル ウィンドウを開き、既存のコンテナを実行します。

$ docker exec -it codelab_otsim_ctnr bash

コンテナに入ったら、ot-ctl を起動します。

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl
>

この 3 番目のターミナル ウィンドウで ot-ctl を使用して、2 番目のターミナル ウィンドウで ot-daemon を使用して起動した Node 2(RCP ノード)を管理します。ノード 2 の state を確認します。

> state
disabled
Done

Node 2 の eui64 を取得して、特定の Joiner への参加を制限します。

> eui64
18b4300000000001
Done

ノード 1(最初のターミナル ウィンドウ)で、Commissioner を起動し、参加をその eui64 のみに制限します。

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

3 番目のターミナル ウィンドウで、Node 2 のネットワーク インターフェースを起動してネットワークに参加します。

> ifconfig up
Done
> joiner start J01NME
Done

... 確認のため数秒待ちます ...

Join success

Joiner として、RCP(ノード 2)は Commissioner(ノード 1)で認証され、Thread ネットワークの認証情報を取得しました。

Node 2 を Thread ネットワークに参加させます(3 番目のターミナル ウィンドウで再度実行します)。

> thread start
Done

4. ネットワーク認証を検証する

3 番目のターミナルで、Node 2 の state を確認し、ネットワークに参加したことを検証します。2 分以内に、ノード 2 が child から router に移行します。

> state
child
Done
...
> state
router
Done

5. 接続を検証する

3 番目のターミナル ウィンドウで、Ctrl+D または exit コマンドを使用して ot-ctl を終了し、コンテナの bash コンソールに戻ります。このコンソールから、ping6 コマンドを使用して EID で Node 1 に ping を送信します。ot-daemon RCP インスタンスが Thread ネットワークに正常に参加し、通信している場合、ping は成功します。

root@c0f3912a74ff:/# ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

6. Docker のトラブルシューティング

Docker コンテナを終了した場合

bash プロンプトが表示された場合は、実行中かどうかを確認し、必要に応じて再起動または再入力する必要があります。--rm オプションを使用せずに作成した Docker コンテナは、引き続き存在します。

実行中の Docker コンテナを表示するには:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

すべての Docker コンテナ(実行中と停止中の両方)を表示するには:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

いずれの docker ps コマンドの出力にもコンテナ codelab_otsim_ctnr が表示されない場合は、もう一度実行します。

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

コンテナの終了時にコンテナを削除する場合は、--rm オプションのみを使用します。

コンテナが停止している場合(docker ps -a にリストされているが docker ps にリストされていない場合)は、再起動します。

$ docker start -i codelab_otsim_ctnr

Docker コンテナがすでに実行されている場合(docker ps に一覧表示されている場合)は、各ターミナルでコンテナに再接続します。

$ docker exec -it codelab_otsim_ctnr bash

「Operation not permitted」エラー

新しい OpenThread ノードの作成時(mknod コマンドを使用)に Operation not permitted エラーが発生した場合は、この Codelab で提供されているコマンドに従って、Docker を root ユーザーとして実行していることを確認してください。この Codelab では、ルートレス モードでの Docker の実行はサポートされていません。

7. 完了

OpenThread を使用して、最初の Thread ネットワークをシミュレートできました。誠にありがとうございます。

この Codelab では、以下について学びました。

  • OpenThread シミュレーション Docker コンテナを起動して管理する
  • Thread ネットワークをシミュレートする
  • Thread ノードを認証する
  • OpenThread Daemon で Thread ネットワークを管理する

Thread と OpenThread の詳細については、以下のリファレンスをご覧ください。

または、Docker コンテナで OpenThread Border Router を使用してみてください。