【サルでもわかるBLE入門】(16)アドバタイズとスキャン

こんにちは。ムセンコネクト三浦です。
今回も「サルでもわかるBLE入門」と銘打ってお話していこうと思います。
Bluetooth LE(BLE)初心者の方でも理解をしてもらえるように、できるだけわかりやすく解説していきます。
第16回は、ペリフェラルデバイスとセントラルデバイスが接続通信(GATT通信)をする前の基本的なプロセスとなる「アドバタイズ」と「スキャン」について深堀りしていきます。
子機であるペリフェラルデバイスが「私はここにいるよ」と周囲に自分の存在を伝えるのに利用するのが「アドバタイズ」、親機であるセントラルデバイスが周囲の「アドバタイズ」を見つけるために利用するのが「スキャン」です。
わかりやすく解説する為に、Bluetooth® LE(BLE)初心者にはあまり必要ない例外的な内容は省略して説明するようにしています。あえてアバウトに書いている部分もありますのでご承知おきください。
(厳密な技術的内容を知りたいような方は別の解説書を参考にしてください。)
アドバタイズ
アドバタイズとは、ペリフェラルデバイスが自身の存在を周囲に知らせるために定期的に送信するブロードキャストパケットです。
このパケットは、デバイス名や提供するサービスの情報など、セントラルデバイスが接続するか判断するために必要な情報を含んでいます。

アドバタイズパケットは、アドバタイズインターバルと呼ばれる一定の周期ごとに送信されます。この周期は20ミリ秒から10.24秒までの範囲で設定可能で、値が短いほどセントラルデバイスから早く発見されやすくなりますが、その分、電波を送信する頻度が増加するため、消費電力も大きくなります。
また、複数のデバイスが全く同じタイミングでアドバタイズを行ってしまい、衝突が連続してしまうことを防ぐために、アドバタイズインターバルに0から10ミリ秒のランダムな遅延(ディレイ)時間を追加する決まりがあります。
アドバタイズの発信タイミングがランダムにずれることで衝突を回避し、デバイス発見の成功率向上に役立ちます。

Bluetooth LEは、データ通信に使う37個のチャネル(0〜36ch)とは別に、アドバタイズ専用の3つのチャネル(37ch、38ch、39ch)を使用します。
これらのチャネルは互いに隣接しておらず、データ通信チャネルとの干渉を最小限に抑えることで、デバイス発見の信頼性を高めています。


ペリフェラルデバイスがアドバタイズを「1発(1回)」発信する時、37ch、38ch、39chの3つのチャネルに対して連続的にパケットを発信しています。
概念的に「1発(1回)」と思っていたアドバタイズは、実は3つのチャネルそれぞれの1発ずつ送信しているので、実際には「3発」発信しているということになります。

スキャン
セントラルデバイスは、アドバタイズパケットを受信するために「スキャン」を行います。
SCAN_REQとSCAN_RSP
スキャンについて詳しい説明をする前に、先にSCAN_REQ(スキャンリクエスト)とSCAN_RSP(スキャンレスポンス)について説明します。
セントラルデバイスと、ペリフェラルデバイスにおけるアドバタイズのプロセスはこのようなシーケンスとなります。

加えて、オプション的に「スキャン応答」というプロセスがあります。ADV_INDを受けたセントラルデバイスが、ペリフェラルデバイスに対して追加情報を要求することができます。
セントラルデバイスが追加情報を要求することをスキャンリクエスト(SCAN_REQ)、ペリフェラルデバイスがそれに答えて追加情報を送信することをスキャンレスポンス(SCAN_RSP)と呼びます。
これにより、アドバタイズパケットに入りきれなかった情報をスキャンレスポンスパケットに含めて発信することが出来、ペリフェラルデバイスが発信する情報量を増やすことができます。

パッシブスキャンとアクティブスキャン
スキャンには、パッシブスキャン(Passive Scanning)とアクティブスキャン(Active Scanning)という二つのモードがあります。
パッシブスキャンでは、セントラルデバイスはスキャン実施中に見つかったアドバタイズ(ADV_IND)に対してスキャンリクエスト(SCAN_REQ)を送信しません。アドバタイズパケットで送信される電波を単純に受信するだけです。
仮に、ペリフェラルデバイスがスキャン応答(SCAN_RSP)に重要なデータを含んでいた場合は、パッシブスキャンをしているセントラルデバイスはそれを受け取る事ができません。
一方、アクティブスキャンでは、セントラルデバイスはスキャン実施中に見つかったアドバタイズ(ADV_IND)に対してスキャンリクエスト(SCAN_REQ)を送信します。
これにより、ペリフェラルデバイスからスキャン応答(SCAN_RSP)を受信でき、より多くの情報を取得できるという利点がありますが、スキャンリクエスト(SCAN_REQ)を送信する必要があるため、パッシブスキャンよりも消費電力が高くなります。
スキャンパラメータ
セントラルデバイスのスキャン動作は、スキャンインターバル(Scan Interval)とスキャンウィンドウ(Scan Window)という二つのパラメータによって制御されます。
- スキャンインターバル(Scan Interval)
-
セントラルデバイスがスキャンを開始する周期時間です。スキャン開始時点から、次のスキャン開始時点までの時間間隔を指します。
- スキャンウィンドウ(Scan Window)
-
スキャンインターバルの時間の中で、実際に電波を受信し続ける(スキャンを実行する)時間を指します。

これらのパラメータは0.625ms単位で定義され、Scan Windowは常にScan Interval以下でなければなりません。
スキャンインターバルに対するスキャンウィンドウの比率が高いほど、電波の受信を待っている時間が長くなり消費電力が大きくなります。逆にスキャンインターバルに対するスキャンウィンドウの比率が低いと、電波の受信を待っている時間が短くなり、スキャンを実施していてもアドバタイズパケットがなかなか受信できなくなります。
スキャンの周波数
スキャンもアドバタイズと同様に37ch、38ch、39chのチャネルで行われます。
以下のようにスキャンインターバル経過毎に、スキャンするチャネルを切り替えます。

アドバタイズパケットは37ch、38ch、39chのそれぞれのチャネルで発信されますので、いずれかのチャネルで発信されたパケットが受信されることが期待されます。
アドバタイズの4つのタイプ
アドバタイズには、その目的と性質に応じて4つのタイプが存在します。
これらは、そのパケットが「接続可能か (Connectable)」、「スキャン応答可能か (Scannable)」、「特定の相手向けか (Directed)」という3つの属性の組み合わせによって定義されます。
パケットタイプ | Connectable | Scannable | Directed | ユースケース例 |
---|---|---|---|---|
ADV_IND | ◯ | ◯ | ー | 一般的なデバイス発見、接続可能。 スキャン応答によって詳細情報を公開できる |
ADV_NONCONN_IND | ー | ー | ー | 接続不可。 ビーコン、一方的なデータ送信。 |
ADV_SCAN_IND | ー | ◯ | ー | 接続不可。 スキャン応答によって詳細情報を公開できる |
ADV_DIRECT_IND | ◯ | ー | ◯ | 迅速な再接続、セキュリティ重視 |
ADV_IND (Connectable Undirected)
最も一般的で汎用的なアドバタイズです。属性は「接続可能、スキャン応答可能、特定の相手向けではない」です。周囲のどのセントラルデバイスに対しても「誰でもどうぞ、私に接続していいですよ」と呼びかけるパケットです。
Bluetooth LEの接続通信(GATT通信)を行うペリフェラルデバイスは、このADV_INDを使用します。セントラルデバイスはこのパケットを受信した後、必要に応じて後述するスキャンリクエストを送信し、追加情報を取得することができます。
ADV_NONCONN_IND (Non-connectable Undirected)
単に情報をブロードキャストするだけのデバイスが使用します。属性は「接続不可、スキャン応答不可、特定の相手向けではない」です。接続を受け付けないので、アドバタイズを一方的に発信する『ビーコン』として利用する場合に利用します。
主なユースケースは、iBeaconのようにID情報を発信するビーコン機器や、センシングしたセンサデータをビーコンで送信するビーコンセンサなどです。ペリフェラルデバイスは接続やスキャンリクエストを受け付けないため(電波を受信する必要がないため)、電力消費が少なくて済みます。
ADV_SCAN_IND (Scannable Undirected)
単に情報をブロードキャストするだけのデバイスが使用します。このタイプは「接続不可、スキャン可能、特定の相手向けではない」という属性を持ちます。このパケットは、接続自体は受け付けませんが、追加情報のリクエストには応答します(スキャン応答)。
セントラルがスキャンリクエスト(SCAN_REQ)を送信すると、ペリフェラルはスキャンレスポンス(SCAN_RSP)を返信します。スキャンレスポンスには、追加の情報を含めることができますので、接続を確立せずに、デバイス名やサービスUUIDといった追加情報を公開できます。
ADV_DIRECT_IND (Connectable Directed)
このタイプは「接続可能、スキャン応答不可、特定の相手向け」という属性を持ちます。このパケットは、特定のセントラルデバイス(例えば、以前ペアリングしたスマートフォン)にのみに宛てて送信されます。
パケット内に宛先のアドレス情報が含まれているため、相手が見つかれば迅速に接続を確立できます。BluetoothマウスがPCとの接続が切れた後、再接続しようとするケースなどが典型的な使用例です。
まとめ
今回は、ペリフェラル側のアドバタイズとセントラル側のスキャンのプロセスについて詳しく見ていきました。
ペリフェラルのアドバタイズパラメータ、セントラルのスキャンパラメータはそれぞれ単純でわかりやすく設計されており、通信の必要ない時は電波の送信・受信を抑えて、消費電力を減らすことができます。
通信性能(スキャンによるアドバタイズの発見頻度)と消費電力はトレードオフの関係にあります。システムに合わせてどちらを優先するか自由に設計できるのもBluetooth LEの特徴のひとつです。
次回もBluetooth LE(BLE)の技術要素について深堀りしてお話したいと思います。