1. はじめに

Google の OpenThread(OT)は、Thread のオープンソース実装です。Google は、Google Nest 製品で使用されているネットワーキング技術をデベロッパーがより広く利用できるように OpenThread をリリースしました。これは、スマートホームや商業ビル向けの製品開発を加速させるためです。OpenThread は、プラットフォーム抽象化レイヤが狭く、メモリ フットプリントが小さいため、移植性が非常に高くなっています。システム オン チップ(SoC)とネットワーク コプロセッサ(NCP)の両方の設計をサポートしています。
Thread 仕様では、家庭用および商業ビル用アプリケーション向けの、IPv6 ベースの信頼性が高く安全な低電力のワイヤレス デバイス間通信プロトコルを定義しています。
Silicon Labs は、Silicon Labs のハードウェアで動作するように OpenThread を強化しました。このソースコードは、GitHub で入手できるほか、Simplicity Studio 5(SSv5)とともにインストールされるソフトウェア開発キット(SDK)としても入手できます。SDK には、GitHub ソースコードのテスト済みのスナップショットが含まれています。GitHub バージョンよりも幅広いハードウェアをサポートしており、GitHub では利用できないドキュメントとサンプル アプリケーションが含まれています。
このガイドでは、Silicon Labs OpenThread SDK と Simplicity Studio 5 を使用して OpenThread アプリケーションの開発を開始する方法について説明します。次の画像は、OT Border Router(OTBR)と 2 つの Thread デバイスでセットアップされたボード(BRD)とハードウェアを示しています。これらは、この Codelab で使用されます。

学習内容
- Silicon Labs Simplicity Studio IDE を使用して OpenThread プロジェクトを作成する方法。
- OpenThread CLI バイナリをビルドして Silicon Labs 無線ボードに書き込む方法。
- Docker を使用して Raspberry Pi 3B+ 以降を OpenThread Border Router(OTBR)として設定する方法。
- OTBR で Thread ネットワークを作成する方法。
- デバイスを Thread ネットワークに帯域外でコミッショニングします。
- ping コマンドを使用してノード間の Thread 通信を確認する方法。
2. 前提条件
ハードウェア:
- 3 個の EFR32MGxx 無線ボード - これらのデバイスの任意の組み合わせを使用できます。この Codelab では、RCP として BRD4166A を、Full Thread Device として 2 つの BRD4168A を使用します。
- EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
- EFR32MG13(BRD4168A)
- EFR32MG21(BRD4180A、BRD4180B)
- BRD4001A: 無線スターター メインボード(WSTK)で無線ボードをホストします。BRD4166A を除くすべての無線ボードには、それぞれスターター メインボードが必要です。メインボードの接続と電源供給用の Mini USB ケーブル、または BRD4166A 用のマイクロ USB ケーブル。

- イーサネット経由でインターネットに接続された Raspberry Pi 3B+ 以降と、Raspbian Stretch Lite OS イメージまたは Raspbian Stretch with Desktop。これは OT Border Router として構成します。
- 少なくとも 2 つの USB ポートとインターネット接続を備えた Windows/Linux/Mac ホスト システム。SSv5 でハードウェアと OS の要件を確認します。
- Raspberry Pi をインターネットに接続するためのイーサネット ケーブル(1 本以上)。WSTK は IP 経由のデバッグとフラッシュもサポートしているため、必要に応じて、追加のイーサネット ケーブルを使用して WSTK をイーサネット スイッチ経由でホストシステムに接続できます。
ソフトウェア:
- Windows/Linux/Mac ホスト システムに Simplicity Studio v5 がインストールされ、更新されていること。
- GNU ARM ツールチェーン
- Gecko SDK Suite 3.2.0 以降と Silicon Labs OpenThread SDK。
3. ハードウェアのセットアップ
この Codelab は、
- 左図の EFR32MG12 BRD4166A Thunderboard Sense 2。
- 右図に示す 2 つの EFR32MG13 BRD4168A。
- macOS Catalina 10.15.7 にインストールされた Simplicity Studio v5(
- Gecko SDK 3.2.0
- GNU ARM v7.2.1


下の図に示すように、各ワイヤレス スターター キットのメインボードを USB 経由でホスト コンピュータに接続します。これらの接続により、RCP とエンドデバイスのプログラミングとネットワーク分析が可能になります。まず、ホスト コンピュータを使用して ot-rcp ファームウェアで BRD4166A をプログラミングし、最終的に Raspberry Pi に接続します。必要に応じて、エンドデバイスを共通のイーサネット スイッチ経由でホスト コンピュータに接続できます。スターター キットは、IPv4 経由のプログラミングとネットワーク分析もサポートしています。

4. ファームウェアのセットアップ
開始するには 2 つの方法があります。どちらのオプションでも、この Codelab に必要なファームウェアをフラッシュできます。
- プロジェクト: (推奨)サンプル アプリケーションを作成、ビルド、フラッシュします。このオプションを使用すると、プロジェクト内のアプリケーションをカスタマイズできます。
- デモ: (省略可)サンプル アプリケーションのいずれかで、ラジオボードにプリビルド デモを直接書き込みます。ユーザーは、オプションの演習としてデモ ファームウェアのセットアップを試すことをおすすめします。詳しくは、この Codelab の最後にある「オプションのファームウェア設定 - デモ」セクションをご覧ください。
この Codelab では、プロジェクト ベースの方法を使用します。
例を使用してプロジェクトを作成する
2 つのプロジェクトを作成します。BRD4166A の ot-rcp プロジェクトと、2 つの BRD4168A の ot-cli-ftd プロジェクト。以下の手順に沿って、ボードに適したサンプル アプリケーションを選択してください。
- Studio の [File] メニューを開き、[New] > [Silicon Labs Project Wizard] を選択します。[Target, SDK, and Toolchain Selection] ダイアログが開きます。OpenThread でサポートされているデフォルトの Simplicity IDE / GNU ツールチェーンは変更しないでください。[次へ] をクリックします。
- ターゲット ボード: 選択したラジオ ボード(BRD4168A)とメインボード(BRD4001A)が表示されます。
- Target Device: このフィールドには、オンボードのマイクロコントローラ チップ(MCU)が表示されます。BRD4168A には EFR32MG13 MCU が搭載されています。
- SDK: ここでは、使用している OT の SDK バージョンを選択できます。スイート情報には、SDK タグと Silicon Labs の OpenThread ビルド(
Platform 4.0.1.0やOpenThread 2.0.1.0 (GitHub-55af6ce2c)など)が含まれます。 - IDE/ ツールチェーン: OT プロジェクトのコンパイルに使用されるツールチェーン。GNU ARM を使用します。

- [Example Project Selection] ダイアログが開きます。サンプル プロジェクトのリストが表示されます。Thread テクノロジー タイプとキーワード フィルタを使用して、特定の例を検索します。Gecko SDK Suite のバージョン番号をメモしておいてください。このバージョン タグは、Raspberry Pi をボーダー ルーターとして設定するときに必要になります。[ot-cli-ftd] を選択して、[NEXT] をクリックします。

- [プロジェクト構成] ダイアログが開きます。ここでは、プロジェクトの名前を変更したり、デフォルトのプロジェクト ファイルの場所を変更したり、プロジェクト ファイルをリンクするかコピーするかを決定したりできます。リンクされたプロジェクト ファイルは SDK を指し、変更を行うと、その変更は SDK で行われ、今後のプロジェクトで使用されます。プロジェクトのソースをコピーすると、プロジェクトのローカルコピーを編集できるため、SDK ファイルはそのまま残ります。デフォルトは [Link sdk and copy project sources] で、これをおすすめします。[完了] をクリックします。

- Simplicity IDE パースペクティブが開き、プロジェクト コンフィギュレータの [OVERVIEW] タブが開きます。

プロジェクトは、[ソフトウェア コンポーネント] タブで、コンポーネントのインストールとアンインストール、インストールされたコンポーネントの構成を行うことで構成されます。インストールされているコンポーネントがチェックされます。[インストール済みコンポーネント] をクリックすると、サンプル アプリケーションによってインストールされたコンポーネントのフィルタされたリストが表示されます。変更は自動的に保存され、プロジェクト ファイルは自動的に生成されます。進行状況は、Simplicity IDE パースペクティブの右下に表示されます。

このデモでは、サンプル アプリケーションのデフォルト構成を使用します。上記の手順を繰り返して、他のボードの ot-rcp プロジェクトを作成します。
プロジェクトをビルドしてフラッシュする
ot-rcp プロジェクトと ot-cli-ftd プロジェクトの両方をビルドしてフラッシュします。
- プロジェクトを構成したら、上部のツールバーにある [ビルド制御(ハンマーアイコン)] をクリックします。または、プロジェクトを右クリックして [ビルド プロジェクト] をクリックすることもできます。
![[プロジェクトをビルド] ボタン](https://openthread.io/codelabs/silabs-openthread-hardware/img/build_button.png?hl=ja)
- 進行状況は、コンソールと右下の進行状況バーに表示されます。プロジェクトに関連するエラーや警告も、この出力ウィンドウに表示されます。

- バイナリ イメージは、プロジェクトのビルドが成功した後に生成されます。バイナリ イメージは、プロジェクト エクスプローラ ビューから書き込むことができます。コンパイラのサブディレクトリで .bin、.hex、.s37 ファイルを見つけます。ファイルを右クリックして、[Flash to Device] を選択します。複数のデバイスが接続されている場合は、プログラムするデバイスを選択し、[OK] をクリックします。ファイルパスが入力された状態で Flash Programmer が開きます。[プログラム] をクリックします。

5. ファームウェアの設定の概要
この時点で、無線ボードに適切なファームウェアを作成、コンパイル、書き込みしているはずです。ot-rcp を BRD4166A に書き込んだら、ホストシステムから切断し、このボードを Raspberry Pi に接続します。
このセクションを完了すると、Thread ネットワークのハードウェア セットアップは次のようになります。

6. ot-cli-ftd デバイスのシリアル コンソールを設定する
コンソール インターフェースを起動するには、Simplicity IDE パースペクティブの [Devices View] / [Debug Adapters Window] で J-Link デバイスを右クリックします。[Launch Console] を選択します。コンソールでプロンプトを表示するには、[Serial 1] タブを選択して Enter キーを押します。FTD ノードの状態を確認します。

ot-rcp のコンソールはまだありません。次のステップでは、Raspberry Pi を OT ボーダー ルーターとして構成し、ot-rcp のコンソールを設定します。
7. Raspberry Pi をボーダー ルーターとして設定する
Silicon Labs は、OTBR を使用して同社の Docker コンテナをデプロイすることを推奨しています。コンテナで OTBR を実行すると、簡単にデプロイできるアーティファクトを作成でき、迅速な開発プロトタイピングとテストが可能になります。
Silicon Labs OTBR イメージは、タグ付きで siliconlabsinc DockerHub でホストされています。各タグは GSDK バージョンに対応しています。
https://hub.docker.com/r/siliconlabsinc/openthread-border-router/tags
Docker コンテナは、特定のリリース用に Simplicity Studio 5 を使用してビルドされた RCP で使用する必要があります。コンテナタグのバージョンを、テストに使用する GSDK のバージョンと一致させてください。たとえば、[Example Project Selection] ウィンドウで ot-rcp を選択したときに GDSK バージョンが Gecko SDK Suite v4.0.1 (140) であった場合は、siliconlabsinc/openthread-border-router:gsdk-4.0.1 イメージを使用します。

Raspberry Pi のセットアップ
- SD カードに Raspbian Stretch Lite OS イメージまたは Raspbian Stretch with Desktop を書き込んでください。
- Raspberry Pi に SSH 接続するか、Raspbian Desktop を直接操作するかを選択できます。ターミナルを開きます。
- Docker をインストールする前に、ローカル リポジトリとパッケージ マネージャー(apt-get update と apt-get upgrade)を更新してください。
Docker イメージをインストールする
- RPi で次のコマンドを使用して Docker をインストールします。
curl -sSL https://get.docker.com | sh
- 完了したら、Docker ユーザー設定を変更して、各コマンドの前に sudo を必要としないようにすることができます。再起動が必要です。
sudo usermod -aG docker $USER
- 次のコマンドを実行してコンテナをインストールします。RCP で一度に実行できるボーダー ルーター コンテナは 1 つだけです。また、Simplicity Studio GSDK のバージョンが正しい Docker イメージと一致していることを確認してください。たとえば、
gsdk-4.0.1は以下のようになります。docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
Docker を構成して実行する
- OTBR で使用する TTY ポートを構成して、起動時に RCP を接続する必要があります。RCP デバイスの TTY ポートを探します。最も簡単な方法は、RCP が接続されたら
/tty/dev... エントリを探すことです。通常は/dev/ttyUSB0または/dev/ttyACM0のいずれかになります。 - 次のコマンドを使用して Docker インストールを実行します。Docker イメージ名を一致する GSDK バージョンに置き換えてください。例:
gsdk-4.0.1docker run -d --name "otbr" \ --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \ -p 8080:80 --dns=127.0.0.1 -it \ --volume /dev/ttyACM0:/dev/ttyACM0 \ --privileged siliconlabsinc/openthread-border-router:gsdk-4.0.1 \ --radio-url spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800 \ --backbone-interface eth0
-dは、コンテナがデタッチモードで実行されるようにします。docker logsコマンドを使用すると、コンテナの実行ログをいつでも確認できます。--nameは、Docker コンテナが適切に閉じられる(または削除される)まで保持されます。- ポート 8080 は、ボーダー ルーターの管理ウェブページをホストするウェブサーバーのポートを示します。
?uart-baudrate=460800は、長い IPv6 パケットでの DTLS などのコストの高いオペレーションで、UART を介したフラグメンテーション / 再アセンブリの問題を回避するために、ラジオ URL オプションで必要です。
RCP ノードを操作する
docker が実行されたら、次のコマンドを使用してインタラクティブ シェル経由で RCP ノードと通信できます。RCP ノードの状態を確認します。
$ docker exec -ti otbr sh -c "sudo ot-ctl" > state disabled Done
実行中のコンテナ ID のリストを取得できます。
$ docker ps -aq
OTBR Docker コンテナを実行しているウィンドウで、ボーダー ルーターの実行ログ出力を確認するか、次のようにコンテナログを追跡できます。
$ docker logs [container-id] -f
必要に応じて、Docker コンテナが正しく読み込まれたら、イメージを停止、削除、強制終了できます。
$ docker stop otbr
$ docker rm otbr
$ docker kill otbr
省略可: シェルを終了するには、Ctrl+C キーを押します。
この時点で、3 つのコンソールが表示されます。
- Simplicity Studio の 2 つの
ot-cli-ftdコンソール(Full Thread デバイスとしてセットアップされている)。 - OT ボーダー ルーターとして設定された Raspberry Pi 上の 1 つの
ot-ctlインタラクティブ シェル。
これで、Thread ネットワークを形成する準備が整いました。
8. Thread ネットワークを作成する
RCP を設定する
ネットワークを作成するには、まず OTBR の ot-ctl シェルを使用して RCP ノードと通信します。次のコマンドを次の順序で入力します。
インデックス | コマンド | コマンドの説明 | 想定される回答 | ||
1 |
| 新しいネットワーク構成を作成します。 | 完了 | ||
2 |
| 新しいデータセットをアクティブな運用データセットに commit します。 | 完了 | ||
3 |
| Thread インターフェースを有効にします。 | 完了 | ||
4 |
| Thread プロトコル オペレーションを有効にしてアタッチします。 | 完了 | ||
スレッド インターフェースが起動するまで 10 秒待ちます。 | |||||
5 |
| デバイスの状態を確認します。リーダーである必要があります。 | リーダー | ||
6 |
| ネットワーク構成を表示します。 | Active Timestamp: 1 | ||
ot-cli-ftd のチャンネル番号とネットワーク キーを使用して、2 つの FTD をこのスレッド ネットワークに参加させます。
FTD を Thread ネットワークに設定して追加する(アウトオブバンド方式)
アウトオブバンド方式では、すべてのセキュリティ情報を把握し、ノードを手動で追加します。Simplicity コンソールで、次のコマンドを次の順序で使用して、両方の FTD をネットワークに追加します。
インデックス | コマンド | コマンドの説明 | 想定される回答 | ||
1 |
| OTBR で使用されるチャネルを設定します。 | 完了 | ||
2 |
| デバイスが Thread ネットワークに接続するには、ネットワーク キーのみが必要です。 | 完了 | ||
3 |
| 新しいデータセットをアクティブな運用データセットに commit します。 | 完了 | ||
4 |
| Thread インターフェースを有効にします。 | 完了 | ||
5 |
| Thread プロトコル オペレーションを有効にしてアタッチします。 | 完了 | ||
デバイスが参加して構成されるまで 20 秒ほど待ちます。 | |||||
6 |
| ネットワーク構成を表示します。 | child | ||
Thread デバイス間の通信
ping コマンドを使用して、デバイスが相互に通信できるかどうかを確認します。ping コマンドを使用するには、デバイスの IPv6 アドレスが必要です。これらは ipaddr コマンドを使用して取得できます。
> ipaddr fd5c:c6b:3a17:40b9:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd5c:c6b:3a17:40b9:0:ff:fe00:1800 # Routing Locator (RLOC) fd5c:c6b:3a17:40b9:84e2:bae8:bd5b:fa03 # Mesh-Local EID (ML-EID) fe80:0:0:0:c449:ca4a:101f:5d16 # Link-Local Address (LLA)
両方の FTD から、OTBR の RLOC アドレスを使用して OTBR に ping を送信します。
> ping fd5c:c6b:3a17:40b9:0:ff:fe00:1800 Done > > 16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=30ms 16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=52ms
レスポンスは、受信したペイロードと通信が成功したことを示します。同じ手順で、OTBR から FTD に ping を送信します。
9. 完了
Thread ネットワークが作成されました。
これで、次のことがわかりました。
- Silicon Labs Simplicity Studio IDE を使用して OpenThread プロジェクトを作成する方法。
- OpenThread CLI バイナリをビルドして Silicon Labs 無線ボードに書き込む方法。
- Docker を使用して Raspberry Pi 3B+ 以降を OpenThread Border Router(OTBR)として設定する方法。
- OTBR で Thread ネットワークを作成する方法。
- デバイスを Thread ネットワークに帯域外でコミッショニングします。
- ping コマンドを使用してノード間の Thread 通信を確認する方法。
関連情報
openthread.io と GitHub で、次のようなさまざまな OpenThread リソースをご確認ください。
- 対応プラットフォーム - OpenThread をサポートするすべてのプラットフォームを確認する
- OpenThread をビルドする - OpenThread のビルドと構成に関する詳細
- Thread の入門 - この Codelab で取り上げられている Thread のコンセプトをすべて説明しています
- Silicon Labs OpenThread トレーニング - OpenThread の概要、コミッショニングとボーダー ルーターの説明、OpenThread ネットワークの作成に関するハンズオン演習。
- QSG170: Silicon Labs OpenThread クイック スタートガイド - Silicon Labs Thread 開発のスタートガイドについて詳しく説明しています。
- AN1256: OpenThread Border Router で Silicon Labs RCP を使用する - Raspberry Pi Border Router ホストのビルドとインストール手順
10. ファームウェアのオプション設定 - デモ
デモは、互換性のあるデバイスにダウンロードできるビルド済みのファームウェア イメージです。Simplicity Studio でデモが利用可能かどうかを最も簡単に確認するには、[Debug Adapters] ビューでパーツをクリックし、Launcher Perspective の [EXAMPLE PROJECTS & DEMOS] タブに移動します。[Example Projects] フィルタを無効にし、[Technology Type] の [Thread] ラジオ チェックボックスをオンにします。

OpenThread SDK で提供されるコンパイル済みデモ アプリケーション イメージは、次のボードと互換性があります。
- BRD4161a
- BRD4166a
- BRD4168a
- BRD4180a
- BRD4304a
このリストは、今後の SDK リリースで更新され、より多くの無線ボードが含まれる可能性があります。サポートされているパーツの完全なリストについては、ドキュメントの Silicon Labs OpenThread SDK リリースノートをご覧ください。
それぞれのボードで次のデモをフラッシュします。フラッシュするには、左側の [Debug Adapters] でボードを選択し、対応するサンプル アプリケーションの [RUN] をクリックします。ポップアップ ウィンドウにフラッシュの進行状況が表示されます。
- BRD4166A: ot-rcp - このデバイスは、OT ボーダー ルーターの無線コプロセッサとして機能します。このデバイスを使用して Thread ネットワークを作成し、他の 2 つのデバイスを Thread ネットワークにオンボーディングします。ボーダー ルーターであるこのデバイスは、Thread ネットワーク内のデバイスがインターネット経由で通信するためのゲートウェイとしても機能します。
- 2 台の BRD4168A: ot-cli-ftd - この 2 台のデバイスは Full Thread Device として機能します。OTBR によって作成された Thread ネットワークに接続します。