10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

東芝Advent Calendar 2024

Day 16

Zephyr OSで開発したコードをBabbleSimでシミュレーションしよう

Last updated at Posted at 2024-12-15

(株)東芝 研究開発センターの平井と申します。
この記事では、物理層シミュレータ BabbleSimの基本的な使用方法について説明します。

BabbleSimを利用すると、RTOSであるZephyr OSで開発したコードの挙動をマイコン無しで確認することができ、大変便利です。
今回は、Bluetoothの1対1通信をBabbleSimでシミュレーションし、Wiresharkでどのような通信が行われたかをGUIで確認します。

環境構築

まず、BabbleSimの開発環境構築について説明します。

Zephyr OSの開発環境が整っていれば、BabbleSimを動かすことができると思いますが、
本記事ではZephyr OSを使うのに便利なnRF Connect SDK(NCS)と、
そのVS Code用の拡張機能
を使用して開発を進めていきます。
Installing the nRF Connect SDKを参考に開発環境を整えることをお勧めいたします。

なお、公式ドキュメントに記載されている通りBabbleSimはLinux環境でのみ動作します。

参考までに、私の開発環境は以下です。

OS Ubuntu 22.04
Zephyr OS v4.0.99
nRF Connect SDK v2.8.0

BabbleSimの導入

Fetching BabbleSimおよびBuilding BabbleSimを参考に、BabbleSimを導入します。

NCSとVS Codeを導入している場合、まず、Command PaletteでnRF Connect: Create Shell Terminalを選択し、Zephyr OS用の環境が設定されたシェルを開きます。
その後、以下でBabbleSimをダウンロードします。

cd ${ZEPHYR_BASE}
west config manifest.group-filter -- +babblesim
west update

ドキュメントに記載されている通り、BSIM_OUT_PATH=${ZEPHYR_BASE}/../tools/bsim/BSIM_COMPONENTS_PATH=${BSIM_OUT_PATH}/components/を環境変数に追加します。例えば以下を.bashrcに記載します。

~/.bashrc
export BSIM_OUT_PATH=${ZEPHYR_BASE}/../tools/bsim/
export BSIM_COMPONENTS_PATH=${BSIM_OUT_PATH}/components/

最後に、BabbleSimを以下でコンパイルします。

cd ${BSIM_OUT_PATH}
make everything -j 8

これでBabbleSimを使用する準備が整いました。

BabbleSimでシミュレーションしてみる

ここでは、Zephyr OSのサンプルを使用して簡単なBluetoothの通信をシミュレーションします。
使用するサンプルはBluetooth Central HRBluetooth Peripheral HRです。
これらは、定期的にペリフェラルが心拍数のダミーデータをセントラルに送信するアプリケーションです。

シミュレーション用の実行ファイルの作成

Visual Studio CodeのnRF Connect拡張機能を起動し、Create a new applicationを押した後、Copy a sampleからBluetooth Central HRとBluetooth Peripheral HRを選択します。
ここでは、アプリケーションのディレクトリをそれぞれ~/myproj/central_hr~/myproj/peripheral_hrに設定しました。

その後、Add Build ConfigurationのBuild target欄にてnrf52_bsim/nativeを選択して、ビルドします。
ビルド先のディレクトリは任意ですが、ここではデフォルトのbuildであるとします。

無事ビルドに成功すれば、~/myproj/central_hr/build/zephyr/zephyr.exe~/myproj/central_hr/build/zephyr/zephyr.exeが作成されていると思います。

試しに、これらのファイルを実行してみると、以下のような結果になります。

$ ~/myproj/central_hr/build/zephyr/zephyr.exe
?_??: WARNING: Neither simulation id or the device number have been set. I assume you want to run without a BabbleSim phy (-nosim)
?_??: WARNING: If this is not what you wanted, check with --help how to set them

WARNINGにも書かれている通り、物理層(無線部分)の設定をしていないため、このままではBluetoothのシミュレーションを実行することはできません。
そこで次に、シミュレーションの設定を行います。

シミュレーションの設定

シミュレーションを行うためには、${BSIM_OUT_PATH}/binに移動する必要があります。
コマンドを実行しやすいよう、先ほど作成された実行ファイルを移動させておきます。

cp ~/myproj/central_hr/build/zephyr/zephyr.exe ${BSIM_OUT_PATH}/bin/central_hr
cp ~/myproj/peripheral_hr/build/zephyr/zephyr.exe ${BSIM_OUT_PATH}/bin/peripheral_hr

その後、${BSIM_OUT_PATH}/binに移動します。

cd ${BSIM_OUT_PATH}/bin

シミュレーションは以下のコマンドで実行できます。

./central_hr -s=my_first_sim -d=0 -p=phy &
./peripheral_hr -s=my_first_sim -d=1 -p=phy &
./bs_2G4_phy_v1 -s=my_first_sim -p_id=phy -D=2 -sim_length=10e6 -defmodem=BLE_simple -argsdefmodem -PER=0.1 &

ヘルプメッセージをもとに、各オプションの設定を確認していきます。

$ ./central_hr --help
 [-s=<s_id>]                  :String which uniquely identifies the simulation
 -d=<device_number>           :Device number (for this phy)
 [-p=<p_id>]                  :(2G4) String which uniquely identifies the phy inside the simulation
 ...

簡単な説明は以下の通りです。

  • -sはシミュレーションのidです。同じシミュレーションに対しては、全て同一の文字列を指定する必要があります。
  • -dはデバイスの番号です。今回は2台のデバイスがありますので、-d=0, -d=1という風にそれぞれ指定しています。
  • -phyは物理層のidです。シミュレーションのidと同様、基本的に同じシミュレーションに対して同一の文字列を指定することになると思います。

残りの./bs_2G4_phy_v1のオプションについても説明します。

$ ./bs_2G4_phy_v1 --help
 [-s=<s_id>]                  :String which uniquely identifies the simulation
 [-p_id=<phy_id>]             :(2G4) String which uniquely identifies the phy inside the simulation
  -D=<number_devices>          :Number of devices which will connect in this phy
 [-sim_length=<sim_length>]   :In us, length of the simulation
 [-defmodem=<modem>]          :Which modem will be used by default for all devices ( lib/lib_2G4Modem_<modem>.so ). By default Magic
 [-argsdefmodem <arg>...]     :Following arguments (until end or new -args*) will be passed to the modems set to be the default modem
 ...
  • -Dでは、デバイスの数を指定します。今回は2台なので2を指定しています。
  • -sim_lengthでは、us単位でシミュレーション時間を指定します。今回は10e6を指定しているので、10秒間のシミュレーションが行われることになります。
  • -defmodemでは、各デバイスのデフォルトのモデムを指定します。本記事執筆時点では、BLE_simpleMagicが指定できます。モデムの説明は、例えば${BSIM_OUT_PATH}/components/ext_2G4_modem_BLE_simple/docsに記載されています。
  • -argsdefmodem以降で、モデムに対する引数を指定します。今回は、PERを0.1に指定しました。

実行結果をWiresharkで確認する

実行結果は、${BSIM_OUT_PATH}/results/${s_id}に保存されています。
s_idは、先ほど-sオプションで指定した文字列になります。

$ ls ${BSIM_OUT_PATH}/results/my_first_sim/
d_phy_00.CCA.csv      d_phy_00.RSSI.csv  d_phy_00.Rxv2.csv  d_phy_00.Txv2.csv  d_phy_01.ModemRx.csv  d_phy_01.Rx.csv    d_phy_01.Tx.csv
d_phy_00.ModemRx.csv  d_phy_00.Rx.csv    d_phy_00.Tx.csv    d_phy_01.CCA.csv   d_phy_01.RSSI.csv     d_phy_01.Rxv2.csv  d_phy_01.Txv2.csv

ファイルを確認すると、全てCSVファイルとなっていることが分かります。
CSVファイルの状態だと結果を確認しづらいですが、ありがたいことにCSVファイルをpcapファイルに変換する方法が用意されています。
以下で、pcapファイルに変換しましょう。

${BSIM_COMPONENTS_PATH}/ext_2G4_phy_v1/dump_post_process/csv2pcap -o ./my_first_sim.pcap  ${BSIM_OUT_PATH}/results/my_first_sim/d_phy_0*.Tx.csv

変換されたファイルをWiresharkで確認します。

wireshark.png

アドバタイジングが行われた後、接続を行い、Notificationによる通信を行っていることが確認できます。
MACアドレスはランダムな値が使用されており、例えば./central_hr --random-seed=1234などしてシード値を設定することで変化します。
なお、少なくとも私の環境では、アクセスアドレスがおかしなことになっています。
解決方法をご存じの方がいればコメント欄にご記載頂けますと幸いです。
とはいえ、通信内容を確認する上では十分有用な結果が得られていると思います。

まとめ

本記事では、Zephyr OSで動作するコードを用いてBabbleSimで物理層のシミュレーションを行う方法を説明し、Wiresharkでシミュレーションの結果を確認しました。
Zephyr OSで開発したコードに対して直接シミュレーションを適用することができるのは、非常に便利だと思います。
また、今回は説明しきれませんでしたが、BabbleSimでは屋内環境の無線伝搬のシミュレーションなど様々な機能が提供されています。
興味のある方は、公式ドキュメントをご参照ください。

※本記事に掲載の商品、機能等の名称は、それぞれ各社が商標として使用している場合があります。

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?