Generic Access Profile(GAP)
GAP(Generic Access Profile)は、Bluetooth Low Energy(BLE)デバイスが互いを検出し、接続し、通信する方法を制御する一連のルールです。
BLE の通信タイプ
BLE は、通信するための主な方法として 接続型通信 と ブロードキャスト通信 の 2 つをサポートしています。
接続型通信 : 2 台のデバイスが直接接続を確立し、双方向にデータを送受信できるようになります。たとえば、スマートウォッチがスマートフォンに接続し、心拍数、通知、歩数などのデータを継続的に共有します。
ブロードキャスト通信: デバイスは、直接接続を確立せずに、近くにあるすべてのデバイスにデータを送信します。たとえば、店舗内の Bluetooth ビーコンは、通信範囲内にあるすべてのスマートフォンに販促メッセージをブロードキャストします。
デバイスのロール
これらのロールは、現実世界の人間同士のコミュニケーションのように考えるとわかりやすいです。会話における役割によって人の関わり方が変わるのと同様に、Bluetooth Low Energy(BLE)デバイスにもそれぞれ固有のロールがあります。
📢 ブロードキャスター(コネクションレス): 情報(アドバタイズメント)を送信しますが、接続はできません。
たとえば、ショッピングモール内のビーコンは、近くにあるスマートフォンに割引情報を継続的に送信します。スマートフォンはその情報を受信できますが、ビーコンには接続できません。
📡 オブザーバー(コネクションレス): Bluetooth アドバタイズメントを受信しますが、他のデバイスに接続することはできません。
たとえば、スマートフォンアプリが近くの店舗を検出するためにビーコンをスキャンしても、それらに接続はしません。
📱 セントラル(コネクション指向): このデバイスは他のデバイスを探索し、それらに接続したり、アドバタイズメントデータを読み取ったりします。通常は、より高い処理能力と多くのリソースを備えています。同時に複数の接続を処理できます。
たとえば、スマートフォンはスマートウォッチ、フィットネストラッカー、ワイヤレスイヤホンに同時に接続できます。
⌚ ペリフェラル(コネクション指向): このデバイスはアドバタイズメントをブロードキャストし、セントラルデバイスからの接続要求を受け入れます。 たとえば、フィットネストラッカーは自身をアドバタイズすることで、スマートフォンがそれを見つけて接続し、健康データを同期できるようにします。
BLE ペリフェラルの検出モードとアドバタイズメントフラグ
BLE ペリフェラルは複数の検出モードを取ることができ、それによってセントラルデバイスからどのように検出されるかが変わります。これらのモードは、アドバタイジングパケット内のアドバタイズメントフラグを使用して設定します。
検出モード
-
非発見可能
- アドバタイジングが有効でないとき、または接続が確立されたときのデフォルトモードです。
- 発見も接続もできません。
-
制限付き発見可能
- 省電力のため、限られた時間だけ 発見可能になります。
- 接続が確立されない場合、デバイスはアイドル状態になります。
-
一般発見可能
- 接続が確立されるまで、無期限に アドバタイズします。
アドバタイズメントフラグ
これらのフラグは、検出モードと BLE のサポートレベルを示します。ビット単位 OR(|)を使って組み合わせます。
| Bit | Description |
|---|---|
| 0 | 制限付き発見可能モード(一時的なアドバタイジング)。 |
| 1 | 一般発見可能モード(無期限にアドバタイズ)。 |
| 2 | デバイスが Bluetooth Classic(BR/EDR)をサポートしていない(またはサポートしたくない)場合に設定します。 |
| 3 | デバイスが Bluetooth Low Energy(LE)と Classic Bluetooth を同時に使用できる場合に設定します(Controller レベル)。 |
| 4 | デバイスが Bluetooth Low Energy(LE)と Classic Bluetooth を同時に実行できる場合に設定します(Host レベル)。 |
| 5-7 | 予約済み |
後で Bluetooth には softdevice crate を使用します。これは、アドバタイズメントフラグを渡せるアドバタイズメントビルダーを提供します。
たとえば、ペリフェラルを無期限にアドバタイズし、Bluetooth Classic をサポートしないことを示すには、次のように設定します。
#![allow(unused)] fn main() { LegacyAdvertisementBuilder::new() .flags(&[ Flag::GeneralDiscovery, // 0b0000_0010 (ビット 1 を設定) Flag::LE_Only, // 0b0000_0100 (ビット 2 を設定) ]) }
指向性アドバタイジングと無指向性アドバタイジング
アドバタイズメントが、特定のセントラルデバイス向けなのか、近くにある任意のデバイス向けなのかを示します。
-
無指向性: 近くにいる任意のセントラルまたはオブザーバーに送信されます。ペリフェラルが任意のデバイスからの接続を受け付ける場合に使用します。
-
指向性: Bluetooth アドレスで識別される 1 台の特定のセントラルに送信されます。応答できるのはそのデバイスだけです。
接続可能アドバタイジングと非接続可能アドバタイジング
これにより、セントラルデバイスがペリフェラルとの接続を開始できるかどうかが決まります。
-
接続可能: セントラルはペリフェラルに接続要求を送信できます。
-
非接続可能: ペリフェラルはアドバタイズメントを送信するだけで、接続要求は受け入れません。
スキャン可能アドバタイジングと非スキャン可能アドバタイジング
セントラルがスキャン要求を介してペリフェラルから追加情報を要求できるかどうかを定義します。
-
スキャン可能: ペリフェラルはスキャン要求を受け入れ、追加情報(scan response)で応答します。
-
非スキャン可能: ペリフェラルはスキャン要求に応答しません。
例
nrf-softdevice crate でデバイスを接続可能、スキャン可能、かつ無指向性(つまり近くにいる任意のセントラルから見える状態)にするには、次のように記述します。
#![allow(unused)] fn main() { peripheral::ConnectableAdvertisement::ScannableUndirected { adv_data: &ADV_DATA, scan_data: &SCAN_DATA, } }
これにより、SoftDevice は任意のセントラルデバイスからの接続要求を受け付け、スキャン要求に追加データで応答し、特定のデバイスを対象にせず近くにいるすべてのデバイスに対してアドバタイズします。