Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

nRF52840 ボードと OpenThread による Thread ネットワークの構築

1. はじめに

26b7f4f6b3ea0700.png

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

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

この Codelab では、実際のハードウェアで OpenThread をプログラミングし、Thread ネットワークを作成、管理して、ノード間でメッセージを渡します。

4806d16a8c137c6d.jpeg

学習内容

  • OpenThread CLI バイナリの構築と開発ボードへのフラッシュ
  • Linux マシンと開発ボードで構成される RCP の構築
  • OpenThread Daemon と ot-ctl を使用して RCP と通信する
  • GNU Screen と OpenThread CLI を使用してスレッドノードを手動で管理する
  • スレッド ネットワークへのデバイスの安全なコミッショニング
  • IPv6 マルチキャストの仕組み
  • UDP を使用してスレッドノード間でメッセージを渡す

必要なもの

ハードウェア:

  • 北欧 半導体 nRF52840 開発ボード x 3
  • ボードを接続するための USB - マイクロ USB ケーブル x 3
  • 3 つ以上の USB ポートを備えた Linux マシン

ソフトウェア:

  • GNU ツールチェーン
  • 北欧 nRF5x コマンドライン ツール
  • Sgger J-Link ソフトウェア
  • OpenThread
  • Git

2. スタートガイド

OpenThread シミュレーション

始める前に、OpenThread シミュレーション コードラボを読んで、Thread の基本的なコンセプトと OpenThread CLI についてよく理解しておくことをおすすめします。

シリアルポート端子

ターミナルからシリアルポートに接続する方法に精通している必要があります。この Codelab では GNU Screen を使用し、使用方法の概要を説明しますが、その他のターミナル ソフトウェアでも使用できます。

Linux マシン

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

Nordic Semiconductor nRF52840 ボード

この Codelab では、nRF52840 PDK ボードを 3 台使用します。

a6693da3ce213856.png

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

マシンに適したパッケージをダウンロードし、適切な場所にインストールします。Linux では /opt/SEGGER/JLink です。

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

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

抽出したパッケージをルートフォルダ ~/ に配置します。

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

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

抽出したアーカイブは、Linux マシンの /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ に配置することをおすすめします。インストール手順については、アーカイブの readme.txt ファイルに記載された手順に従ってください。

インストール画面(省略可)

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

$ sudo apt-get install screen

3. リポジトリのクローン作成

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 ボードにフラッシュする準備が整いました。

4.RCP 結合者を設定する

ビルドとフラッシュ

Joiner とネイティブ USB 機能を使用して OpenThread nRF52840 の例をビルドします。デバイスは Joiner のロールを使用して、安全に認証され、Thread ネットワークにコミッショニングされます。ネイティブ USB を使用すると、nRF52840 とホストとの間のシリアル トランスポートとして USB CDC ACM を使用できます。

最初に 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

nRF52840 ボードの外部電源ピンの横にあるマイクロ USB デバッグポートに USB ケーブルを接続し、Linux マシンに接続します。nRF52840 ボードの nRF 電源スイッチを VDD に設定します。LED5 が正しく接続されている場合、正しく接続されています。

20a3b4b480356447.png

Linux マシンに初めて接続されるボードの場合は、シリアルポート /dev/ttyACM0 と表示されます(すべての nRF52840 ボードでシリアルポート識別子に ttyACM が使用されます)。

$ ls /dev/ttyACM*
/dev/ttyACM0

RCP に使用されている nRF52840 ボードのシリアル番号をメモします。

c00d519ebec7e5f0.jpeg

nRFx コマンドライン ツールの場所に移動し、ボードのシリアル番号を使用して OpenThread RCP 16 進数ファイルを nRF52840 ボードにフラッシュします。--verify フラグを省略した場合、フラッシュ プロセスがエラーなしで失敗する可能性があることを通知するメッセージが表示されます。

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --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.

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

ネイティブ USB への接続

OpenThread RCP ビルドは、ネイティブ USB CDC ACM をシリアルトランスポートとして使用できるため、nRF52840 ボードのnRF USBポートを使用して RCP ホスト(Linux マシン)と通信する必要があります。

フラッシュした nRF52840 ボードのデバッグポートから USB ケーブルのマイクロ USB の端を取り外し、-RESET ボタンの横にある Micro-USB nRF USB ポートに再接続します。 。[nRF 電源] スイッチを [USB] に設定します。

46e7b670d2464842.png

OpenThread デーモンを起動する

RCP の設計では、OpenThread デーモンを使用して Thread デバイスと通信し、デバイスを管理します。 -v 詳細フラグを指定して ot-daemon を起動し、ログ出力を表示して、実行中であることを確認します。

$ 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 を使用します。したがって、他のシミュレートされた Thread デバイスと同じように ot-daemon ノードを制御できます。

2 つ目のターミナル ウィンドウで、ot-ctl を起動します。

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

ot-daemon を使用して開始したノード 2(RCP ノード)の state を確認します。

> state
disabled
Done

5. FTD を設定する

この Codelab で使用される他の 2 つのスレッドノードは、標準のシステム オン チップ(SoC)設計のフルスレッド デバイス(FTD)です。[Production] 設定では、wpantund(本番環境レベルのネットワーク インターフェース ドライバ)を使用して OpenThread NCP インスタンスを制御できますが、この Codelab では、OpenThread である ot-ctl を使用します。 CLI。

1 つのデバイスはコミッショナーとして機能し、デバイスに対して安全な認証とコミッショニングをネットワーク上で行います。他のデバイスは Joiner として機能し、コミッショナーは Thread ネットワークに対して認証を行うことができます。

ビルドとフラッシュ

コミッタ ロールとジョイナ ロールを有効にして、nRF52840 プラットフォームの OpenThread FTD の例をビルドします。

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

OpenThread Full Thread Device(FTD)CLI バイナリがあるディレクトリに移動し、16 進数形式に変換します。

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

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

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

前述のように、FTD で使用されている nRF52840 ボードのシリアル番号をメモします。

c00d519ebec7e5f0.jpeg

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

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

Jamboard に「Commissioner」というラベルを付けます。

ネイティブ USB への接続

OpenThread FTD ビルドでは、ネイティブ USB CDC ACM をシリアルトランスポートとして使用できるため、nRF52840 ボードのnRF USBポートを使用して RCP ホスト(Linux マシン)と通信する必要があります。

フラッシュした nRF52840 ボードのデバッグポートから USB ケーブルのマイクロ USB の端を取り外し、-RESET ボタンの横にある Micro-USB nRF USB ポートに再接続します。 。[nRF 電源] スイッチを [USB] に設定します。

46e7b670d2464842.png

ビルドを検証する

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

$ screen /dev/ttyACM1 115200

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

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

Ctrl+A →

d FTD Commissioner CLI との接続を解除するには画面に戻って Linux のターミナルに戻り、次のボードをフラッシュできるようにします。CLI にいつでも再入力するには、コマンドラインから screen -r を使用します。使用可能な画面のリストを表示するには、screen -ls を使用します。

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

FTD Joiner を設定する

上記のプロセスを繰り返して、既存の ot-cli-ftd.hex ビルドを使用して 3 つ目の nRF52840 ボードをフラッシュします。完了したら、nRF USB ポートを使用してボードを PC に再接続し、[nRF 電源] スイッチを [VDD] に設定します。

この 3 つ目のボードが接続されたときに、他の 2 つのノードが Linux マシンに接続されていた場合、シリアルポート /dev/ttyACM2 として表示されます。

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

Jamboard に「参加」というラベルを付けます。

Screen を使用して検証する場合は、コマンドラインから画面の新しいインスタンスを作成する代わりに、既存のインスタンスに再度アタッチし、その中に新しいウィンドウを作成します(FTD コミッショナーに使用したもの)。

$ screen -r

Ctrl+A → c キーを押した状態で、画面内に新しいウィンドウを作成する。

新しいコマンドライン プロンプトが表示されます。FTD Joiner の OpenThread CLI にアクセスします。

$ screen /dev/ttyACM2 115200

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

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

FTD Joiner CLI が FTD Commissioner と同じ画面のインスタンスになったので、Ctrl+A → n を使用して、FTD Joiner CLI を切り替えることができます。

Ctrl+A →

d いつでも画面を終了できます。

6. ターミナル ウィンドウの設定

今後は Thread デバイス間を頻繁に切り替えることになりますので、すべてのデバイスにライブ状態でアクセスしていただけます。これまでは、2 つの FTD にアクセスするために Screen を使用していましたが、このツールでは同じターミナル ウィンドウで分割画面を使用することもできます。こちらは、別のノードで発行されたコマンドに対するノードの反応を見るために使用します。

4 つのウィンドウを簡単に使用できることが理想的です。

  1. ot-daemon サービス / ログ
  2. RCP 加入者ot-ctl 経由)
  3. OpenThread CLI を介した FTD Commissioner
  4. OpenThread CLI を介した FTD Joiner

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

画面の使用

使いやすくするために、1 つのスクリーン セッションのみを開始します。両方の FTD を設定する時点ですでにいずれかの ID が割り当てられているはずです。

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

基本的な画面コマンド:

コマンドラインから画面セッションに再接続する

screen -r

スクリーン セッションから退出する

Ctrl+A → d

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

Ctrl+A → c

同じスクリーン セッションでウィンドウを切り替える

Ctrl+a → n(進む)Ctrl+a → p(戻る)

Screen セッションで現在のウィンドウを強制終了する

Ctrl+A → k

画面の分割

スクリーンでは、ターミナルを複数のウィンドウに分割できます。

f1cbf1258cf0a5a.png

screen 内のコマンドにアクセスするには、Ctrl+A キーを使用します。すべてのコマンドは、このアクセスキー コンボから始める必要があります。

Codelab の説明に厳密に従っている場合は、同じ画面インスタンスに 2 つのウィンドウ(FTD Commissioner、FTD Joiner)が表示されているはずです。2 つの画面に分割するには、まず既存のスクリーン セッションを入力します。

$ screen -r

FTD デバイスにログインしているはずです。画面上で次の手順を行います。

  1. Ctrl+a → S キーを押して、ウィンドウを横方向に分割します
  2. Ctrl+A → Tab キーを押して、新しい空白のウィンドウにカーソルを移動します
  3. Ctrl+A → n キーを押して、新しいウィンドウを次のウィンドウに切り替える
  4. 一番上のウィンドウと同じ場合は、Ctrl+A → n キーをもう一度押して、他の FTD デバイスを表示します。

両方とも表示できるようになりました。切り替えるには Ctrl+A → Tab キーを使います。混乱を避けるため、各ウィンドウのタイトルを Ctrl+a → A に変更することをおすすめします。

上級者向け

画面をさらに象限に分割し、ot-daemon ログと RCP 結合者 ot-ctl を表示するには、同じ Screen インスタンス内でこれらのサービスを開始する必要があります。これを行うには、ot-daemon を停止して ot-ctl を終了し、新しいスクリーン ウィンドウ内で再起動します(Ctrl+A → c)。

この設定は必須ではなく、演習として残しておきます。

以下のウィンドウを使用して、ウィンドウを分割して移動します。

新しいウィンドウを作成

Ctrl+A → c

ウィンドウを垂直に分割

Ctrl+A →

ウィンドウを横に分割

Ctrl+A → S

次の表示されたウィンドウに移動

Ctrl+A → Tab

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

Ctrl+A → n または p

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

Ctrl+A → A

Ctrl+a → d キーを押せば、いつでも画面を離れて、コマンドラインから screen -r で再接続できます。

Screen の詳細については、GNU Screen クイック リファレンスをご覧ください。

7. Thread ネットワークを作成する

すべてのターミナル ウィンドウと画面を構成したので、次に Thread ネットワークを作成します。FTD Commissioner 上で、新しい Operational Dataset を作成して、それをアクティブなデータセットとして commit します。オペレーショナル データセットは、作成する Thread ネットワークの構成です。

## 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 をメモします。

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

> 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)

他の Thread デバイスからスキャンする際に「Codelab」ネットワークが表示されるようになりました。

RCP Joinerot-ctl の情報

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

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

FTD Joiner の 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 列)。これは、スレッド コミッショニングがネットワークでアクティブでないことを意味します。ジョイナー デバイスのネットワーク キーを手動で入力することで、帯域外でも参加できます。

8. RCP 結合者を追加する

作成した Thread ネットワークに、帯域外プロセスを使用して RCP Joiner を追加しましょう。[RCP Joiner] でネットワークをスキャンします。

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

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

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

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

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

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Thread を起動して、RCP Joiner が「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 Commissioner に戻り、ルーターと子の表で、両方のデバイスが同じネットワークに属していることを確認します。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 結合器の ipaddr 出力から取得したメッシュ ローカル アドレス)に ping して接続を確認します。

## 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 の以降の部分では、ネットワークの状態が変わるたびに、新しい Thread のトポロジ図が表示されます。ノードのロールは次のように示されます。

b75a527be4563215.png

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

9. FTD 加入者の紹介

3 つ目の Thread デバイスを「Codelab」ネットワークに追加しましょう。今回は、より安全な帯域内コミッショニング プロセスを使用します。[FTD Joiner] でネットワークをスキャンします。

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

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

J 列の 0 は、デバイスでスレッド コミッショニングがアクティブでないことを示します。

次のデバイスでコミッショニングを行う際の具体例を挙げ、FTD 社員が参加することだけを許可します。引き続き FTD Joiner で eui64 を取得し、FTD Commissioner が識別できるようにします。

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

> eui64
2f57d222545271f1
Done

FTD Commissioner で、Commissioner を起動し、参加できるデバイスの eui64 と、Joiner Credential(例: J01NME)を指定します。Joiner Credential はデバイス固有の文字列で、すべて大文字の英数字(読みやすくするために I、O、Q、Z を除く 0 ~ 9 の数字)で、長さは 6 ~ 32 文字です。

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

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

FTD Joiner に切り替えて、再スキャンします。

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

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

J 列の 1 が示すように、これでスレッド コミッショニングがネットワークでアクティブになります。先ほどの FTD Commissioner に設定した Joiner クルデンシャルを使用して、Joiner の役割を開始します。

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

> ifconfig up
Done
> joiner start J01NME
Done

約 1 分以内に、認証の成功を示す確認メッセージが表示されます。

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

>
Join success

Thread を表示して、FTD Joiner が「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 Commissioner に切り替えて、ルーターと子テーブルを参照し、「codelab」ネットワークに 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 Joiner はエンドデバイス(子)としてネットワークに接続しました。新しいトポロジは次のとおりです。

otcodelab_top01C_ed01.png

10. スレッドの動作

この Codelab の Thread デバイスは、ルーター対応エンドデバイス(REED)と呼ばれる、フルスレッド デバイス(FTD)の一種です。つまり、ルーターまたはエンドデバイスとして機能し、エンドデバイスからルーターに昇格できます。

Thread では最大 32 の Router をサポートできますが、Router の数を 16 から 23 の間に維持しようとします。REED がエンドデバイス(子)として接続し、Router の数が 16 未満の場合、2 分以内にランダムな時間が経過すると、REED は自動的に Router に昇格します。

FTD Joiner を追加した後、Thread ネットワークに子が 2 つある場合は、2 分以上待ってから、FTD Commissioner のルーターと子テーブルを再確認します。

## 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

FTD Joiner(拡張 MAC = e6cdd2d93249a243)が自身をルーターに昇格しました。RLOC16 は異なります(0c02 ではなく b800)。これは、RLOC16 がデバイスのルーター ID と子 ID に基づいているためです。エンドデバイスからルーターに移行すると、そのルーター ID と子 ID の値が変更され、RLOC16 も変更されます。

otcodelab_top01C.png

FTD Joiner で新しいステータスと RLOC16 を確認します。

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

> state
router
Done
> rloc16
b800
Done

FTD 加入者のダウングレード

この動作は、ルーターからエンドデバイスに FTD Joiner を手動でダウングレードすることでテストできます。状態を child に変更し、RLOC16 を確認します。

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

FTD Commissioner に戻ると、FTD Joiner が子テーブルに表示されます(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 の Router に戻ります。

otcodelab_top01C.png

リーダーを削除

リーダーは、すべての Thread Router から自己選出されます。つまり、現在のリーダーが Thread ネットワークから削除された場合、他のいずれかのルーターが新しいリーダーになることになります。

FTD Commissioner 上で、Thread をシャットダウンして Thread ネットワークから削除します。

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

> thread stop
Done
> ifconfig down
Done

2 分以内に FTD Joiner が新しい Thread リーダーになります。FTD Joiner の状態と 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 があることに注意してください。これは RCP 結合器であり、ID と拡張 MAC により示されます。 Thread ネットワークを統合するために、親ルーターが FTD Commissioner から FTD Joiner に切り替えられました。これにより、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

[RCP Joiner] が FTD Joiner に子として接続されるまで、数分かかる場合があります。状態と RLOC16 をチェックして、次の項目を確認します。

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

> state
child
> rloc16
b801

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

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

FTD Commissioner で、Thread を再起動します。

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

> ifconfig up
Done
> thread start
Done

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

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

> state
router
Done

FTD Joiner のルーターと子テーブルで次のことを確認します。

## 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

ここでも、Thread ネットワークは 3 つのノードで構成されています。

11. トラブルシューティング

複数のデバイスやスレッド ウィンドウを使用して、スレッド ネットワークを管理するのは簡単なことではありません。問題が発生した場合は、次のヒントを使用してネットワークまたはワークスペースの状態を「リセット」してください。

画面

設定がわからなくなった場合(画面ウィンドウが多すぎる、または画面内の画面)は、Ctrl+A → K キーで画面ウィンドウを強制終了して、コマンドラインで screen -lsNo Sockets found を出力し続けるようにします。その後、デバイスごとに画面ウィンドウを再作成します。画面が強制終了されても、デバイスの状態は保持されます。

スレッドノード

Thread ネットワーク トポロジがこの Codelab で説明されていない場合、またはなんらかの理由でノードが切断されている場合(おそらく、電力を供給する Linux マシンがスリープ状態になった場合)は、Thread を停止してネットワーク認証情報をクリアし、Thread ネットワークを作成する手順。

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

12. マルチキャストの使用

マルチキャストは、デバイスのグループと一度に情報を伝えるために使用されます。スレッド ネットワークでは、範囲に応じて、特定のアドレスを複数のデバイス グループで使用するマルチキャスト用に予約します。

IPv6 アドレス

スコープ

配信先

ff02::1

リンクローカル

すべての FTD と MED

ff02::2

リンクローカル

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

ff03::1

メッシュ ローカル

すべての FTD と MED

ff03::2

メッシュ ローカル

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

この Codelab ではボーダー ルーターを使用しないため、FTD と MED の 2 つのマルチキャスト アドレスを中心に説明します。

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

FTD Commissioner から ff02::1 に ping します。

## 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 Joiner と RCP Joiner)がありますが、FTD Commissioner の応答は、FTD Joiner のリンクローカル アドレス(LLA)から 1 つしか返されていません。つまり、FTD Joiner は、FTD のコミッショナーがシングル ホップで接続できる唯一のデバイスです。

otcodelab_top02C_02_LL.png

次に、FTD Joiner から ff02::1 に ping を実行します。

## 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 アドレスを調べると、1 つ目(4b1d で終わる)が FTD Commissioner の LLA で、2 つ目(943b で終わる)が RCP Joiner の LLA であることがわかります。

otcodelab_top02C_02_LL02.png

これは、FTD Joiner が FTD Commissioner と RCP Joiner の両方に直接接続され、トポロジが確定されることを意味します。

メッシュ ローカル

メッシュ ローカル スコープは、同じスレッド ネットワーク内で到達可能なすべてのスレッド インターフェースで構成されます。ff03::1 マルチキャスト アドレスへの ping に対するレスポンスを確認してみましょう。

FTD Commissioner から ff03::1 に ping します。

## 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 Commissioner が 2 つの応答を受け取りました。1 つは FTD Joiner のルーティング ロケータ(RLOC、末尾が b800)から、もう 1 つは RCP Joiner のメッシュローカル EID(ML-EID、末尾が d55f)です。これは、メッシュ ローカル スコープが Thread ネットワーク全体を構成するためです。ネットワーク内にデバイスがあるかどうかにかかわらず、デバイスは ff03::1 アドレスに登録されます。

otcodelab_top02C_02_ML.png

FTD Joiner から ff03::1 に ping して、同じ動作を確認します。

## 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 Joiner の応答時間に注意してください。RCP ジョイナーが FTD コミッショナーに到達するまで(68 ミリ秒)よりも、FTD コミッタに到達するまでの時間(68 ミリ秒)よりもはるかに長くなりました。これは、FTD コミッショナーに到達するには 2 ホップが必要であるのに対し、FTD コミッショナーには 1 ホップが必要であるためです。

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

[RCP Joiner] のステータスを確認します。

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

> state
child

13. UDP でメッセージを送信する

OpenThread が提供するアプリケーション サービスの一つに、Transport Layer プロトコルである User Datagram Protocol(UDP)があります。OpenThread 上に構築されたアプリケーションは、UDP API を使用して Thread ネットワーク内のノード間または外部ネットワーク内の他のデバイス(スレッド ネットワークが Border Router を備えている場合はインターネットなど)にメッセージを渡すことができます。

UDP ソケットは OpenThread CLI を通じて公開されます。これを使用して 2 つの FTD 間でメッセージを渡してみましょう。

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

## 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 Commissioner に切り替えて UDP を開始し、ML-EID を使用して FTD Joiner で設定したソケットに接続します。

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

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

UDP 接続は 2 つのノード間で確立されます。FTD Commissioner から次のメッセージを送信します。

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

> udp send hellothere
Done

FTD Joiner で、UDP メッセージを受信しました。

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

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

14. 完了

物理 Thread ネットワークが作成されました。

b915c433e7027cc7.png

ここまでで、

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

次のステップ

この Codelab をベースに、次の演習を試してみましょう。

  • ot-cli-mtd バイナリを使用して FTD Joiner ボードを MTD として再フラッシュし、ルーターにアップグレードしたり、リーダーになったりしないことを確認します。
  • ネットワークにデバイスを追加し(別のプラットフォームを試す)、ルーターと子テーブル、マルチキャスト アドレスへの ping を使用してトポロジをスケッチする
  • pyspinel を使用して NCP を制御する
  • OpenThread Border Router を使用して NCP をボーダールーターに変換し、Thread ネットワークをインターネットに接続する

関連情報

openthread.ioGitHub で、次のようなさまざまな OpenThread リソースをご確認ください。

参考: