1. はじめに
Google の OpenThread(OT)は、Thread のオープンソース実装です。Google は、Google Nest 製品で使用されているネットワーキング テクノロジーをデベロッパーがより広く利用できるようにし、スマートホームや商用ビル向けの製品開発を加速させるため、OpenThread をリリースしました。狭いプラットフォーム抽象化レイヤと小さなメモリ使用量の OpenThread は、優れたポータビリティを備えています。システム オン チップ(SoC)とネットワーク コプロセッサ(NCP)の両方の設計をサポートしています。
Thread Specification は、家庭用および商業用ビルの用途向けに、IPv6 ベースの信頼性、安全性、省電力のワイヤレス デバイス間通信プロトコルを定義しています。
Silicon Labs は、Silicon Labs ハードウェアと連携するように OpenThread を強化しました。このソースコードは GitHub で入手できます。また、Simply Studio 5(SSv5)とともにインストールされるソフトウェア開発キット(SDK)としても入手できます。SDK には、完全にテストされた GitHub ソースコードのスナップショットが含まれています。GitHub バージョンよりも幅広いハードウェアをサポートしており、GitHub では利用できないドキュメントやサンプル アプリケーションが含まれています。
このガイドでは、Silicon Labs OpenThread SDK と Simply Studio 5 を使用して OpenThread アプリケーションの開発を開始する方法について説明します。以下の画像は、この Codelab で使用する OT ボーダー ルーター(OTBR)と 2 つの Thread デバイスがセットアップされたボード(BRD)とハードウェアを示しています。
学習内容
- Silicon Labs Simply Studio IDE を使用して OpenThread プロジェクトを作成する方法
- OpenThread CLI バイナリをビルドして Silicon Labs 無線ボードにフラッシュする方法
- Docker を使用して Raspberry Pi 3B 以降を OpenThread ボーダー ルーター(OTBR)として設定する方法
- OTBR で Thread ネットワークを作成する方法
- Thread ネットワークへのデバイスの帯域外コミッショニング。
- ping コマンドを使用してノード間の Thread 通信を確認する方法
2. 前提条件
ハードウェア:
- 3 個の EFR32MGxx 無線ボード - これらのデバイスの任意の組み合わせを使用できます。この Codelab では、RCP として BRD4166A を使用し、フルスレッド デバイスとして 2 つの BRD4168A を使用します。
- EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
- EFR32MG13(BRD 4168A)
- EFR32MG21(BRD4180A、BRD4180B)
- BRD4001A: 無線通信ボードをホストするワイヤレス スターター メインボード(WSTK)。BRD4166A を除くすべてのラジオボードに、それぞれスターター メインボードが必要です。メインボードに接続して給電するためのミニ USB ケーブル、または BRD4166A 用のマイクロ USB ケーブル。
- イーサネット経由でインターネットに接続されている Raspbian Stretch Lite OS イメージまたは Raspbian Stretch with Desktop を搭載した Raspberry Pi 3B 以降。これは OT ボーダー・ルーターとして構成します。
- 2 つ以上の USB ポートとインターネット接続を備えた Windows/Linux/Mac ホストシステム。SSv5 でハードウェアと OS の要件を確認します。
- Raspberry Pi をインターネットに接続するための 1 つ以上のイーサネット ケーブル。WSTK は IP 経由のデバッグとフラッシュもサポートしているため、必要に応じて追加のイーサネット ケーブルを使用して、イーサネット スイッチ経由で WSTK をホストシステムに接続できます。
ソフトウェア:
- Windows/Linux/Mac ホスト システムに Simply 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 にインストールされた Simply Studio v5
- Gecko SDK 3.2.0
- GNU ARM v7.2.1
ワイヤレス スターター キットの各メインボードを、下図のように USB でホスト コンピュータに接続します。これらの接続により、RCP およびエンドデバイスのプログラミングとネットワーク解析が可能になります。まず、ホスト コンピュータを使用して ot-rcp ファームウェアで BRD4166A をプログラムし、最後に Raspberry Pi に接続します。オプションで、エンドデバイスは共通のイーサネット スイッチを介してホスト コンピュータに接続できます。スターター キットは、IPv4 を介したプログラミングとネットワーク分析もサポートしています。
4. ファームウェアの設定
始める方法は 2 つあります。どちらの方法でも、この Codelab に必要なファームウェアをフラッシュできます。
- プロジェクト: (推奨)サンプル アプリケーションを作成、ビルド、フラッシュします。このオプションを使用すると、プロジェクト内のアプリケーションをカスタマイズできます。または、
- デモ: (省略可)任意のサンプル アプリケーション用に、事前に構築されたデモをラジオボードに直接書きます。オプションの演習として、デモのファームウェア セットアップを試すことをおすすめします。「オプションのファームウェア セットアップ - デモ」を参照してください。セクションをご覧ください。
この Codelab では、プロジェクト ベースのメソッドを使用します。
サンプルを使用してプロジェクトを作成する
2 つのプロジェクトを作成します。BRD4166A の ot-rcp
プロジェクトと 2 台の BRD4168A の ot-cli-ftd
プロジェクト。以下の手順に沿って、ご使用のボードに適したサンプル アプリケーションを選択してください。
- Studio の [ファイル] メニューを開き、[新規] >Silicon Labs プロジェクト ウィザード。[Target, SDK, and Toolchain Selection] ダイアログが開きます。OpenThread でサポートされているデフォルトの Simply IDE / GNU ツールチェーンは変更しないでください。[次へ] をクリックします。
- Target boards: 選択した無線ボード(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] を選択し、[次へ] をクリックします。
- [Project Configuration] ダイアログが開きます。ここで、プロジェクトの名前を変更したり、デフォルトのプロジェクト ファイルの場所を変更したり、プロジェクト ファイルにリンクするかコピーするかを決定できます。リンクされたプロジェクト ファイルは SDK を参照し、行った変更は SDK で行われ、今後のプロジェクトで使用されます。プロジェクトのソースをコピーすると、SDK ファイルはそのまま残るようにプロジェクトのローカルコピーを編集できます。‘SDK をリンクしてプロジェクト ソースをコピー’これがデフォルトの推奨設定です[完了] をクリックします。
- Simply IDE のパースペクティブが開き、プロジェクト コンフィギュレータの [概要] タブが表示されます。
プロジェクトを設定するには、[Software Components] タブで、コンポーネントのインストールとアンインストール、インストール済みコンポーネントの設定を行います。インストール済みのコンポーネントがチェックされます。[Installed Components] をクリックして、サンプル アプリケーションによってインストールされたコンポーネントをフィルタしたリストを表示します。変更は自動的に保存され、プロジェクト ファイルは自動生成されます。「Simply IDE」パースペクティブの右下に進行状況が表示されます。
このデモでは、サンプル アプリケーションのデフォルト構成を使用します。上記の手順を繰り返して、もう一方のボードに ot-rcp
プロジェクトを作成します。
プロジェクトのビルドとフラッシュ
ot-rcp
プロジェクトと ot-cli-ftd
プロジェクトの両方をビルドしてフラッシュします。
- プロジェクトを構成したら、上部のツールバーにあるビルド コントロール(ハンマー アイコン)をクリックします。または、プロジェクトを右クリックして [Build project] をクリックすることもできます。
- 進行状況はコンソールに表示され、右下に進行状況バーが表示されます。プロジェクトに関連するエラーや警告も、この出力ウィンドウに表示されます。
- バイナリ イメージは、プロジェクトのビルドが成功した後に生成されます。[Project Explorer] ビューからバイナリ イメージを書き込むことができます。コンパイラ サブディレクトリで .bin、.hex、.s37 ファイルを見つけます。ファイルを右クリックし、[Flash to Device] を選択します。複数のデバイスが接続されている場合は、プログラムするデバイスを選択して [OK] をクリックします。ファイルパスが入力された状態で Flash Programmer が開きます。[プログラム] をクリックします。
5. ファームウェア設定の概要
この時点で、ラジオボード上の適切なファームウェアを作成、コンパイル、フラッシュしているはずです。ot-rcp
が BRD4166A に書き込まれたら、ホストシステムから切断してこのボードを Raspberry Pi に接続します。
このセクションを完了すると、Thread ネットワーク ハードウェアのセットアップは次のようになります。
6. シリアル コンソールを設定する ot-cli-ftd デバイス
コンソール インターフェースを起動するには、[Devices View / Debug Adapters] ウィンドウの [Simply IDE] で 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 コンテナは、特定のリリース用に Simply 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 イメージをインストールする
- 次のコマンドを使用して Docker を RPi にインストールします。
curl -sSL https://get.docker.com | sh
- 完了したら、各コマンドの前に sudo を必要としないように Docker ユーザーの設定を変更します。再起動が必要です。
sudo usermod -aG docker $USER
- 次のコマンドを実行してコンテナをインストールします。なお、RCP では同時に実行できる Border Router コンテナは 1 つのみです。また、Simply 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
コマンドでいつでも確認できます。 - Docker コンテナが適切に閉じる(または削除)されるまで、
--name
はスティッキーになります。 - ポート 8080 は、Border Router の管理ウェブページをホストするウェブサーバーのポートを示します。
- 長い IPv6 パケットを使用した DTLS などのコストのかかるオペレーションで、UART を介した断片化 / 再構成の問題を回避するには、Radio URL オプションに
?uart-baudrate=460800
が必要です。
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
省略可: シェルを終了するには、CNTL+C キーを押します。
この時点で、コンソールが 3 つあるはずです。
- フルスレッド デバイスとして設定された Simply Studio の 2 つの
ot-cli-ftd
コンソール。 - OT ボーダー ルーターとしてセットアップされた Raspberry Pi 上の 1 つの
ot-ctl
インタラクティブ シェル。
これで、Thread ネットワークを形成する準備が整いました。
8. Thread ネットワークを作成する
RCP を設定
ネットワークを作成するには、まず OTBR 上の ot-ctl
シェルを使用します。このシェルは RCP ノードとの通信に使用されます。以下のコマンドを順番に入力します。
インデックス | コマンド | コマンドの説明 | 想定されるレスポンス | ||
1 |
| 新しいネットワーク構成を作成します。 | 完了 | ||
2 |
| 新しいデータセットをアクティブな運用データセットに commit する。 | 完了 | ||
3 |
| Thread インターフェースを有効化。 | 完了 | ||
4 |
| スレッド プロトコル オペレーションを有効にしてアタッチします。 | 完了 | ||
スレッド インターフェースが稼働するまで 10 秒待ちます。 | |||||
5 |
| デバイスの状態を確認します。リーダーがリーダーである必要があります。 | Leader | ||
6 |
| ネットワーク構成を表示します。 | アクティブ タイムスタンプ: 1 |
ot-cli-ftd
のチャンネル番号とネットワーク キーを使用して、2 つの FTD をこのスレッド ネットワークに参加します。
FTD をセットアップして Thread ネットワークに追加する(アウトオブバンド方式)
スパンタップ・モードでは、すべてのセキュリティ情報を把握したうえで、手動でノードを追加します。Simply コンソールで、次のコマンドを順に使用して両方の FTD をネットワークに追加します。
インデックス | コマンド | コマンドの説明 | 想定されるレスポンス | ||
1 |
| OTBR が使用するチャネルを設定します。 | 完了 | ||
2 |
| デバイスを Thread ネットワークに接続するために必要なのは、ネットワーク キーのみです。 | 完了 | ||
3 |
| 新しいデータセットをアクティブな運用データセットに commit する。 | 完了 | ||
4 |
| Thread インターフェースを有効化。 | 完了 | ||
5 |
| スレッド プロトコル オペレーションを有効にしてアタッチします。 | 完了 | ||
デバイスが接続され、自動的に構成されるまで 20 秒ほど待ちます。 | |||||
6 |
| ネットワーク構成を表示します。 | お子様 |
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 Simply Studio IDE を使用して OpenThread プロジェクトを作成する方法
- OpenThread CLI バイナリをビルドして Silicon Labs 無線ボードにフラッシュする方法
- Docker を使用して Raspberry Pi 3B 以降を OpenThread ボーダー ルーター(OTBR)として設定する方法
- OTBR で Thread ネットワークを作成する方法
- Thread ネットワークへのデバイスの帯域外コミッショニング。
- ping コマンドを使用してノード間の Thread 通信を確認する方法
関連情報
以下のような OpenThread リソースについては、openthread.io と GitHub をご覧ください。
- 対応プラットフォーム - OpenThread をサポートするすべてのプラットフォーム
- OpenThread をビルドする - OpenThread のビルドと構成の詳細
- Thread Primer — この Codelab で取り上げる Thread のコンセプトをすべてカバーします。
- Silicon Labs OpenThread トレーニング - OpenThread の概要を示し、コミッショニングとボーダー ルーター、および OpenThread ネットワークを作成する実践演習について説明します。
- QSG170: Silicon Labs OpenThread Quick-Start Guide - Silicon Labs のスレッド開発の開始プロセスについて詳しく説明しています。
- AN1256: OpenThread ボーダー ルーターで Silicon Labs RCP を使用する - Raspberry Pi ボーダー ルーター ホストのビルドとインストール手順
10. オプションのファームウェアのセットアップ - デモ
デモは、互換性のあるデバイスにダウンロードできる事前ビルド済みのファームウェア イメージです。Simply Studio で自分のパートにデモが利用可能なかどうかを確認するには、[Debug Adapters] ビューで該当するパーツをクリックし、[サンプル プロジェクトとLauncher Perspective の [DEMOS] タブ[サンプル プロジェクト] フィルタを無効にし、[テクノロジーの種類] の下の [スレッド] ラジオボタンをオンにする。
OpenThread SDK で提供されるプリコンパイル済みのデモ アプリケーション イメージは、次のボードと互換性があります。
- BRD4161a
- BRD4166a
- BRD4168a
- BRD4180a
- BRD4304a
このリストは、今後の SDK リリースで更新され、より多くのラジオボードが追加される可能性があります。サポートされるパーツの完全なリストについては、ドキュメントから Silicon Labs OpenThread SDK のリリースノートを参照してください。
それぞれのボードに以下のデモをフラッシュします。フラッシュするには、左側の [Debug Adapters] でボードを選択し、対応するサンプル アプリケーションの [実行] をクリックします。ポップアップ ウィンドウにフラッシュの進行状況が表示されます。
- BRD4166A: ot-rcp — このデバイスは OT ボーダー ルーターの無線通信プロセッサとして機能します。このデバイスを使用して Thread ネットワークを作成し、他の 2 台のデバイスを Thread ネットワークにオンボーディングします。このデバイスはボーダー ルーターとして、Thread ネットワーク内のデバイスがインターネットを介して通信するためのゲートウェイとしても機能します。
- 2 台の BRD4168A: ot-cli-ftd — この 2 台のデバイスはフルスレッド デバイスとして機能します。OTBR によって作成された Thread ネットワークに参加します。