見出し画像

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

WWDC 2019の「Whats' New in Core Bluetooth」セッションで、Advertising Extensionsという新機能の発表があった。

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

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

このAdvertising Extensionsのサポートについて、前述のWWDCセッションの解説をベースに紹介していく。

なお、同セッションで紹介されていた「LE 2 Mbps」については別記事に書いたのでそちらもぜひ参照してください:


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" より
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に対応している必要があります。)

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

これもわかりにくい。"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倍の量です。)

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

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、スキャンフィルターを使用することができます。レガシー広告と拡張広告の両方をスキャンすることになります。)

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


アプリケーション側では実装を変更することなく、透過的にこの新機能をサポートすることになるようだ。(ここでいう「スキャンフィルター」は、Core Bluetoothにおけるスキャンメソッドで、サービス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月時点での)でサポートされているらしい。これ以降のデバイスのサポートについては要調査。

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 }

(参考になったら「スキ」を押していただけるととても嬉しいです!)

以下、補足説明パート:

補足説明

ここから先は

2,508字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/