[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の同セッションでは、次のように解説している:
アドバタイズの拡張ということで、ペイロードが31バイトから255バイトにアップした、ということはわかるが、チャンネル云々については図も解説も正直わかりにくい…
この点についてはChatGPTに聞きつつ理解が進んだので、補足説明パートで後述する。
2. Extended Scan
Extended advertisementsをスキャンする側の話。同セッションでは次のように解説されている:
これもわかりにくい。"only scan for our extended advertisements that are transmitted in LE 2 Mbps"が、具体的にどういう制約なのかがイメージしにくかった。(こちらも補足説明パートにて補足)
Bluetooth 5.0の仕様では255バイトまでだが、どういう理由か、Core Bluetoothでは最大124バイトとなるらしい。
アプリケーション側では実装を変更することなく、透過的にこの新機能をサポートすることになるようだ。(ここでいう「スキャンフィルター」は、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はない)本記事では割愛する。
Extended Connectionははよりロバストで電力効率に優れている、という点だけ認識しておけばよいかと。
こちらもアプリケーション側では実装を変更することなく、従来のconnect APIを使用するだけで、透過的にこの新機能をサポートすることになる。
またサポート状況は前述の新APIで確認できる。
class func supports(_ features: CBCentralManager.Feature) -> Bool
static var extendedScanAndConnect: CBCentralManager.Feature { get }
(参考になったら「スキ」を押していただけるととても嬉しいです!)
以下、補足説明パート:
補足説明
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/