Core Bluetoothのアドバタイジングデータの制約

Core Bluetoothのアドバタイジングデータ(advertising data)について、あれは何バイトまでだっけ、公式ドキュメントにはどこかに書いてたんだっけ、というのをメモしていく。


Resources

Core Bluetoothの仕様というよりBLE自体の規格で定められている制約も多いのだがBluetooth Specificationのドキュメントまではあたっていない。

アドバタイジングデータに指定できる項目

Manufacturer Dataって指定したらちゃんとアドバタイズされるんだっけ?というのを以前試していたが、普通に明記されてた。

The peripheral manager only supports two keys: CBAdvertisementDataLocalNameKey and CBAdvertisementDataServiceUUIDsKey.

アドバタイジングデータの最大サイズ

フォアグラウンドでは最大28バイト。

Core Bluetooth advertises data on a “best effort” basis, due to limited space and because there may be multiple apps advertising simultaneously. While in the foreground, your app can use up to 28 bytes of space in the initial advertisement data for any combination of the supported advertising data keys.
(Core Bluetoothは、スペースが限られていることと、複数のアプリが同時に広告する可能性があることから、「ベストエフォート」ベースでデータをアドバタイズしています。フォアグラウンドにいる間、アプリはサポートされているアドバタイジングデータキーの任意の組み合わせのために、最初の広告データで最大28バイトのスペースを使用することができます。

Local Nameの追加領域

アドバタイジングデータのペイロードのサイズが28バイトを超えた場合でも、Local Name用に追加の10バイトを利用することができる。

If no this space remains, there’s an additional 10 bytes of space in the scan response, usable only for the local name (represented by the value of the CBAdvertisementDataLocalNameKey key). Note that these sizes don’t include the 2 bytes of header information required for each new data type.
(この領域が残っていない場合、scan responseには、ローカル名(CBAdvertisementDataLocalNameKeyキーの値で表される)のためにのみ使用可能な、追加の10バイトの領域があります。これらのサイズには、新しいデータ型ごとに必要な2バイトのヘッダー情報は含まれていないことに注意してください。))

Scan Responseとは

※出典はChatGPTなので、正しくない部分があるかもしれません

Bluetooth Low Energy (BLE)のScan Responseは、BLEデバイスがAdvertisingパケットを送信するときに、Scan Responseパケットを返すことができる機能です。Advertisingパケットには、デバイスの識別子や機能などの情報が含まれています。Scan Responseパケットは、Advertisingパケットに含まれない追加の情報を提供することができます。

具体的には、BLEデバイスがAdvertisingパケットを送信すると、受信側のデバイスはScan Requestパケットを送信し、Scan Responseパケットを要求します。BLEデバイスはScan Requestパケットを受信すると、Scan Responseパケットを返し、Advertisingパケットに含まれない詳細な情報を提供することができます。

Scan Responseパケットに含まれる情報は、Advertisingパケットと同じく、特定のサービス、プロファイル、またはキャラクタリスティックに関連するUUID、デバイスの名前、製造元情報、またはその他の任意のデータを含むことができます。ただし、Scan ResponseパケットのサイズはAdvertisingパケットよりも小さいため、追加情報は制限されます。

バックグラウンドでのアドバタイズ

  • Local Nameはアドバタイズされない

  • すべてのService UUIDはオーバーフロー領域に置かれる

    • → 明示的にスキャンしないと検出できない

While your app is in the background, the local name isn’t advertised and all service UUIDs are in the overflow area.
(アプリがバックグラウンドにある間は、ローカル名はアドバタイズされず、すべてのサービスのUUIDはオーバーフロー領域に置かれます。)

サービスUUIDとオーバーフロー領域

アドバタイジングデータに収まらない Service UUID は、オーバーフロー領域に格納される。

Any service UUIDs contained in the value of the CBAdvertisementDataServiceUUIDsKey key that don’t fit in the allotted space go to a special “overflow” area.
((CBAdvertisementDataServiceUUIDsKey キーの値に含まれるサービス UUID で、割り当てられたスペースに収まらないものは、特別な「オーバーフロー」領域に移動します。)

オーバーフロー領域の制約

この領域にある Service UUID は、スキャン時に明示的に UUID を指定してスキャンする場合のみ検出可能。

These services are discoverable only by an iOS device explicitly scanning for them.
(これらのサービスは、iOSデバイスが明示的にスキャンすることによってのみ検出可能です。)

その他

ここから先は

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

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

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