OpenThreadを使用したスレッドネットワークのシミュレーション

26b7f4f6b3ea0700.png

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

スレッド仕様はホームアプリケーションのための信頼性の高い、安全なIPv6ベースと低電力無線デバイス・ツー・デバイス通信プロトコルを定義します。 OpenThreadは、IPv6、6LoWPAN、MACセキュリティを備えたIEEE 802.15.4、メッシュリンク確立、メッシュルーティングを含むすべてのスレッドネットワーク層を実装します。

このCodelabでは、シミュレートされたデバイスでスレッドネットワークをシミュレートする方法について説明します。

あなたが学ぶこと

  • OpenThreadビルドツールチェーンを設定する方法
  • スレッドネットワークをシミュレートする方法
  • スレッドノードを認証する方法
  • OpenThreadデーモンを使用してスレッドネットワークを管理する方法

必要なもの

  • ギット
  • Linux、ネットワークルーティングの基本的な知識

ギット

このCodelabを完了するにはGitが必要です。続行する前にダウンロードしてインストールしてください。

Gitをダウンロード

インストールしたら、特定のOSの指示に従って、OpenThreadをダウンロードしてビルドします。

Mac OSX用のXCode

XCodeのは、Mac OS X上でOpenThreadをインストールし、ビルドするために必要とされます。

XCodeをダウンロードする

XCodeをインストールした後、XCodeコマンドラインツールをインストールします。

$ xcode-select --install

Linux / Mac OSXでビルド

これらのインストール手順は、Ubuntu Server 14.04LTSおよびMacOS X Sierra10.12.6でテストされています。

OpenThreadをインストールします。 bootstrapコマンドは、ツールチェインがインストールされていることを確認し、環境が適切に構成されています。

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap
$ ./bootstrap

Windowsの使用

Windowsを好む場合は、このCodelabのDockerバージョンを試すことをお勧めします。

DockerでのOpenThreadシミュレーション

インストールが完了したら、サンプルのOpenThreadアプリケーションをビルドします。このCodelabでは、シミュレーション例を使用しています。

$ cd ~/src/openthread
$ make -f examples/Makefile-simulation

次に、OpenThreadデーモンをビルドします。

$ cd ~/src/openthread
$ make -f src/posix/Makefile-posix DAEMON=1

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

この演習では、あるシミュレートされたスレッドデバイスを別のシミュレートされたスレッドデバイスからpingするために必要な最小限の手順を実行します。

次の図は、基本的なスレッドネットワークトポロジを示しています。この演習では、緑色の円内の2つのノード(スレッドリーダーとスレッドルーターの間に単一の接続がある)をシミュレートします。

6e3aa07675f902dc.png

ノードにpingを実行します

1.ノード1を開始します

移動openthreadディレクトリとは、使用してシミュレートされたスレッドのデバイス用のCLIプロセスを生成ot-cli-ftdバイナリを。

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

注:表示されていない場合>このコマンドを実行した後、プロンプト、キーを押してenter

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

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

注:の使用のみのファイルディスクリプタ1以上のシミュレートされたデバイスのためのプロセスを生成するとき、このコードラボで述べたように。ファイルディスクリプタ0 、他の使用のために予約されています。

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

> 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 start
Done

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

> state
leader
Done

ノード1のスレッドインターフェイスに割り当てられた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 =メッシュ、ローカル
  • 始まるfe80 =リンクローカル

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

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

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

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

2.ノード2を開始します

新しい端末とナビゲートを開き、 openthreadディレクトリとCLIプロセスを起動。これは、2番目にシミュレートされたスレッドデバイスです。

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

注:表示されていない場合>このコマンドを実行した後、プロンプト、キーを押してenter

ノード1の運用データセットと同じ値を使用して、スレッドネットワークキーとPANIDを構成します。

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

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

> dataset commit active
Done

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

> ifconfig up
Done

スレッドプロトコル操作を開始します。

> thread start
Done

デバイスはそれ自体を子として初期化します。スレッドの子は、親デバイスでのみユニキャストトラフィックを送受信するスレッドデバイスであるエンドデバイスと同等です。

> state
child
Done

2分以内に、あなたはから状態スイッチが表示されるはずchildrouter 。スレッドルーターは、スレッドデバイス間でトラフィックをルーティングできます。親とも呼ばれます。

> state
router
Done

ネットワークを確認する

メッシュネットワークを確認する簡単な方法は、ルーターテーブルを確認することです。

1.接続を確認します

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

> rloc16
5800
Done

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

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

ノード1のRLOC 0xa800それがメッシュに接続されていることを確認し、テーブル内に発見されました。

2.ノード2からノード1にpingを実行します

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

> 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つのスレッドデバイス間で正常にpingできるようになったので、1つのノードをオフラインにしてメッシュネットワークをテストします。

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

> thread stop
Done

ノード2に切り替えて、状態を確認します。リーダー(ノード1)がオフラインになっている、とあなたがするノード2の移行を参照してくださいする必要があること、2分以内に、ノード2は、検出leaderネットワークの:

> state
router
Done
...
> state
leader
Done

確認したら、スレッドを停止し、ノード2を工場出荷時にリセットしてから終了します。この演習で使用したスレッドネットワークの資格情報が次の演習に持ち越されないように、工場出荷時のリセットが行われます。

> thread stop
Done
> factoryreset
>
> exit

また、工場出荷時にリセットしてノード1を終了します。

> factoryreset
>
> exit

参照してくださいOpenThread CLIリファレンスを使用可能なすべてのCLIコマンドを探索します。

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

認証するには、1つのデバイスがコミッショナーとして機能する必要があります。コミッショナーは、新しいスレッドデバイス用に現在選出されている認証サーバーであり、デバイスがネットワークに参加するために必要なネットワーク資格情報を提供するための承認者です。

この演習では、以前と同じ2ノードトポロジを使用します。認証の場合、スレッドリーダーはコミッショナーとして機能し、スレッドルーターはジョイナーとして機能します。

d6a67e8a0d0b5dcb.png

1.ネットワークを作成します

前の演習から続行する場合は、すでに2つのターミナルウィンドウが開いているはずです。そうでない場合は、2つが開いていて、使用する準備ができていることを確認してください。 1つはノード1として機能し、もう1つはノード2として機能します。

ノード1で、CLIプロセスを生成します。

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

注:表示されていない場合>このコマンドを実行した後、プロンプト、キーを押してenter

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

> 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 start
Done

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

> state
leader
Done

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

まだノード1にいる間に、コミッショナーの役割を開始します。

> commissioner start
Done

(使用して、任意のジョイナーを許可する*持つワイルドカード) J01NMEネットワーク上に委員会へのジョイナー資格を。ジョイナーは、人間の管理者によって委託されたスレッドネットワークに追加されるデバイスです。

> commissioner joiner add * J01NME
Done

3.ジョイナーロールを開始します

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

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

ノード2で、使用してジョイナーの役割を有効にJ01NMEジョイナー資格を。

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

ジョイナーとして、デバイス(ノード2)はコミッショナー(ノード1)で正常に認証され、スレッドネットワークの資格情報を受け取りました。

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

> thread start
Done

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

チェックstate 、それが今のネットワークに参加したことを検証するために、ノード2に。 2分以内に、ノード2は、トランジションchildへのrouter

> state
child
Done
...
> state
router
Done

5.構成をリセットします

次の演習の準備として、構成をリセットします。各ノードで、スレッドを停止し、工場出荷時のリセットを実行して、シミュレートされたスレッドデバイスを終了します。

> thread stop
Done
> factoryreset
>
> exit

あなたは押す必要があるかもしれませんenter持って来るために数回>の後にプロンプトバックをfactoryresetコマンド。

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

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

ot-ctlが提供するCLIでot-daemon RCPを管理および構成します。これを使用して、RCPをスレッドデバイスによって作成されたネットワークに接続します。

ot-daemonを使用する

この演習では、以下に対応する3つのターミナルウィンドウを使用します。

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

前の演習から続行する場合は、すでに2つのターミナルウィンドウが開いているはずです。 3番目を開いて、この演習で使用できるターミナルウィンドウが3つあることを確認します。

1.ノード1を開始します

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

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

注:表示されていない場合>このコマンドを実行した後、プロンプト、キーを押してenter

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

> 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 start
Done

ノード1のスレッドインターフェースに割り当てられた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
>

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

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

2.ot-daemonを起動します

第二ターミナルウィンドウで、へナビゲートopenthreadディレクトリ、および起動ot-daemon我々はノード2の使用を呼ぶことにしますこれは、RCPノードに対して-vあなたはそれが実行されていることをログ出力と確認を見ることができるようにフラグ冗長:

$ cd ~/src/openthread
$ ./output/posix/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'

成功した場合、 ot-daemon冗長モードでは、次のような出力を生成します。

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08

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

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

私たちは、ノード2(委託していないot-daemonまだスレッドネットワークにRCPを)。これはどこでot-ctlでてくる。 ot-ctl OpenThread CLIアプリと同じCLIを使用しています。したがって、あなたがコントロールすることができot-daemon他のシミュレートされたスレッドのデバイスと同様にノードを。

第三の端末ウィンドウで、開始ot-ctl

$ ./output/posix/bin/ot-ctl
>

あなたは使いますot-ctl 、あなたと二ターミナルウィンドウで起動することをノード2(RCPノード)を管理するには、この第三ターミナルウィンドウでot-daemon 。チェックstateノード2のを:

> state
disabled
Done

ノード2の取得eui64 、特定のジョイナーに参加を制限します:

> eui64
18b4300000000001
Done

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

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

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

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

ジョイナーとして、RCP(ノード2)はコミッショナー(ノード1)で正常に認証され、スレッドネットワークの資格情報を受け取りました。

次に、ノード2をスレッドネットワークに参加させます。

> thread start
Done

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

チェックstate 、それが今のネットワークに参加したことを検証するために、ノード2に。 2分以内に、ノード2は、トランジションchildへのrouter

> state
child
Done
...
> state
router
Done

5.接続を検証します

終了ot-ctlしてそのEIDを使用して、ノード1はCtrl + Dを使用し、ご使用のホスト・マシンのコマンドラインは、ping上ping6コマンド。場合ot-daemon RCPインスタンスが正常に接合され、スレッドネットワークと通信して、pingが成功しました。

$ 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

これで、OpenThreadを使用して最初のスレッドネットワークを正常にシミュレートできました。素晴らしい!

このCodelabでは、次の方法を学びました。

  • OpenThreadビルドツールチェーンを設定する
  • スレッドネットワークをシミュレートする
  • スレッドノードを認証する
  • OpenThreadデーモンを使用してスレッドネットワークを管理する

詳細については、次のリファレンスをご覧ください。