Bluetooth Low Energyのスピード(★★)

Bluetooth Low Energyでは、低消費電力にするために、スピードを犠牲にしています。
たとえば、無線LANでは100Mbpsなどを達成するために、時間あたりのデータを多く送る作りになっています。送信時、受信時とも200mAくらいの電流が必要です。
しかし、Bluetooth Low Energyでは、ゆっくり送っているため、送信時、受信時ともに10mA程度ですんでいます。

Bluetooth Low Energyでは、上位プロトコルのいろいろな制限があります。そのため、物理レイヤでのスピードだけを見て、製品を設計してしまうと、実際にスピードがでないということになります。

スピードを計算する前に、まず、下記に制限を示します。

  • 制限1
    上位プロトコルの制限の1つは、データは、Connection Eventごとにやりとりしなければならないというものです。
    仕様では、最短で7.5msごとにConnection Eventを設定できます。
    ただし、iOS9では、最低のConnection Eventの間隔を30msに制限しています。Androidもバージョンによって、この値がいろいろ変わります。なお、Bluetooth ver5.0では、Connection Eventの間隔が長いほうがスピードが出ることもあり、この制限はなくなります。
  • 制限2
    上位プロトコルの制限のもう1つは、下記のように、L2CAP, ATTのヘッダー等があるため、ユーザーが使えるペイロードが7Byte短くなるということです。

    • L2CAP Length: 2 Byte
    • L2CAP CID: 2 Byte
    • ATT OpCode: 1 Byte
    • ATT Handle: 2 Byte
  • 制限3
    さらに、Android, iOS, Bluetooth Low Energyのデバイスでは、1回のConnection Eventで投げれるパケット数を制限しています。使っているBluetoothチップによりますが、iOS9, Android6.0など、ほとんどのものは6packetまでです。Bluetooth ver5.0になると、1回に送れるパケット数は増えます。

Ver4.1までのスピード

最短で7.5msごとにConnection Eventが来ます。また、1回のConnection Eventあたり6パケットを送信できます。1パケット内のユーザーデータは20Byteです。
そのため、1秒間に送れるパケット数は、下記のようになります。

(1/7.5ms) * 6 * 20Byte = 約15960 Byte/sec = 約128kbps

上記でも説明しましたように、iOS9では、最低のConnection Eventを30msに制限しているため、下記になります。
(1/30ms) * 6 * 20Byte = 4000 Byte/sec = 32kbps

Ver4.2でのスピード

Ver4.2からPDUのサイズが27Byteから251Byteになりました。
デバイスによって、Connection Eventごとにどれだけパケットを送れるかわからないため、最大は不明ですが、最低1パケットは送れるので、下記の計算となります。

(1/7.5ms) * 244Byte = 約32533 Byte/sec = 約260kbps

弊社の実測では、Nordicのデバイスどうしで、Connection Eventを7.5msにした時に460kbps、Connection Eventを50msにした時に630kbpsを確認しています(nordicどうしの場合は、Connection Eventが速度の邪魔になっていることがわかります)。実際のユースケースとしては、スマートフォン相手ですので、Connection Eventごとのパケット数が制限されるために、これより少なくなると思われます。

Ver5.0でのスピード

Ver5.0では、物理レイヤの速度が単純に2倍になっているので、スピードも2倍になります。
弊社の実測では、Ver5.0どおしで、PDUが251Byteの設定 (ATT_MTU=247Byte)において、Connection Eventを7.5msにした時に1039kbps、Connection Eventを400msにした時に1245kbpsを確認しています。
Android8.0(ASUS Zenfone5Z)との通信では、PHY:2Mbps, データサイズ:244Byte (ATT_MTU=247Byte)時に実測で1,331kbpsが出ています。
iOS11(iPhone8)との通信では、PHY:2Mbps, データサイズ:182Byte (ATT_MTU=185Byte)時に実測で289kbpsが出ています。
iOS11(iPhone8)の仕様ではATT_MTUが185Byteに制限されるため、スピードが出ません。