nRF52840ボードとOpenThreadを使用してスレッドネットワークを構築します

26b7f4f6b3ea0700.png

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

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

このCodelabでは、実際のハードウェアでOpenThreadをプログラムし、スレッドネットワークを作成および管理し、ノード間でメッセージを渡します。

4806d16a8c137c6d.jpeg

あなたが学ぶこと

  • OpenThreadCLIバイナリをビルドして開発ボードにフラッシュする
  • Linuxマシンと開発ボードで構成されるRCPの構築
  • OpenThreadデーモンと使用RCPとの通信ot-ctl
  • ScreenとOpenThreadCLIを使用してスレッドノードを手動で管理する
  • スレッドネットワークへのデバイスの安全な試運転
  • IPv6マルチキャストのしくみ
  • UDPを使用してスレッドノード間でメッセージを渡す

必要なもの

ハードウェア:

  • 3つのNordicSemiconductornRF52840開発ボード
  • ボードを接続するための3本のUSB-Micro-USBケーブル
  • 少なくとも3つのUSBポートを備えたLinuxマシン

ソフトウェア:

  • GNUツールチェーン
  • 北欧のnRF5xコマンドラインツール
  • SeggerJ-Linkソフトウェア
  • OpenThread
  • ギット

OpenThreadシミュレーション

開始する前に、を介して実行したい場合がありますOpenThreadシミュレーションコードラボ基本的なスレッドの概念とOpenThread CLIに慣れるために、。

シリアルポート端子

端末を介してシリアルポートに接続する方法に精通している必要があります。このCodelabはScreenを使用し、使用法の概要を提供しますが、他のターミナルソフトウェアを使用することもできます。

Linuxマシン

このCodelabは、i386またはx86ベースのLinuxマシンを使用して、Radio Co-Processor(RCP)スレッドデバイスのホストとして機能し、すべてのスレッド開発ボードをフラッシュするように設計されています。すべてのステップは、Ubuntu 14.04.5 LTS(Trusty Tahr)でテストされました。

Nordic SemiconductornRF52840ボード

このコードラボは3枚の使用nRF52840 PDKボードを

a6693da3ce213856.png

SEGGER J-Linkを使用して、オンボードJTAGモジュールを備えたnRF52840ボードをプログラムします。これをLinuxマシンにインストールします。

J-Linkソフトウェアおよびドキュメントパックをダウンロードする

お使いのマシンに適切なパッケージをダウンロードし、適切な場所にインストールしてください。 Linuxではこれがある/opt/SEGGER/JLink

nRF5xコマンドラインツールをインストールする

nRF5xコマンドラインツールを使用すると、OpenThreadバイナリをnRF52840ボードにフラッシュできます。 Linuxマシンに適切なnRF5x-Command-Line-Tools- <OS>ビルドをインストールします。

nRF5xコマンドラインツールをダウンロードする

ルートフォルダに抽出されたパッケージを置いて~/

ARMGNUツールチェーンをインストールする

ARMGNUツールチェーンはビルドに使用されます。

ARM GNUToolchainポータブルアーカイブをダウンロードする

私たちはで抽出されたアーカイブを置くことをお勧めします/opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ Linuxマシン上で。アーカイブの中の指示に従いreadme.txtインストール手順については、ファイルを。

インストール画面(オプション)

Screenは、シリアルポートで接続されたデバイスにアクセスするためのシンプルなツールです。このCodelabはScreenを使用しますが、任意のシリアルポートターミナルアプリケーションを使用できます。

$ sudo apt-get install screen

OpenThread

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

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

OpenThreadデーモンを構築する:

$ script/cmake-build posix -DOT_DAEMON=ON

これで、OpenThreadをビルドしてnRF52840ボードにフラッシュする準備が整いました。

ビルドしてフラッシュ

ジョイナーとネイティブUSB機能を使用してOpenThreadnRF52840の例を作成します。デバイスはJoinerの役割を使用して、安全に認証され、スレッドネットワークに試運転されます。ネイティブUSBを使用すると、nRF52840とホスト間のシリアルトランスポートとしてUSB CDCACMを使用できます。

常に実行することにより、第1前回のビルドのレポクリーンrm -rf build

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

OpenThread RCPバイナリのあるディレクトリに移動し、16進形式に変換します。

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

USBケーブルをnRF52840ボードの外部電源ピンの横にあるMicro-USBデバッグポートに接続し、Linuxマシンに接続します。 VDDへのnRF52840ボード上のNRF電源スイッチを設定します。正しく接続すると、LED5がオンになっています。

20a3b4b480356447.png

これはLinuxマシンに取り付けられた第1ボードであれば、それはシリアルポートとして表示されます/dev/ttyACM0 (すべてのnRF52840ボードが使用ttyACMシリアルポート識別子のために)。

$ ls /dev/ttyACM*
/dev/ttyACM0

RCPに使用されているnRF52840ボードのシリアル番号に注意してください。

c00d519ebec7e5f0.jpeg

nRFxコマンドラインツールの場所に移動し、ボードのシリアル番号を使用して、OpenThread RCPhexファイルをnRF52840ボードにフラッシュします。

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

成功すると、次の出力が生成されます。

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

後でボードの役割を混同しないように、ボードに「RCP」というラベルを付けます。

ネイティブUSBに接続する

OpenThread RCPビルドがシリアル輸送などのネイティブUSB CDC ACMの使用を可能にするので、あなたはRCPホスト(Linuxマシン)と通信するためにnRF52840ボード上のNRFのUSBポートを使用する必要があります。

デタッチ点滅nRF52840ボードのデバッグポートからUSBケーブルのマイクロUSB側は、その後、RESETボタンの隣にあるマイクロUSB NRFのUSBポートに再接続します。 USBへのNRF電源スイッチを設定します。

46e7b670d2464842.png

OpenThreadデーモンを起動します

RCP設計では、OpenThreadデーモンを使用してThreadデバイスと通信および管理します。開始ot-daemon-vあなたはそれが実行されていることをログ出力と確認を見ることができるようにフラグ冗長:

$ cd ~/src/openthread
$ ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'

成功した場合、 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

以下からのログだからオープンこのターミナルウィンドウを残すot-daemon見ることができます。

使用ot-ctl RCPのノードと通信します。 ot-ctl OpenThread CLIアプリと同じCLIを使用しています。したがって、あなたがコントロールすることができot-daemon他のシミュレートされたスレッドのデバイスと同様にノードを。

第二ターミナルウィンドウで、起動ot-ctl

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

チェックstateあなたが開始したノード2(RCPノード)のot-daemon

> state
disabled
Done

このコードラボで使用されている他の2つのスレッドノードは、標準のシステムオンチップ(SoC)設計のフルスレッドデバイス(FTD)です。彼らは使用しないwpantund 、ユーザーが手動でOpenThread CLIでそれらを管理します。

1つのデバイスがコミッショナーとして機能し、デバイスを安全に認証してそのネットワークにコミッションします。他のデバイスは、コミッショナーがスレッドネットワークに対して認証できるジョイナーとして機能します。

ビルドしてフラッシュ

コミッショナーとジョイナーの役割を有効にして、nRF52840プラットフォーム用のOpenThreadFTDの例を作成します。

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

OpenThreadフルスレッドデバイス(FTD)CLIバイナリを含むディレクトリに移動し、16進形式に変換します。

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

USBケーブルをnRF52840ボードの外部電源ピンの横にあるMicro-USBポートに接続し、Linuxマシンに接続します。 RCPはまだLinuxマシンに接続されている場合は、この新しいボードは、シリアルポートとして表示されます/dev/ttyACM1 (すべてのnRF52840ボードが使用ttyACMシリアルポート識別子のために)。

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

前と同じように、FTDに使用されているnRF52840ボードのシリアル番号に注意してください。

c00d519ebec7e5f0.jpeg

nRFxコマンドラインツールの場所に移動し、ボードのシリアル番号を使用して、OpenThread CLIFTDの16進ファイルをnRF52840ボードにフラッシュします。

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

ボードに「コミッショナー」というラベルを付けます。

ネイティブUSBに接続する

OpenThread FTDビルドがシリアル輸送などのネイティブUSB CDC ACMの使用を可能にするので、あなたはRCPホスト(Linuxマシン)と通信するためにnRF52840ボード上のNRFのUSBポートを使用する必要があります。

デタッチ点滅nRF52840ボードのデバッグポートからUSBケーブルのマイクロUSB側は、その後、RESETボタンの隣にあるマイクロUSB NRFのUSBポートに再接続します。 USBへのNRF電源スイッチを設定します。

46e7b670d2464842.png

ビルドを確認する

ターミナルウィンドウからGNUScreenを使用してOpenThreadCLIにアクセスし、ビルドが成功したことを確認します。 nRF52840ボードは、115200のボーレートを使用します。

$ screen /dev/ttyACM1 115200

新しいウィンドウで、Returnキーを押し、キーボードの上に数回は、OpenThread CLIを起動するには>プロンプトが表示されます。 IPv6インターフェイスを起動し、アドレスを確認します。

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Ctrl + aを使用→

dのLinux端末へのFTD長官CLI画面とリターンから切り離しに次のボードが点滅することができます。いつでも、使用時にCLIを再入力するscreen -rコマンドラインから。使用可能な画面のリストを表示するには、使用するscreen -ls

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

FTDジョイナーを設定する

既存の使用して、第三nRF52840ボードをフラッシュするために、上記のプロセスを繰り返しot-cli-ftd.hexビルドを。

この第三のボードが装着されたときに、他の二つのノードは、Linuxマシンに接続されている場合、それはシリアルポートとして表示されます/dev/ttyACM2

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

ボードに「Joiner」というラベルを付けます。

Screenを使用して確認する場合、コマンドラインからScreenの新しいインスタンスを作成する代わりに、既存のインスタンスに再接続し、その中に(FTDコミッショナーに使用した)新しいウィンドウを作成します。

$ screen -r

Ctrl + a→で画面内に新しいウィンドウを作成します

c

****。新しいコマンドラインプロンプトが表示されます。 FTDジョイナーのOpenThreadCLIにアクセスします。

$ screen /dev/ttyACM2 115200

この新しいウィンドウで、Returnキーを押し、キーボードの上に数回は、OpenThread CLIを起動するには>プロンプトが表示されます。 IPv6インターフェイスを起動し、アドレスを確認します。

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

今FTDジョイナーCLIは、FTD長官と画面の同じインスタンスであることを、あなたは+→Ctrlキーを使用してそれらを切り替えることができますn

Ctrl + aを使用→

d終了画面にいつでも。

今後、スレッドデバイスを頻繁に切り替えるため、すべてのデバイスがライブで簡単にアクセスできることを確認してください。これまで、Screenを使用して2つのFTDにアクセスしてきましたが、このツールを使用すると、同じターミナルウィンドウで画面を分割することもできます。これを使用して、あるノードが別のノードで発行されたコマンドにどのように反応するかを確認します。

理想的には、次の4つのウィンドウをすぐに利用できるようにする必要があります。

  1. ot-daemonサービス/ログ
  2. 経由RCPジョイナーot-ctl
  3. OpenThread CLI経由FTD長官
  4. OpenThread CLI経由FTDジョイナー

独自の端末/シリアルポート構成またはツールを使用する場合は、次の手順に進んでください。自分に最適な方法で、すべてのデバイスのターミナルウィンドウを構成します。

Screenの使用

使いやすくするために、1つの画面セッションのみを開始します。両方のFTDを設定したときから、すでに1つあるはずです。

画面内のすべてのコマンドは、Ctrl + aで始まります。

基本的な画面コマンド:

Screenセッションに再接続します(コマンドラインから)

screen -r

スクリーンセッションを終了します

Ctrlキー+→ d

スクリーンセッション内に新しいウィンドウを作成します

Ctrlキー+ A→ c

同じ画面セッションでウィンドウを切り替える

Ctrlキー+ A→ n (フォワード)はCtrl + A→ p (バック)

スクリーンセッションで現在のウィンドウを強制終了します

Ctrlキー+ A→ k

画面を分割

Screenを使用すると、端末を複数のウィンドウに分割できます。

f1cbf1258cf0a5a.png

コマンドscreen Ctrlキーを押しながら使用してアクセスされます。すべてのコマンドは、このアクセスキーの組み合わせで開始する必要があります。

Codelabを正確に実行している場合は、同じScreenインスタンスに2つのウィンドウ(FTDコミッショナー、FTDジョイナー)が必要です。画面を2つに分割するには、最初に既存の画面セッションに入ります。

$ screen -r

FTDデバイスの1つを使用している必要があります。画面で次の手順に従います。

  1. Ctrlキー+→ Sウィンドウを水平方向に分割します
  2. Ctrlキー+→ Tab新しい空白のウィンドウにカーソルを移動します
  3. Ctrlキー+→ n 、スイッチに次のものを新しいウィンドウこと
  4. それは、トップウィンドウと同じだ場合は、Ctrlキー+→ n 、再び他のFTDデバイスを表示するには

それらは両方とも表示されます。 Ctrlキー+→使用してそれらを切り替えるTab 。それはあなたがCtrlキー+ A→と各ウィンドウを改称お勧めしますA混乱を避けるために。

高度な使用

さらに分割する象限に画面と表示ot-daemonログおよびRCPジョイナーはot-ctl 、これらのサービスは、この同じ画面インスタンス内に開始する必要があります。そのためには、停止ot-daemonと出口をot-ctl 、および(Ctrlキー+ A→新しい画面のウィンドウ内でそれらを再起動しc )。

この設定は必須ではなく、ユーザーの演習として残されています。

次のコマンドを使用して、ウィンドウを分割してナビゲートします。

新しいウィンドウを作成する

Ctrlキー+ A→ c

ウィンドウを垂直に分割

Ctrl + a→

ウィンドウを水平に分割

Ctrlキー+ A→ S

次に表示されるウィンドウにジャンプします

Ctrlキー+→ Tab

表示されているウィンドウを前後に切り替えます

Ctrlキー+ A→ nまたはp

現在のウィンドウの名前を変更します

Ctrlキー+ A→ A

Ctrlキー+→でいつでも休暇画面dとし、再接続screen -rコマンドラインから。

画面の詳細については、 GNU画面のクイックリファレンスを

すべてのターミナルウィンドウと画面を構成したので、スレッドネットワークを作成しましょう。 FTDコミッショナーには、新しい運用データセットを作成して、アクティブな一人としてそれをコミットします。オペレーショナルデータセットは、作成するスレッドネットワークの構成です。

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

ネットワークキーをメモしてください1234c0de7ab51234c0de7ab51234c0de後に使用されます。

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

> dataset commit active
Done

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

> ifconfig up
Done

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

> thread start
Done

しばらくしてから、デバイスの状態を確認してください。それはリーダーでなければなりません。また、将来の参照用にRLOC16を入手してください。

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

デバイスのIPv6アドレスを確認します。

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

「codelab」ネットワークは、他のスレッドデバイスからスキャンしたときに表示されるようになりました。

ot-ctl RCPジョイナーに:

## RCP Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

FTDジョイナーのOpenThread CLIから:

## FTD Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

「codelab」ネットワークがリストに表示されない場合は、もう一度スキャンしてみてください。

あなたは、両方のスキャンでは、ネットワークがない合流可能(RCPジョイナーとFTDジョイナーのJ列)であると考えられることに気づくかもしれません。これは、スレッドコミッショニングがネットワーク上でアクティブでないことを意味するだけです。ジョイナーデバイスにネットワークキーを手動で入力することにより、帯域外で参加することもできます。

帯域外プロセスを使用して、作成したばかりのスレッドネットワークにRCPジョイナーを追加しましょう。 RCPジョイナーのネットワークをスキャン:

## RCP Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

参加するには、アクティブなデータセットのRCPジョイナーにネットワークキー(FTDコミッショナーから取得したばかり)を設定します。

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

データセットをチェックして、正しく設定されていることを確認します。

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

RCPジョイナーが「codelab」ネットワークに参加するようにスレッドを起動します。数秒待って、状態、RLOC16およびそのIPv6アドレスを確認します。

## RCP Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

メッシュローカルIPv6アドレスのをメモ( fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55fここでは)、あなたは後でそれを使用します。

FTD長官に戻るには、両方のデバイスが同じネットワークの一部であることを確認するためにルータと子テーブルをチェック。 RLOC16を使用して、RCPジョイナーを識別します。

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

RCPジョイナー(RCP建具から入手したメッシュローカルアドレスのメッシュローカルアドレスに対してping ipaddr接続性を検証するために、出力を):

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

これで、次のトポロジ図に示すように、2つのノードで構成されるスレッドネットワークができました。

otcodelab_top01C_2nodes.png

トポロジー図

Codelabの残りの部分を処理している間、ネットワークの状態が変化するたびに、新しいスレッドトポロジ図が表示されます。ノードの役割は次のように示されます。

b75a527be4563215.png

ルーターは常に五角形であり、エンドデバイスは常に円です。各ノードの番号は、その時点での各ノードの現在の役割と状態に応じて、CLI出力に表示されるルーターIDまたは子IDを表します。

次に、3番目のスレッドデバイスを「codelab」ネットワークに追加しましょう。今回は、より安全な帯域内試運転プロセスを使用します。 FTDジョイナーでは、ネットワークをスキャン:

## FTD Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 |  57 |

0 J列では、スレッド試運転デバイス上でアクティブでないことを示しています。

この次のデバイスでコミッショニングするときに具体的にし、FTDジョイナーのみが参加できるようにします。それでもFTDジョイナー上、取得eui64 FTD長官はそれを識別することができますので、:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

FTDコミッショナーで、コミッショナーを起動して、指定eui64ジョイナー資格と一緒に、参加することができ、デバイスのを。ジョイナークレデンシャルは、デバイス固有のパスフレーズです。

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

FTDジョイナーに切り替えて、再スキャン:

## FTD Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 1 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -45 | 196 |

示されるように1 J列に、スレッド試運転は、ネットワーク上で現在アクティブです。 FTDコミッショナーで設定したジョイナークレデンシャルを使用してジョイナーロールを開始します。

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

1分ほどで、認証が成功したことを確認できます。

## FTD Joiner ##
----------------

>
Join success

FTDジョイナーが「codelab」ネットワークに参加するようにスレッドを起動し、すぐに状態とRLOC16を確認します。

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

デバイスのIPv6アドレスを確認してください。 ALOCがないことに注意してください。これは、このデバイスがリーダーではなく、ALOCを必要とするエニーキャスト固有の役割も持たないためです。

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

すぐにFTD長官に切り替えて、3つのデバイスは、「コードラボ」は、ネットワーク内に存在することを確認するために、ルータと子テーブルをチェックします。

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

RLOC16に基づいて、FTDジョイナーはエンドデバイス(子)としてネットワークに接続されています。更新されたトポロジは次のとおりです。

otcodelab_top01C_ed01.png

このCodelabのスレッドデバイスは、ルーター適格エンドデバイス(REED)と呼ばれる特定の種類のフルスレッドデバイス(FTD)です。これは、ルーターまたはエンドデバイスとして機能し、エンドデバイスからルーターに昇格できることを意味します。

スレッドは最大32のルーターをサポートできますが、ルーターの数を16〜23に維持しようとします。REEDがエンドデバイス(子)として接続され、ルーターの数が16未満の場合、2分以内のランダムな期間の後自動的にルーターに昇格します。

あなたはFTDジョイナーを追加した後、あなたのスレッド、ネットワーク内の2人の子供を持っていた場合、少なくとも2分待って、その後、FTD長官上のルータと子テーブルを再確認:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

(= MAC拡張FTDジョイナーe6cdd2d93249a243 )ルータにそれ自体を推進してきました。 RLOC16が異なることに注意してください( b800の代わり0c02 )。これは、RLOC16がデバイスのルーターIDと子IDに基づいているためです。エンドデバイスからルーターに移行すると、ルーターIDと子IDの値が変更され、RLOC16も変更されます。

otcodelab_top01C.png

FTDジョイナーに新しい状態とRLOC16を確認します。

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

FTDジョイナーをダウングレードする

手動でエンドデバイスへのルータの背面からFTDジョイナーをダウングレードすることで、この動作をテストすることができます。状態を子に変更し、RLOC16を確認します。

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

戻るFTD長官に、FTDジョイナーは現在、子テーブル(ID = 3)に表示されます。それが移行している間、それは両方にあるかもしれません:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

しばらくすると、それはのRLOCでルータに切り替わりますb800

otcodelab_top01C.png

リーダーを削除する

リーダーは、すべてのスレッドルーターの中から自己選出されます。これは、現在のリーダーがスレッドネットワークから削除されると、他のルーターの1つが新しいリーダーになることを意味します。

FTDコミッショナーには、スレッドのネットワークから削除するには、スレッドをシャットダウンします。

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

2分以内に、FTDジョイナーは、新しいスレッドのリーダーになります。 FTDジョイナーの状態とIPv6アドレスをチェックして、以下を確認します。

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

子テーブルを確認してください。新しいRLOC16があることに注意してください。これは、IDと拡張MACで示されるように、RCPジョイナーです。スレッドネットワークをまとめるために、親ルーターをFTDコミッショナーからFTDジョイナーに切り替えました。これにより、RCPジョイナーの新しいRLOC16が作成されます(ルーターIDが3から46に変更されたため)。

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

あなたは子としてFTDジョイナーに接続するRCPジョイナー数分間待つ必要があります。状態とRLOC16をチェックして、次のことを確認します。

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

FTDコミッショナーを再接続します

2つのノードを持つスレッドネットワークはそれほど楽しいものではありません。 FTDコミッショナーをオンラインに戻しましょう。

FTDコミッショナーで、スレッドを再起動します。

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

2分以内に、エンドデバイスとして「codelab」ネットワークに自動的に再接続し、ルーターに昇格します。

## FTD Commissioner ##
----------------------

> state
router
Done

確認するために、FTDジョイナー上のルータと子テーブルをチェックしてください:

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

スレッドネットワークも3つのノードで構成されています。

異なる端末または画面ウィンドウに複数のデバイスがあるスレッドネットワークの管理は複雑になる可能性があります。問題が発生した場合は、これらのヒントを使用して、ネットワークまたはワークスペースの状態を「リセット」してください。

画面

あなたが今までに(あまりにも多くの画面ウィンドウ、または画面内の画面)設定で迷子場合は、どれも存在してまで+ Ctrlキーで画面のウィンドウを殺し続ける→K screen -lsコマンドライン出力のNo Sockets found 。次に、デバイスごとに画面ウィンドウを再作成します。 Screenが強制終了されても、デバイスの状態は保持されます。

スレッドノード

スレッドのネットワークトポロジは、このコードラボで説明されていない、またはノードが何らかの理由(それらに電力を供給するLinuxマシンがスリープに行ったなどの理由で)のために切断すると、それは、スレッドをダウンさせるネットワーク資格情報をクリアし、作成から再び始めるのがベストですスレッドのネットワークステップ。

FTDをリセットするには:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

RCPは、経由して同じようにリセットすることができot-ctl

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

マルチキャストは、デバイスのグループに一度に情報を伝達するために使用されます。スレッドネットワークでは、スコープに応じて、特定のアドレスがさまざまなデバイスグループでのマルチキャスト使用のために予約されています。

IPv6アドレス

範囲

に配信

ff02::1

リンクローカル

すべてのFTDおよびMED

ff02::2

リンクローカル

すべてのFTDとボーダールーター

ff03::1

メッシュ-ローカル

すべてのFTDおよびMED

ff03::2

メッシュ-ローカル

すべてのFTDとボーダールーター

このCodelabではボーダールーターを使用していないので、2つのFTDおよびMEDマルチキャストアドレスに焦点を当てましょう。

リンクローカルスコープは、単一の無線送信または単一の「ホップ」によって到達可能なすべてのスレッドインターフェイスで構成されます。デバイスがにpingに応答し、ネットワークトポロジのおもむくままff02::1マルチキャストアドレス。

Pingのff02::1 FTD長官から:

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

ネットワークには他に2つのデバイス(FTDジョイナーとRCPジョイナー)がありますが、FTDコミッショナーはFTDジョイナーのリンクローカルアドレス(LLA)から1つの応答しか受信しませんでした。これは、FTDジョイナーがFTDコミッショナーがシングルホップで到達できる唯一のデバイスであることを意味します。

otcodelab_top02C_02_LL.png

今のping ff02::1 FTDジョイナーから:

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

2つの応答!他のデバイスのIPv6アドレスを確認し、我々は(で終わる最初のものを見ることができる4b1d )FTD長官のLLAで、(で終わる秒1 943b )RCP建具LLAです。

otcodelab_top02C_02_LL02.png

これは、FTDジョイナーがFTDコミッショナーとRCPジョイナーの両方に直接接続されていることを意味し、トポロジを確認します。

メッシュ-ローカル

メッシュローカルスコープは、同じスレッドネットワーク内で到達可能なすべてのスレッドインターフェイスで構成されます。レッツはへのpingに応答を参照してくださいff03::1マルチキャストアドレス。

Pingのff03::1 FTD長官から:

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

この時間は、FTD局長は2つの応答、FTD建具ルーティングロケータから1(RLOC、で終わる受けb800 (で終わる、ML-EID)およびRCPジョイナーのメッシュローカルEIDから1をd55f )。これは、メッシュローカルスコープがスレッドネットワーク全体を構成しているためです。デバイスがあるネットワークで、それが加入されますどんなにff03::1アドレスを。

otcodelab_top02C_02_ML.png

pingのff03::1 FTDジョイナーから同じ動作を確認します:

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

両方のping出力でのRCPジョイナーの応答時間に注意してください。 RCPジョイナーは、FTDコミッショナー(68ms)に到達するのに、FTDジョイナー(23ms)に到達するよりもはるかに長い時間がかかりました。これは、FTDジョイナーの1ホップと比較して、FTDコミッショナーに到達するために2ホップを作成する必要があるためです。

また、メッシュローカルマルチキャストpingが、RCPジョイナーではなく、2つのFTDに対してのみRLOCで応答したことに気付いたかもしれません。これは、FTDがネットワーク内のルーターであるのに対し、RCPはエンドデバイスであるためです。

確認のためRCPジョイナーの状態を確認します。

## RCP Joiner ##
----------------

> state
child

OpenThreadが提供するアプリケーションサービスの1つは、トランスポート層プロトコルであるユーザーデータグラムプロトコル(UDP)です。 OpenThread上に構築されたアプリケーションは、UDP APIを使用して、スレッドネットワーク内のノード間、または外部ネットワーク内の他のデバイス(スレッドネットワークがボーダールーターを備えている場合はインターネットなど)にメッセージを渡すことができます。

UDPソケットは、OpenThreadCLIを介して公開されます。これを使用して、2つのFTD間でメッセージを渡します。

FTDジョイナー用メッシュローカルEIDアドレスを取得します。スレッドネットワーク内のどこからでも到達可能であるため、このアドレスを使用しています。

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

UDPを開始し、任意のIPv6アドレスのソケットにバインドします。

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

FTD長官に切り替え、UDPを開始し、そのML-EIDを使用して、あなたはFTDジョイナー上に設定されたソケットに接続します。

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

UDP接続は2つのノード間でライブである必要があります。 FTDコミッショナーからメッセージを送信します。

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

FTDジョイナーでは、UDPメッセージが受信されました!

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

物理的なスレッドネットワークを作成しました。

b915c433e7027cc7.png

あなたは今知っています:

  • スレッドデバイスのタイプ、ロール、およびスコープの違い
  • スレッドデバイスがネットワーク内の状態を管理する方法
  • UDPを使用してノード間で簡単なメッセージを渡す方法

次のステップ

このCodelabを基に、次の演習を試してください。

  • 使用してMTDとしてFTDジョイナーボードを再フラッシュot-cli-mtdバイナリを、そしてそれがリーダーになるために、ルータや試行に自分自身をアップグレードしたことがないことを確認
  • ネットワークにデバイスを追加し(別のプラットフォームを試してください!)、マルチキャストアドレスへのpingとともに、ルーターテーブルと子テーブルを使用してトポロジをスケッチします。
  • 使用pyspinelをNCPを制御します
  • 使用して境界ルータにNCPを変換するOpenThread境界ルータを、インターネットへのあなたのスレッドのネットワークを接続します

参考文献

チェックアウトopenthread.ioGitHubのを含め、OpenThread資源の多様性のために:

リファレンス: