1. はじめに
Google の OpenThread(OT)は、Thread のオープンソース実装です。Google は、Google Nest 製品で使用されているネットワーキング テクノロジーをデベロッパーがさらに幅広く利用できるようにするために、Google が OpenThread をリリースしました。これは、コネクテッド ホームおよび商用ビル向けの製品開発を加速するためです。プラットフォームの抽象化レイヤが狭く、メモリ フットプリントが小さいため、OpenThread は移植性が高くなっています。システム オン チップ(SoC)とネットワーク コプロセッサ(NCP)の両方に対応しています。
スレッド仕様は、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)と、Codelab で使用される 2 つの Thread デバイスを備えたボード(BRD)とハードウェアを示しています。
学習内容
- Silicon Labs の Simplicity Studio IDE を使用して OpenThread プロジェクトを作成する方法。
- OpenThread CLI バイナリをビルドして、Silicon Labs の無線ボードにフラッシュする方法。
- Docker を使用して OpenThread ボーダー ルーター(OTBR)として Raspberry Pi 3B 以降をセットアップする方法。
- OTBR にスレッド ネットワークを作成する方法。
- Thread ネットワーク上での帯域外コミッショニング
- ping コマンドを使用してノード間のスレッド通信を確認する方法。
2. 前提条件
ハードウェア:
- 3 EFR32MGxx 無線ボード - これらのデバイスの任意の組み合わせを使用できます。この Codelab では、RCP として BRD4166A を使用し、フルスレッド デバイスとして 2 つの BRD4168A を使用します。
- EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
- EFR32MG13(BRD4168A)
- EFR32MG21(BRD4180A、BRD4180B)
- BRD4001A: 無線ボードをホストするワイヤレス スターター メインボード(WSTK)。BRD4166A を除くすべてのラジオボードには、それぞれスターター メインボードが必要です。メインボードの接続用のミニ USB ケーブルや、BRD4166A 用のマイクロ USB ケーブル。
- Raspbian Stretch Lite OS イメージを含む Raspberry Pi 3B 以降、またはイーサネット経由でインターネットに接続している Raspbian Stretch with Desktop。これは、OT 境界ルーターとして構成されています。
- 少なくとも 2 つの USB ポートとインターネット接続を備えた Windows、Linux、Mac ホストシステム。SSv5 でハードウェアと OS の要件を確認してください。
- Raspberry Pi をインターネットに接続するためのイーサネット ケーブル 1 本以上 WSTK はデバッグや IP 経由のフラッシュもサポートしているため、必要に応じて追加のイーサネット ケーブルを使用してイーサネット スイッチ経由でホスト システムに WSTK を接続することもできます。
ソフトウェア:
- Simplicity Studio v5 が Windows/Linux/Mac Host システムにインストールされ、以下のコマンドで更新されています
- 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 つ作成します。2 つの BRD4166A の ot-rcp
プロジェクトと 2 つの BRD4168A の ot-cli-ftd
プロジェクト。以下の手順に沿って、ボードに適したサンプル アプリケーションを選択してください。
- Studio の [File] メニューを開き、[New] > [Silicon Labs Project Wizard] を選択します。[ターゲット、SDK、ツールチェーンの選択] ダイアログが開きます。OpenThread でサポートされているデフォルトの Simplicity IDE / GNU ツールチェーンを変更しないでください。[次へ] をクリックします。
- ターゲット ボード: 選択したラジオボード(BRD4168A)とメインボード(BRD4001A)が表示されます。
- Target Device: このフィールドには、搭載されているマイクロコントローラ チップ(MCU)が表示されます。BRD4168A には EFR32MG13 MCU が搭載されています。
- SDK: 作業する OT の SDK バージョンを選択できます。スイート情報には、SDK タグと、OpenThread の Silicon Labs ビルド(
Platform 4.0.1.0
、OpenThread 2.0.1.0 (GitHub-55af6ce2c)
など)が含まれます。 - IDE/ ツールチェーン: OT プロジェクトのコンパイルに使用するツールチェーン。GNU ARM を使用しています。
- [Example Project Selection] ダイアログが開きます。Example プロジェクトのリストが表示されます。[Thread] テクノロジー タイプとキーワード フィルタを使用して、特定の例を検索します。Gecko SDK Suite のバージョン番号をメモしておきます。Raspberry Pi をボーダー ルーターとして設定する場合は、このバージョンタグが必要です。[ot-cli-ftd] を選択し、[次へ] をクリックします。
- [プロジェクトの設定] ダイアログが開きます。ここでプロジェクトの名前を変更したり、デフォルトのプロジェクト ファイルの場所を変更したり、プロジェクト ファイルをリンクするか、コピーするかを決定できます。リンクされたプロジェクト ファイルは SDK を指し、変更を加えた場合は SDK で行われ、今後のプロジェクトで使用されます。プロジェクトのソースをコピーすると、SDK ファイルはそのままにして、プロジェクトのローカルコピーを編集できます。デフォルトは [Link sdk and Copy project sources] です。[完了] をクリックします。
- シンプルな IDE パースペクティブが開き、[Project Configurator] の [概要] タブが表示されます。
このプロジェクトは [Software Components] タブから設定します。コンポーネントのインストールとアンインストールを行い、インストール済みのコンポーネントを設定します。インストール済みのコンポーネントがチェックされている。[インストール済みのコンポーネント] をクリックすると、サンプル アプリケーションによってインストールされたフィルタ済みコンポーネントのリストが表示されます。変更内容はすべて自動的に保存され、プロジェクト ファイルが自動生成されます。進行状況は、Simplicity IDE パースペクティブの右下に表示されます。
このデモでは、サンプル アプリケーションのデフォルトの構成を使います。上記の手順を繰り返して、他のボードの ot-rcp
プロジェクトを作成します。
プロジェクトをビルドしてフラッシュする
ot-rcp
プロジェクトと ot-cli-ftd
プロジェクトの両方をビルドしてフラッシュします。
- プロジェクトを設定したら、上部のツールバーにあるビルド コントロール(ハンマー アイコン)をクリックします。または、プロジェクトを右クリックして [Build Project] をクリックします。
- 進捗状況は Console に表示され、進行状況バーは右下に表示されます。プロジェクトに関連するエラーや警告も、この出力ウィンドウに表示されます。
- バイナリ イメージは、プロジェクトのビルドが成功すると生成されます。プロジェクト エクスプローラ ビューからバイナリ イメージをフラッシュできます。コンパイラのサブディレクトリで .bin、.hex、.s37 ファイルを見つけます。ファイルを右クリックし、[Flash からデバイス] を選択します。複数のデバイスが接続されている場合、プログラミングするデバイスを選択して、[OK] をクリックします。Flash Programmer が開き、設定されたファイルパスが表示されます。[プログラム] をクリックします。
5. ファームウェア設定の概要
この時点で、無線基板上で適切なファームウェアを作成、コンパイル、フラッシュしたはずです。ot-rcp
が BRD4166A にフラッシュされたら、ホストシステムから取り外し、このボードを Raspberry Pi に接続します。
このセクションを完了すると、Thread ネットワークのハードウェア設定は次のようになります。
6. ot-cli-ftd デバイス用のシリアル コンソールの設定
コンソール インターフェースを起動するには、[SVIEWYY IDE] ビューで、[Devices] / [Debug Adapters] ウィンドウの J-Link デバイスを右クリックします。[コンソールを起動] を選択します。Console でプロンプトを表示するには、[シリアル 1] タブを選択して、Enter キーを押します。FTD ノードの状態を確認します。
ot-rcp
のコンソールがまだありません。次のステップでは、Raspberry Pi を OT 境界ルーターとして構成し、ot-rcp
のコンソールを設定します。
7. Raspberry Pi を境界ルーターとして設定する
SBR では、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 をフラッシュします。
- SSH で Raspberry Pi に接続するか、Raspbian Desktop を直接操作することができます。ターミナルを開きます。
- ローカル リポジトリとパッケージ マネージャーを必ず更新してください(Docker をインストールする前に、apt-get update と apt-get upgrade)。
Docker イメージをインストールする
- 次のコマンドを使用して、RPi に Docker をインストールします。
curl -sSL https://get.docker.com | sh
- 完了したら、各コマンドの前に sudo を要求しないように Docker ユーザー設定を変更できます。再起動が必要です。
sudo usermod -aG docker $USER
- 次のコマンドを実行して、コンテナをインストールします。RCP で一度に実行できる Border Router コンテナは 1 つだけです。また、Simplicity Studio GSDK のバージョンと正しい Docker イメージを一致させてください。例:
gsdk-4.0.1
:docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
Docker を構成して実行する
- 起動時に RCP を接続するため、OTBR に使用する TTY ポートを構成する必要があります。RCP デバイスの TTY ポートを探します。これを行う最も簡単な方法は、RCP が接続された後に
/tty/dev
... エントリを見つけることです。通常は、/dev/ttyUSB0
または/dev/ttyACM0
になります。 - 次のコマンドを使用して Docker のインストールを実行します。Docker イメージ名は、一致する GSDK バージョンに置き換えてください。例:
gsdk-4.0.1
docker 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 は、Border Router の管理ウェブページをホストするウェブサーバーのポートを示します。
- 無線 URL のオプションに
?uart-baudrate=460800
が必要です。UART を介した断片化や再構成の問題を回避し、IPv6 パケットに長い DTLS などの負荷の高いオペレーションが必要になります。
RCP ノードとのやり取り
Docker の実行が開始されたら、次のコマンドでインタラクティブ シェルを介して RCP ノードと通信できます。RCP ノードの状態を確認します。
$ docker exec -ti otbr sh -c "sudo ot-ctl" > state disabled Done
実行中のコンテナ ID のリストを取得できます
$ docker ps -aq
Border Router のログ出力を実行している OTBR Docker コンテナを実行しているウィンドウを確認するか、コンテナログを次のように追跡します。
$ docker logs [container-id] -f
オプションで、Docker コンテナが適切に読み込まれている場合は、イメージを停止、削除、強制終了できます。
$ docker stop otbr
$ docker rm otbr
$ docker kill otbr
(省略可)シェルを終了するには、CNT+C を使用します。
この時点で、3 つのコンソールが作成されています。
- Simplicity Studio で、フルスレッド デバイスとして設定されている 2 つの
ot-cli-ftd
コンソール。 - OT 境界ルーターとしてセットアップされている Raspberry Pi 上の
ot-ctl
インタラクティブ シェル 1 つ。
これで、Thread ネットワークから形成できるようになりました。
8. スレッド ネットワークを作成する
RCP の設定
ネットワークを作成するには、RBR ノードとの通信に使用する OTBR の ot-ctl
シェルを使用します。次のコマンドをこの順序で入力します。
Index | コマンド | コマンドの説明 | 予想される回答 | ||
1 |
| 新しいネットワーク設定を作成する。 | 完了 | ||
2 |
| 新しいデータセットをアクティブな運用データセットに commit します。 | 完了 | ||
3 |
| スレッド インターフェースを有効にします。 | 完了 | ||
4 |
| スレッド プロトコル オペレーションを有効にしてアタッチする。 | 完了 | ||
スレッド インターフェースが起動するまで 10 秒ほど待ちます。 | |||||
5 |
| デバイスの状態を確認します。リーダーである必要があります。 | リーダー | ||
6 |
| ネットワーク構成を表示します。 | アクティブなタイムスタンプ: 1 |
ot-cli-ftd
のチャンネル番号とネットワーク キーを使用して、2 つの FTD をこのスレッド ネットワークに結合します。
スレッド ネットワークに FTD を設定して追加する(帯域外メソッド)
帯域外方式では、すべてのセキュリティ情報がわかっているため、ノードを手動で追加します。シンプル コンソールでは、以下のコマンドを以下の順序で使用して、両方の FTD をネットワークに追加します。
Index | コマンド | コマンドの説明 | 予想される回答 | ||
1 |
| OTBR が使用するチャンネルを設定します。 | 完了 | ||
2 |
| デバイスが Thread ネットワークに接続するには、ネットワーク キーのみが必要です。 | 完了 | ||
3 |
| 新しいデータセットをアクティブな運用データセットに commit します。 | 完了 | ||
4 |
| スレッド インターフェースを有効にします。 | 完了 | ||
5 |
| スレッド プロトコル オペレーションを有効にしてアタッチする。 | 完了 | ||
デバイスが参加して構成されるまで、20 秒ほど待ちます。 | |||||
6 |
| ネットワーク構成を表示します。 | child |
スレッド デバイス間の通信
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 を使用して OpenThread ボーダー ルーター(OTBR)として Raspberry Pi 3B 以降をセットアップする方法。
- OTBR にスレッド ネットワークを作成する方法。
- Thread ネットワーク上での帯域外コミッショニング
- ping コマンドを使用してノード間のスレッド通信を確認する方法。
関連情報
openthread.io と GitHub で、次のようなさまざまな OpenThread リソースをご確認ください。
- サポートされているプラットフォーム - OpenThread をサポートするすべてのプラットフォームを確認します。
- OpenThread のビルド - OpenThread のビルドと構成の詳細
- Thread Primer - この Codelab で取り上げる Thread のコンセプトをすべてカバーします。
- Silicon Labs OpenThread トレーニング - OpenThread の概要。OpenThread ネットワークの作成に関するコミッショニングとボーダー ルーターについて取り上げ、実践演習を行います。
- QSG170: Silicon Labs OpenThread クイック スタートガイド - Silicon Labs の Thread 開発の開始プロセスについて詳しく説明します。
- AN1256: OpenThread 境界ルーターでの Silicon Labs RCP の使用 - Raspberry Pi 境界ルーター ホストの構築とインストールの手順
10. オプションのファームウェア設定 - デモ
デモは、互換性のあるデバイスにダウンロードできるビルド済みファームウェア イメージです。Simplicity Studio で自分の役割のデモが利用可能かどうかを確認するには、Debug Adapter ビューで自分のパーツをクリックし、ランチャーの [EXAMPLE PROJECTS & DEMOS] タブに移動すると簡単です。[Example Projects] フィルタを無効にし、[テクノロジーの種類] の下にある [Thread] チェックボックスにチェックを入れます。
OpenThread SDK に付属するプリコンパイル済みデモ アプリケーションのイメージは、以下のボードと互換性があります。
- BRD4161A
- BRD4166A
- BRD4168A
- BRD4180A
- BRD4304A
このリストは、今後の SDK リリースで更新され、ラジオボードが追加される可能性があります。サポート対象の部品の全一覧については、ドキュメントの「Silicon Labs OpenThread SDK リリースノート」をご覧ください。
それぞれのボードで、次のデモをフラッシュします。フラッシュするには、左側の [Debug Adapters] でボードを選択し、対応するサンプル アプリケーションの [RUN] をクリックします。ポップアップ ウィンドウにフラッシュの進行状況が表示されます。
- BRD4166A: ot-rcp - このデバイスは、OT 境界ルーターへの無線 Co プロセッサとして機能します。このデバイスを使用して Thread ネットワークを作成し、他の 2 台のデバイスを Thread ネットワークにオンボーディングします。このデバイスは Border Router として、Thread ネットワーク内のデバイスがインターネット経由で通信するためのゲートウェイとしても機能します。
- 2 つの BRD4168A: ot-cli-ftd - これら 2 つのデバイスはフルスレッド デバイスとして機能します。OTBR によって作成された Thread ネットワークに加わります。