Simplicity Studio v5 を使用して、Silicon Labs EFR32 ボードと OpenThread を使用して Thread ネットワークを構築する

1. はじめに

26b7f4f6b3ea0700.png

Google の OpenThread(OT)は、Thread のオープンソース実装です。Google は、オープン スレッドをリリースして、Google Nest 製品で使用されるネットワーキング テクノロジーをデベロッパーがより広く利用できるようにし、スマートホームの建物や商業ビル向けの製品開発を加速させました。狭いプラットフォーム抽象化レイヤと小さなメモリ フットプリントを備えた OpenThread は、ポータビリティに優れています。システム オン チップ(SoC)とネットワーク コプロセッサ(NCP)の両方の設計に対応しています。

Thread 仕様は、家庭用および商業用建物のアプリケーション向けの、信頼性が高く、安全で、低電力のワイヤレス デバイス間通信プロトコルです。

Silicon Labs は OpenThread を拡張して Silicon Labs ハードウェアと連携できるようにしました。このソースコードは GitHub で入手可能です。Simplicity Studio 5(SSv5)と一緒にインストールされるソフトウェア開発キット(SDK)としても利用可能です。この SDK には、GitHub ソースコードの完全なテスト済みスナップショットが含まれています。GitHub バージョンよりも幅広い種類のハードウェアをサポートしており、GitHub では入手できないドキュメントやサンプル アプリケーションが含まれています。

このガイドでは、Silicon Labs OpenThread SDK と Simplicity Studio 5 を使用して OpenThread アプリケーションの開発を開始する方法について説明します。以下の画像は、ボード(BRD)と、Codelab で使用されている OT ボーダー ルーター(OTBR)および 2 つの Thread デバイスに設定されたハードウェアを示しています。

EFR32MG ハードウェアのセットアップ

学習内容

  • Silicon Labs Simplicity Studio IDE を使用して OpenThread プロジェクトを作成する方法。
  • OpenThread CLI バイナリをビルドして Silicon Labs のラジオボードに書き込む方法。
  • Docker を使用して Raspberry Pi 3B+ を OpenThread ボーダー ルーター(OTBR)として設定する方法。
  • OTBR で Thread ネットワークを作成する方法。
  • Thread ネットワークへのデバイスの帯域外でのコミッショニング。
  • ping コマンドを使用してノード間の Thread 通信を検証する方法

2. 前提条件

ハードウェア:

  1. 3 個の EFR32MGxx 無線ボード - これらのデバイスは自由に組み合わせて使用できます。この Codelab では、RD4166A を RCP として使用し、2 つの BRD4168A をフルスレッド デバイスとして使用します。
    • EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
    • EFR32MG13(BRD4168A
    • EFR32MG21(BRD4180A、BRD4180B
    新たに始める場合は、上記のボードを搭載した EFR32 Thread スターター キットのいずれかを入手できます。
  2. BRD4001A: ラジオ ボードをホストする、ワイヤレス スターター メインボード(WSTK)。BRD4166A を除き、すべてのラジオボードにスターター メインボードが必要です。メインボードに接続または給電するためのミニ USB ケーブルまたは BRD4166A 用マイクロ USB ケーブル。

WSTK AEM

  1. Raspberry Pi 3B 以降(Raspbian Stretch Lite OS イメージまたは Raspbian Stretch with Desktop を含む)。イーサネット経由でインターネットに接続します。OT ボーダー ルーターとして構成します。
  2. 2 つ以上の USB ポートとインターネット接続を備えた、Windows、Linux、Mac のホストシステムハードウェアと OS の要件については、SSv5 をご覧ください。
  3. Raspberry Pi をインターネットに接続するためのイーサネット ケーブルが 1 本以上必要です。WSTK は IP 経由のデバッグとフラッシュもサポートしているため、必要に応じて、イーサネット スイッチを介して WSTK とホストシステムを接続するために追加のイーサネット ケーブルを使用できます。

ソフトウェア:

  • Simplicity Studio v5 が、Windows、Linux、Mac のホスト システムにインストールされ、アップデートされる。
    • GNU ARM ツールチェーン
    • Gecko SDK Suite 3.2.0 以降と Silicon Labs OpenThread SDK。

3. ハードウェアのセットアップ

この Codelab は、

  1. 左に示すように、EFR32MG12 BRD4166A Thunderboard Sense 2
  2. 右に示すように、2 つの EFR32MG13 BRD4168A
  3. macOS Catalina 10.15.7 に Simplicity Studio v5 がインストールされている。
    1. Gecko SDK 3.2.0
    2. GNU ARM v7.2.1

BRD4168A

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

接続

4. ファームウェアの設定

ご利用を開始するには 2 つの方法があります。どちらの方法でも、この Codelab に必要なファームウェアを書き込むことができます。

  1. プロジェクト: (推奨)サンプル アプリケーションを作成、ビルド、フラッシュします。このオプションを使用すると、プロジェクト内のアプリケーションをカスタマイズできます。または
  2. デモ: (オプション)いずれかのサンプル アプリケーションのラジオボードに、ビルド済みのデモを直接フラッシュします。オプションの演習として、デモのファームウェアをセットアップしてみることをおすすめします。詳細については、この Codelab の最後にある「オプションのファームウェア設定 - デモ」セクションをご覧ください。

この Codelab では、プロジェクト ベース手法を使用します。

サンプルを使用してプロジェクトを作成する

2 つのプロジェクトを作成します。BRD4166A の ot-rcp プロジェクトと 2 つの BRD4168A の ot-cli-ftd プロジェクト。次の手順に沿って、ボードに適したサンプル アプリケーションを選択してください。

  1. Studio の [File] メニューを開き、[New] > [Silicon Labs Project Wizard] を選択します。ターゲット、SDK、ツールチェーンの選択ダイアログが開きます。OpenThread でサポートされるデフォルトの Simplicity IDE / GNU ツールチェーンを変更しないでください。[次へ] をクリックします。
    • ターゲット ボード: 選択したラジオボード(BRD4168A)とメインボード(BRD4001A)を表示します
    • ターゲット デバイス: このフィールドは、オンボードのマイクロコントローラ チップ(MCU)を示します。BRD4168A は EFR32MG13 MCU を搭載しています。
    • SDK: ここで、作業している OT の SDK バージョンを選択できます。スイート情報には、SDK タグと OpenThread の Silicon Labs ビルドが含まれます(例: Platform 4.0.1.0OpenThread 2.0.1.0 (GitHub-55af6ce2c))。
    • IDE/ ツールチェーン: OT プロジェクトのコンパイルに使用されるツールチェーン。GNU ARM を使用しています。

新しいプロジェクト ウィザード

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

新しいプロジェクト ウィザード ステップ 2

  1. [Project Configuration] ダイアログが開きます。ここでは、プロジェクトの名前を変更したり、デフォルトのプロジェクト ファイルの場所を変更したり、プロジェクト ファイルにリンクするか、コピーするかを指定したりできます。リンクされたプロジェクト ファイルは SDK を参照し、SDK に加えた変更は今後のプロジェクトで使用されます。プロジェクト ソースをコピーすると、SDK ファイルはそのまま残して、プロジェクトのローカルコピーを編集できるようになります。デフォルトは [SDK をリンクしてプロジェクト ソースをコピー] が推奨されています。[終了] をクリックします。

新しいプロジェクト ウィザード ステップ 3

  1. Simplicity IDE Perspective が開き、Project Configrrator で [概要] タブが開きます。

プロジェクトの概要

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

ソフトウェア コンポーネント

このデモでは、サンプル アプリケーションのデフォルト設定を使用します。上記の手順を繰り返して、別のボード用に ot-rcp プロジェクトを作成します。

プロジェクトをビルドしてフラッシュする

ot-rcp プロジェクトと ot-cli-ftd プロジェクトの両方をビルドしてフラッシュします。

  1. プロジェクトを設定したら、上部のツールバーにあるビルド コントロール(ハンマーアイコン)をクリックします。または、プロジェクトを右クリックして [プロジェクトをビルド] をクリックします。

[Build project] ボタン

  1. 進捗状況はコンソールに表示され、右下に進行状況バーが表示されます。プロジェクトに関連するエラーや警告も、この出力ウィンドウに表示されます。

プロジェクトのビルド出力ウィンドウ

  1. バイナリ イメージは、プロジェクトが正常にビルドされた後に生成されます。バイナリ イメージをフラッシュするには、Project Explorer ビューを使用します。コンパイラ サブディレクトリで .bin、.hex、.s37 のいずれかのファイルを探します。ファイルを右クリックし、[デバイスにフラッシュ] を選択します。複数のデバイスが接続されている場合は、プログラミングするデバイスを選択して、[OK] をクリックします。ファイル パスが入力された状態で Flash Programmer が開きます。[プログラム] をクリックします。

フラッシュ

5. ファームウェア設定の概要

この時点で、無線ボード上の適切なファームウェアを作成、コンパイル、フラッシュしました。ot-rcp を BRD4166A にフラッシュしたら、ホストシステムから切断し、このボードを Raspberry Pi に接続します。

このセクションを完了すると、Thread ネットワーク ハードウェアのセットアップは次のようになります。

EFR32MG のセットアップ

6. ot-cli-ftd デバイス用のシリアル コンソールの設定

コンソール インターフェースを起動するには、シンプル IDE の観点から、[Devices View / Debug Adapters] ウィンドウで J-Link デバイスを右クリックします。[Launch Console] を選択します。Console でプロンプトを表示するには、[シリアル 1] タブを選択し、Enter キーを押します。FTD ノードの状態を確認します。

FTD Studio コンソール ビュー

ot-rcp 用のコンソールはまだありません。次のステップでは、Raspberry Pi を OT ボーダー ルーターとして構成し、ot-rcp のコンソールを設定します。

7. Raspberry Pi をボーダー ルーターとして設定する

Silicon Labs は、会社の Docker コンテナを OTBR でデプロイすることを推奨しています。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 イメージを使用します。

GSDK バージョン

Raspberry Pi の設定

  1. SD カードで、Raspbian Stretch Lite OS イメージまたは Raspbian Stretch with Desktop をフラッシュします。
  2. Raspberry Pi に SSH で接続することも、Raspbian Desktop を直接使用することもできます。ターミナルを開きます。
  3. Docker をインストールする前に、必ずローカル リポジトリとパッケージ マネージャーを更新してください(apt-get updateapt-get upgrade を使用している場合)。

Docker イメージをインストールする

  1. RPi で次のコマンドを使用して、Docker をインストールします。
    curl -sSL https://get.docker.com | sh
    
  2. 完了したら、各コマンドの前に sudo を必須としないように Docker ユーザー設定を変更できます。再起動が必要です。
    sudo usermod -aG docker $USER
    
  3. 次のコマンドを実行して、コンテナをインストールします。RCP で一度に実行できるボーダー ルーター コンテナは 1 つだけです。また、Simplicity Studio GSDK のバージョンが正しい Docker イメージと一致していることを確認してください。例:gsdk-4.0.1
    docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
    

Docker を構成して実行する

  1. 起動時に OTBR を接続するために OTBR に使用する TTY ポートを設定する必要があります。RCP デバイスの TTY ポートを探します。最も簡単な方法は、RCP が接続されたら /tty/dev... エントリを探すことです。通常は /dev/ttyUSB0 または /dev/ttyACM0 を指定します。
  2. 次のコマンドを使用して 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 は、ボーダー ルーター管理ウェブページをホストするウェブサーバーのポートを示します。
    • ?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

省略可: シェルを終了するには、CNTL+C キーを押します。

この時点では 3 つのコンソールが必要です。

  1. Full Thread デバイスとして設定された Simplicity Studio の 2 つの ot-cli-ftd コンソール。
  2. OT ボーダー ルーターとしてセットアップされた Raspberry Pi 上にある ot-ctl インタラクティブ シェル 1 つ。

これで、Thread ネットワークを形成する準備が整いました。

8. Thread ネットワークの作成

RCP を設定する

ネットワークを作成するには、まず OTBR の ot-ctl シェルを使用します。これは RCP ノードとの通信に使用されます。次のコマンドを以下の順序で入力します。

索引

コマンド

コマンドの説明

想定されるレスポンス

1

dataset init new

新しいネットワーク構成を作成します。

完了

2

dataset commit active

新しいデータセットをアクティブな運用データセットに commit する。

完了

3

ifconfig up

Thread インターフェースを有効にする。

完了

4

thread start

Thread プロトコル オペレーションを有効にしてアタッチします。

完了

スレッド インターフェースが起動するまで 10 秒ほど待ちます。

5

state

デバイスの状態を確認します。リーダーである必要があります。
その他の状態: オフライン、無効、接続解除、
子、ルーター、リーダー

リーダー
完了

6

dataset

ネットワーク構成を表示します。
この値はこの Codelab とは異なります。
チャネル、ネットワーク キー、
ネットワーク名、PAN ID をメモします。



チャンネルのコード: 20







ot-cli-ftd のチャンネル番号とネットワーク キーを使用して、2 つの FTD をこのスレッド ネットワークに接続します。

FTD を設定して Thread ネットワークに追加する(帯域外メソッド)

帯域外メソッドを使用すると、すべてのセキュリティ情報を把握して手動でノードを追加できます。シンプル コンソールでは、以下のコマンドを使用して、両方の FTD をネットワークに追加します。

索引

コマンド

コマンドの説明

想定されるレスポンス

1

dataset channel 20

OTBR で使用するチャンネルを設定します。

完了

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

デバイスが Thread ネットワークに接続するには、ネットワーク キーのみが必要です。

完了

3

dataset commit active

新しいデータセットをアクティブな運用データセットに commit する。

完了

4

ifconfig up

Thread インターフェースを有効にする。

完了

5

thread start

Thread プロトコル オペレーションを有効にしてアタッチします。

完了

デバイスが参加して設定が完了するまで 20 秒ほど待ちます。

6

state

ネットワーク構成を表示します。


完了

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 に繰り返します。

9. 完了

これで、Thread ネットワークが作成されました。

学習内容:

  • Silicon Labs Simplicity Studio IDE を使用して OpenThread プロジェクトを作成する方法。
  • OpenThread CLI バイナリをビルドして Silicon Labs のラジオボードに書き込む方法。
  • Docker を使用して Raspberry Pi 3B+ を OpenThread ボーダー ルーター(OTBR)として設定する方法。
  • OTBR で Thread ネットワークを作成する方法。
  • Thread ネットワークへのデバイスの帯域外でのコミッショニング。
  • ping コマンドを使用してノード間の Thread 通信を検証する方法

関連情報

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

10. オプションのファームウェアの設定 - デモ

デモは、互換性のあるデバイスにすぐにダウンロードできるビルド済みファームウェア イメージです。Simplicity Studio で該当するデモを利用できるかどうかを確認するには、[Debug Adapters] ビューに移動し、該当する部分をクリックして [Launcher Perspective] の [Example プロジェクトとデモ] タブに移動すると簡単です。[サンプル プロジェクト] フィルタを無効にし、[テクノロジーの種類] で [Thread] ラジオボタンをオンにします。

Studio のデモ

OpenThread SDK とともに提供されるプリコンパイルされたデモ アプリケーション イメージは、以下のボードと互換性があります。

  1. BRD4161A
  2. BRD4166A
  3. BRD4168a
  4. BRD4180A
  5. BRD4304A

このリストは、さらなる SDK リリースを含む今後の SDK リリースで更新される可能性があります。サポートされている部分の完全なリストについては、「Documentation」の Silicon Labs OpenThread SDK リリースノートをご覧ください。

各ボードで次のデモを行います。フラッシュするには、左側の [Debug Adapters] でボードを選択し、対応するサンプル アプリケーションの [RUN] をクリックします。ポップアップ ウィンドウに点滅の進行状況が表示されます。

  1. BRD4166A: ot-rcp - このデバイスは OT ボーダー ルーターの無線コプロセッサとして機能します。このデバイスを使用して Thread ネットワークを作成し、Thread ネットワーク上の他の 2 つのデバイスをオンボーディングします。ボーダー ルーターであるデバイスは、Thread ネットワーク内のデバイスがインターネット経由で通信するためのゲートウェイとしても機能します。
  2. 2 つの BRD4168A: ot-cli-ftd - この 2 つのデバイスは Full Thread デバイスとして機能します。これらは OTBR によって作成された Thread ネットワークに参加します。