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

1. はじめに

26b7f4f6b3ea0700.png

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 で使用されます。

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

学習内容

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

2. 前提条件

ハードウェア:

  1. 3 個の EFR32MGxx 無線ボード - これらのデバイスの任意の組み合わせを使用できます。この Codelab では、RCP として BRD4166A を、Full Thread Device として 2 つの BRD4168A を使用します。
    • EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
    • EFR32MG13(BRD4168A
    • EFR32MG21(BRD4180A、BRD4180B
    初めての場合は、上記のボードを含む EFR32 Thread スターター キットを入手できます。
  2. BRD4001A: 無線スターター メインボード(WSTK)で無線ボードをホストします。BRD4166A を除くすべての無線ボードには、それぞれスターター メインボードが必要です。メインボードの接続と電源供給用の Mini USB ケーブル、または BRD4166A 用のマイクロ USB ケーブル。

WSTK AEM

  1. イーサネット経由でインターネットに接続された Raspberry Pi 3B+ 以降と、Raspbian Stretch Lite OS イメージまたは Raspbian Stretch with Desktop。これは OT Border Router として構成します。
  2. 少なくとも 2 つの USB ポートとインターネット接続を備えた Windows/Linux/Mac ホスト システム。SSv5 でハードウェアと OS の要件を確認します。
  3. 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 は、

  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 とエンドデバイスのプログラミングとネットワーク分析が可能になります。まず、ホスト コンピュータを使用して ot-rcp ファームウェアで BRD4166A をプログラミングし、最終的に 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] を選択します。[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.0OpenThread 2.0.1.0 (GitHub-55af6ce2c) など)が含まれます。
    • IDE/ ツールチェーン: OT プロジェクトのコンパイルに使用されるツールチェーン。GNU ARM を使用します。

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

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

新しいプロジェクト ウィザードの手順 2

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

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

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

プロジェクトの概要

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

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

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

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

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

  1. プロジェクトを構成したら、上部のツールバーにある [ビルド制御(ハンマーアイコン)] をクリックします。または、プロジェクトを右クリックして [ビルド プロジェクト] をクリックすることもできます。

[プロジェクトをビルド] ボタン

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

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

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

フラッシュ

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

この時点で、無線ボードに適切なファームウェアを作成、コンパイル、書き込みしているはずです。ot-rcp を BRD4166A に書き込んだら、ホストシステムから切断し、このボードを Raspberry Pi に接続します。

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

EFR32MG のセットアップ

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

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

FTD Studio コンソール ビュー

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 イメージを使用します。

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. 完了したら、Docker ユーザー設定を変更して、各コマンドの前に sudo を必要としないようにすることができます。再起動が必要です。
    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 で使用する TTY ポートを構成して、起動時に RCP を接続する必要があります。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

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

この時点で、3 つのコンソールが表示されます。

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

これで、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

ネットワーク構成を表示します。
このコードラボでは値が異なります。
チャンネル、ネットワーク キー、
ネットワーク名、PAN ID をメモします。

Active Timestamp: 1
Channel: 20
Channel Mask: 0x07fff800
Ext PAN ID: 39ba71f7fc367160
Mesh Local Prefix: fd5c:c6b:3a17:40b9::/64
Network Key: 81ae2c2c17368d585dee71eaa8cf1e90
Network Name: OpenThread-008c
PAN ID: 0x008c
PSKc: c98f0193d4236025d22dd0ee614e641f
Security Policy: 0, onrcb
Done

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

FTD を Thread ネットワークに設定して追加する(アウトオブバンド方式)

アウトオブバンド方式では、すべてのセキュリティ情報を把握し、ノードを手動で追加します。Simplicity コンソールで、次のコマンドを次の順序で使用して、両方の 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

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

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.ioGitHub で、次のようなさまざまな OpenThread リソースをご確認ください。

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

デモは、互換性のあるデバイスにダウンロードできるビルド済みのファームウェア イメージです。Simplicity Studio でデモが利用可能かどうかを最も簡単に確認するには、[Debug Adapters] ビューでパーツをクリックし、Launcher Perspective の [EXAMPLE PROJECTS & DEMOS] タブに移動します。[Example Projects] フィルタを無効にし、[Technology Type] の [Thread] ラジオ チェックボックスをオンにします。

Studio のデモ

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

  1. BRD4161a
  2. BRD4166a
  3. BRD4168a
  4. BRD4180a
  5. BRD4304a

このリストは、今後の SDK リリースで更新され、より多くの無線ボードが含まれる可能性があります。サポートされているパーツの完全なリストについては、ドキュメントの Silicon Labs OpenThread SDK リリースノートをご覧ください。

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

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