🛜

[Core Bluetooth] アドバタイジングデータを最大255バイトに拡張するAdvertising Extensions

2024/05/07に公開

Advertising Extensions (アドバタイジングエクステンション)は、Bluetooth 5.0の機能で、それ以前 [1]アドバタイジングパケットのペイロード容量は31バイトだったのが、255バイトにアップする、というもの。つまり、8倍以上の情報を含むことが可能 [2] となる。

BLEを用いたアプリケーションやアクセサリを開発したことがあれば、この拡張はめちゃくちゃ画期的であることがわかると思う。これまではサービスUUIDひとつ載せるのすら悩ましかったので…

https://note.com/shu223/n/n2a8679e4435e

このAdvertising Extensionsのサポートについて、WWDCでの解説 [3] をベースに紹介していく。

3つの改善ポイント

Advertising Extensions は、アドバタイジングの3つのポイントを改善したもの。以下にそれぞれ解説する。

1. Extended advertisement

"Extended advertisement"について、WWDC 2019の同セッションでは、次のように解説している:

It essentially improves upon three main points for advertising. The first is it eases the congestion on the three advertising channel by sending a smaller payload on the advertising channel, then jumping to the more spacious data channel to transmit a much larger payload. Up now from 31 to 255 bytes, and the transmission rate itself can now be in LE 2 Mbps.
(3つのアドバタイジングチャンネルの混雑を緩和することで、アドバタイジングチャンネルでより小さなペイロードを送信し、その後、より広々としたデータチャンネルにジャンプしてより大きなペイロードを送信することです。現在、31バイトから255バイトにアップし、伝送速度自体もLE 2Mbpsにすることができます。)

画像
WWDC 2019 "What's New in Core Bluetooth" より

アドバタイズの拡張ということで、ペイロードが31バイトから255バイトにアップした、ということはわかるが、チャンネル云々については図も解説も正直わかりにくい…

この点についてはChatGPTに聞きつつ理解が進んだので、補足説明パートで後述する。

2. Extended Scan

Extended advertisementsをスキャンする側の話。同セッションでは次のように解説されている:

but we will only scan for our extended advertisements that are transmitted in LE 2 Mbps. So, if you're developing an accessory, your accessory must also support extended advertisement with LE 2 Mbps.
(が、LE 2 Mbpsで伝送される当社のextended advertisementsのみをスキャンすることになります。ですから、アクセサリーを開発する場合は、そのアクセサリーもLE 2Mbpsのextended advertisementsに対応している必要があります。)

これもわかりにくい。"only scan for our extended advertisements that are transmitted in LE 2 Mbps"が、具体的にどういう制約なのかがイメージしにくかった。(こちらも補足説明パートにて補足)

We now support extended advertisement payloads up to 124 bytes. This is four times the amount of advertisement data that an accessory can send us today.
(我々は現在、最大124バイトの extended advertisement ペイロードをサポートしています。これは、現在アクセサリから送信できる広告データの4倍の量です。)

Bluetooth 5.0の仕様では255バイトまでだが、どういう理由か、Core Bluetoothでは最大124バイトとなるらしい。

This is again transparent to your application. You can use the same scan API, scan filters. We would scan for both legacy and extended advertisements.
(これは、お客様のアプリケーションにとって再び透過的なものです。同じスキャンAPI、スキャンフィルターを使用することができます。レガシー広告と拡張広告の両方をスキャンすることになります。)

アプリケーション側では実装を変更することなく、透過的にこの新機能をサポートすることになるようだ。(ここでいう「スキャンフィルター」は、Core Bluetoothにおける scan メソッドで、サービスUUIDを指定してスキャン対象をフィルタリングできるようになっていることを指していると思われる)

本機能をサポートしているかどうかを、以下の新API(iOS 13 / watchOS 6以降)で確認できる。

class func supports(_ features: CBCentralManager.Feature) -> Bool 
static var extendedScanAndConnect: CBCentralManager.Feature { get }

なお、本機能はiPhone XS, 新しいiPad Pro(2019年6月時点での)でサポートされているとのこと [4]

3. Extended Connection

Extended Connectionは、extended advertisementに接続できることを意味する。

WWDC 2019の同セッションでは、このExtended Connectionが既存のコネクション交換プロトコルをどう改良することで実現されているかの解説があるが、開発者がそのあたりを意識することは基本的にはないため(そのレイヤーはCore Bluetooth内部で制御されており、アプリ開発者がどうこうするAPIはない)本記事では割愛する。

画像
What's New in Core BluetoothにおけるExtented Connectionsの解説

Extended Connectionははよりロバストで電力効率に優れている、という点だけ認識しておけばよいかと。

こちらもアプリケーション側では実装を変更することなく、従来のconnect APIを使用するだけで、透過的にこの新機能をサポートすることになる。

またサポート状況は前述の新APIで確認できる。

class func supports(_ features: CBCentralManager.Feature) -> Bool 
static var extendedScanAndConnect: CBCentralManager.Feature { get }

補足説明

Extended advertisementがペイロードの拡張を実現しているしくみ

WWDCの以下の説明がわかりにくかった:

It essentially improves upon three main points for advertising. The first is it eases the congestion on the three advertising channel by sending a smaller payload on the advertising channel, then jumping to the more spacious data channel to transmit a much larger payload. Up now from 31 to 255 bytes, and the transmission rate itself can now be in LE 2 Mbps.(3つのアドバタイジングチャンネルの混雑を緩和することで、アドバタイジングチャンネルでより小さなペイロードを送信し、その後、より広々としたデータチャンネルにジャンプしてより大きなペイロードを送信することです。現在、31バイトから255バイトにアップし、伝送速度自体もLE 2Mbpsにすることができます。)

このへんの、「Extended advertisementがペイロードの拡張を実現しているしくみ」について、ChatGPTに説明してもらった:

アドバタイジングエクステンションは、基本的なアドバタイジングパケット(これは引き続き31バイトのペイロードを持つ)に"ポインタ"を追加します。このポインタは、追加のアドバタイジングデータが含まれている場所、すなわち"補助"アドバタイジングチャンネルについて指示します。

この補助アドバタイジングチャンネルで送信されるデータパケットのペイロードは、最大255バイトになります。

つまり、従来と同じ31バイトのペイロードを使うことには変わりないのだが、そこには追加データを持つ補助アドバタイジングチャンネルへの「ポインタ」を格納しておき、必要に応じてセントラル側デバイスがそのポインタに従って追加データのある補助アドバタイジングチャンネルにアクセスする、という仕組みらしい。この補助アドバタイジングチャンネルで送信されるデータパケットのペイロードが、最大255バイトとなる。

多くのデータを電波として発信すれば結局は電力を消費してしまうわけで、実際には従来どおり最大31バイトだけをアドバタイズし、必要に応じて追加データにアクセスしてもらう、ということでLow Energy視点からも合点の行く仕様だ。

"Exteneded advertisement" とオーバーフロー領域

Extended advertisementの仕様を読んでいて脳内をよぎったのが、AppleがCore Bluetoothにて従来から実装していた、「オーバーフロー領域」(overflow area)の存在。

https://note.com/shu223/n/n41b509021e21

詳しい中身については公式には発表されてないが、これも同じような方式を取っていたと思われる。

オーバーフロー領域はApple独自規格だったのでAndroidや他のBLEデバイスからアクセスすることができなかったが、今回Extended advertisementとして公式のBluetooth規格に拡張仕様が採用されたことは非常に喜ばしい。

Extended ScanとLE 2 Mbps

WWDCで言及されていた以下の点の補足:

we will only scan for our extended advertisements that are transmitted in LE 2 Mbps.
(LE 2 Mbpsで伝送される当社のextended advertisementsのみをスキャンすることになります。)

これまたChatGPTに聞いた話なのだが [5]

  • Extended Advertisingと2 Mbpsの通信速度を実現するための新しい物理層(PHY)の2つの新機能は互いに独立したものではあるが、同時に使用することで、デバイス間の通信のパフォーマンスを大幅に向上させることができる。

  • 引用されたWWDC 2019のセッションでは、AppleはiOSデバイスがExtended Advertisingをスキャンするときに、それが2 MbpsのPHYを使用している場合のみスキャンすると明らかにしている。つまり、アクセサリーがiOSデバイスと最適に通信するためには、Extended Advertisingと2 Mbps PHYの両方をサポートする必要がある、ということを指している。

ということらしい。

あとで調べる

  • Extended advertisementはバックグラウンドではどうなのか?

    • 同じく最大124バイトまでいけるのか、以前と同様あるいは別の制約を受けるのか
  • Extended advertisementが利用できていること確認する

    • Core Bluetooth / iOS ではアドバタイズメントデータの全要素にはアクセスできない
    • ペリフェラル側で指定できるアドバタイズメントデータの要素はさらに限定されている
    • 長めのローカル名と、128-bit のサービスUUIDを複数個載せて試してみる?
  • Extended advertisementは、iBeaconにはどう影響するか?

(参考になったら♥️を押していただけるととても嬉しいです!)

脚注
  1. Bluetooth 4.2まで。 ↩︎

  2. 後述するが、Core Bluetoothではこれが124バイトまでになるようだ。 ↩︎

  3. WWDC 2019の「Whats' New in Core Bluetooth」セッションで、同機能の発表と解説があった。 ↩︎

  4. ハードウェア要件はBluetooth 5.0以上だと思うので、おそらくこれ以降のデバイスは基本的に本機能をサポートしているはず。 ↩︎

  5. この点に関しては(公開されているBluetoothの規格の話と違って)ChatGPTも質問している筆者もiOSの中身やAppleの内情を知っているわけではないので、話半分程度に。 ↩︎

Discussion