以前、Armadillo-640 + BT/THオプションモジュール上でpc-ble-driverを使用し、LE Coded PHYでBLE通信を行うHowtoを公開しました。
本Howtoでは、上記環境のようにpc-ble-driverを使用した際のスループットを測定しましたので、その概要と結果についてまとめます。
使用したもの
- Armadillo-640 + BT/THオプションモジュール ×2セット
測定項目
セントラルからペリフェラルに1024KByte送信し、ペリフェラルの受信が終了するまでの時間を測定し、スループットを計算しました。
スループットが速くなるように、通信に用いるPHY毎にパラメータを変更しました。
各条件の組み合わせは以下の表のとおりです。
通信に用いるPHY | ATT_MTU size[byte] | TX Data length[byte] | RX Data length[byte] | Connection interval[ms] | GAP event length[ms] |
---|---|---|---|---|---|
LE 1M PHY | 247 | 251 | 27 | 7.5 | 400 |
LE 2M PHY | 247 | 251 | 27 | 7.5 | 400 |
LE Coded PHY | 23 | 27 | 27 | 400 | 400 |
本測定は、ハードウェアを揃えればどなたでも同じテストを実行することができます。 以下にソフトウェアの準備の手順や仕様についてまとめていますが、測定結果のみ知りたい方は「測定結果」を、各パラメータ値の設定については「パラメータ値」をご覧ください。
準備
本手順ではArmadillo-640をセントラル、ペリフェラルとして接続してスループットの測定を行います。
Armadillo-640とBT/THオプションモジュールのセットアップ
使用するArmadillo-640のソフトウェア構成は以下のとおりです。
ソフトウェア | ダウンロード |
---|---|
Linuxカーネル | v4.14-at35 |
DTB | v4.14-at35 |
ブートローダー | v2018.03-at9(UART3) |
ユーザーランド | v20210224(buster) |
Armadillo-640とBT/THオプションモジュールのセットアップは「Armadillo-640 + BT/THオプションモジュールでLE Coded PHY(Long-range モード)」と同様の手順で、pc-ble-driverのアプリケーションがArmadillo-640上で実行できるように設定します。
本測定で使用するpc-ble-driverのソースコードはこちらからダウンロードできます。
テスト用のプログラム(test_throughput)は「Armadillo-640 + BT/THオプションモジュールでLE Coded PHY(Long-range モード)」でpc-ble-driverのビルド環境を整えた上で、以下のコマンドを実行することで生成されます。
[ATDE]$ cd path/to/pc-ble-driver/at_build/
[ATDE]$ make dist-clean && make CROSS_COMPILE=arm-linux-gnueabihf-
[ATDE]$ ls test_throughput
test_throughput
測定方法
Armadillo-640でスループットのテストアプリケーションを実行する際に、オプションでセントラル・ペリフェラルや、接続後に使用するPHYを選択することができます。 以下は、LE 1MPHYを使用して、セントラルとして接続する際の実行例です。
[armadillo]# ./test_throughput --phy=1m --role=cent
各測定条件において、Armadillo2台を並べて配置し、スループットを測定しました。
- 実行例
[armadillo]# ./test_throughput --role=cent --phy=1m
phy: 1M_PHY
Serial port used: /dev/ttyACM0
Baud rate used: 1000000
Info: Successfully opened /dev/ttyACM0. Baud rate: 1000000. Flow control: none. Parity: none.
Status: 6, message: Target Reset performed
Status: 7, message: Connection active
Received advertisement report with device address: 0xFB91159C816B
Connected as a central
Press enter to start throughput test
Sent 1 KBytes
Sent 2 KBytes
Sent 3 KBytes
Sent 4 KBytes
Sent 5 KBytes
Sent 6 KBytes
Sent 7 KBytes
Sent 8 KBytes
Sent 9 KBytes
Sent 10 KBytes
: (省略)
Sent 1022 KBytes
Sent 1023 KBytes
Sent 1024 KBytes
AMT peer received 1048712 bytes (1024 KBytes).
Done.
=============================
Time: 22.33 seconds elapsed.
Throughput: 376.00Kbps.
=============================
Sent 1048712 bytes of ATT payload.
Retrieving amount of bytes received from peer...
測定結果
測定結果は以下のようになりました。
通信に用いるPHY | スループット[kbps] | 通信にかかった時間[s] |
---|---|---|
LE 1MPHY | 376.0 | 22.3 |
LE 2MPHY | 368.0 | 22.8 |
LE Coded PHY | 43.3 | 193.8 |
パラメータ値
各パラメータの役割・値について以下に示します。
ATT_MTU size
ATTプロトコルPDUの最大長
1回の通信でData length[byte]を送信するため、TX Data lengthからヘッダ部分4[byte]を取り除いた値としました。
Data length
1回のコネクションで送受信するデータ量
LE 1M PHY、LE 2M PHYでは、送信するデータ量は最大の251[byte]、受信するデータ量は最小の27[byte]としました。
LE Coded PHYは、Data lengthが27[byte]固定のため27[byte]としました。
GAP event length
1回のコネクションでデータを送受信できる最大時間
今回使用したConnection intervalの最大値と同様に400[ms]としました。
Connection interval
Connection interval毎にデータの送受信を行います。
データを速く送信するために、nRF52のデータ送信バッファにデータが溜まらないようにConnection intervalの値を設定しました。
従って、armadilloからUSB経由でnRF52のバッファにデータを入れるためにかかる時間(以下バッファ時間)と、
n回目のデータ送信後からn+1回目のデータを送信するまでの時間からConnection intervalを計算しました。
ATT_MTU size=247[byte]、TX Data length=251[byte]としたときの、バッファ時間は実測した結果、約5200[us]でした。
次に、1回の通信にかかる時間は以下の式となります。
送信ペイロード転送時間 + IFS(Inter Frame Space)の時間 + ACK受信時間 + IFSの時間
※IFSは正しくデータを受信できたことを確認し、返信するために準備をする時間です。
ここで各時間の値は、
IFS:150[us]
ACK:LE 1M PHYのとき80[us]、LE 2M PHYのとき44[us]
送信ペイロード転送時間:
(Data length + プリアンブル + アクセスアドレス + ヘッダ + MIC + CRC) * 8 / PHYの単位転送時間
TX Data length=251[byte]としたときの、送信ペイロード転送時間は
LE 1M PHY:(251 + 1 + 4 + 2 + 4 + 3) * 8 / 1[us] = 2120[us]
LE 2M PHY:(251 + 2 + 4 + 2 + 4 + 3) * 8 / 0.5[us] = 1064[us]
となります。
LE 1M PHY プリアンブル:1bit
LE 2M PHY プリアンブル:2bit
アクセスアドレス:4bit
ヘッダ:2bit
MIC:4bit
CRC:3bit
よって、1回の通信にかかる時間は、
LE 1M PHY: 2120 + 150 + 80 + 150 = 2500[us]
LE 2M PHY: 1064 + 150 + 44 + 150 = 1408[us]
n回目のデータ送信後からn+1回目のデータを送信するまでの時間は
Connection interval - 送信ペイロード転送時間
となります。
よって、Connection interval毎に最低1回データを送信するためには、上記の式がバッファ時間より長くする必要があります。
LE 1M PHY、LE 2M PHYにおいてTx Data length=251[byte]の場合
Connection interval - 送信ペイロード転送時間 > バッファ時間
LE 1M PHY:Connection interval > 5200 + 2120 = 7320[us]
LE 2M PHY:Connection interval > 5200 + 1064 = 6264[us]
となり、LE 1M PHY、LE 2M PHYどちらの場合においても、Connection intervalの最低値7500[us]で間に合うことがわかります。
また、Connection interval=7500[us]において、バッファに1回の通信分以上のデータが溜まることがわかります。
1回のConnection intervalで連続してデータを送信を行うための条件を実測値から以下のように推測しました。
Connection interval - 通信時間 > 送信ペイロード転送時間 + IFSの時間 + 受信ペイロード転送時間 + 1400[us]
上記の条件を満たしており、バッファに1回以上の通信データがある場合に連続してデータを送信すると考えられました。
Connection interval=7500[us]において、LE 1M PHY、LE 2M PHYともに1回通信後に連続してデータを送信することができます。
よって、バッファにデータが溜まった場合は、2回の通信を行い効率よくデータを送信することができます。
次にLE Coded PHYのConnection intervalの最適値を求めます。
ATT_MTU size=23[byte]、TX Data length=27[byte]としたときの、
バッファに入れるためにかかる時間は3122[us]でした。
LE Coded PHY S=8がData length=27[byte]が1回のデータをペイロードに転送するためにかかる時間は以下の式となります。
(プリアンブル + アクセスアドレス + CI + TERM1 + ((Data length + ヘッダ + MIC) * 8 + CRC + TERM2) * S) * PHYの単位転送時間
= (80 + 256 + 16 + 24 + ((27 + 4 + 2) * 8 + 24 + 3) * 8) * 1[us]
= 2704[us]
プリアンブル:80bit
アクセスアドレス:256bit
CI:16bit
TERM1:24bit
ヘッダ:2bit
MIC:4bit
CRC:24bit
TERM2:3bit
LE Coded PHYでデータを送信するために必要な時間は以下の式となります。
データ送信時間 + IFSの時間 + ACKの時間 + IFSの時間
= 2704 + 150 + 720 + 150
= 3724[us]
よって、バッファに入れる時間よりもデータを送信する時間の方が長いため、連続してデータを送ることができます。 Connection intervalが長いほど連続してデータを送信することができるが、PHYの変更やData lengthの変更時に同じConnection intervalの時間がかかるため、 LE Coded PHY選択時のConnection intervalは400[ms]としました。
LE 1M PHY、LE 2M PHYのスループットについて
LE 2M PHYはLE 1M PHYと比較してより高速にデータを送受信できますが、 今回の条件ではarmadilloからUSB経由でnRF52のバッファにデータを送る速度が、LE 1M PHYのデータ送信に必要な時間よりも下回っていたため、 LE 1M PHY、LE 2M PHYの間に速度差がでなかったと考えられます。