ビーコンの使用
Bluetooth の使用 への移動
ビーコンとは Bluetooth Low Energy デバイスで、https://www.bluetooth.org/en-us の『Bluetooth Specification Version 4.1(ページ 2023)』で記述されているように、広告データ、特に Manufacturer Specific Data(メーカー固有データ)内にある情報を含んでいます。この情報により、周囲のあらゆる Bluetooth LE デバイスはこのデバイスを特定し、ペアになったり接続を確立することなく、それに対する距離を計算することができます。
目次
ビーコンの概要
プラットフォーム サポート
プラットフォーム | サポート対象 |
---|---|
Windows(*) |
10 以上 |
macOS |
10.7 以上 |
iOS |
5 以上 |
Android |
4.3 以上 |
ビーコンの種類
次の 3 つのビーコンの形式が利用可能です:iBeacon、AltBeacon、Eddystone。RTL の ビーコン用 API は、TBeaconScanMode 型と TKindofBeacon 型を使用することにより、それらを区別しています。
監視対象となるビーコンで使用されている形式がわかっている必要があります。
ビーコンの形式 | 説明 | Mode |
---|---|---|
iBeacon |
Apple で定義された形式完全な仕様については、こちらから。 |
Standard |
AltBeacon |
オープン形式完全な仕様については、こちらから。 |
代替表現 |
Eddystone |
Google で定義されたオープン形式完全な仕様については、こちらから。 |
Eddystone |
メーカー情報
アドバタイズ モードの Bluetooth LE デバイスでは、さまざまなアドバタイズ データ(AD)タイプ構造のアドバタイズ データを無線で繰り返し送信します。アドバタイズ データの種類(AD タイプ)の 1 つが、ビーコンに利用される "Manufacturer Specific Data(メーカー固有データ)" です。ビーコンの形式に応じて、Manufacturer Specific Data に含まれるデータは異なります。
次の表では、各ビーコンの形式がアドバタイズすることができる、データ フィールドを示しています:
アドバタイズ データ | 説明 | iBeacon | AltBeacon | Eddystone |
---|---|---|---|---|
ビーコン グループ(たとえば、特定企業のビーコンなど)を識別する一意識別子です。 |
|
|
| |
Major ID は、UUID で定義されるリージョン内の部分領域を識別するものです。 |
|
|
||
Minor ID は Major ID 領域内のさらに一部分を指定します。 |
|
|
||
ビーコンまで 1 m 離れた位置で dBm 単位で測定される送信電力です。TxPower と 受信信号強度(RSSI)で、ビーコンまでのおおよその距離が計算されます。 |
|
|
| |
Eddystone フレーム
Eddystone フレームには、Service UUID が含まれており、これは、ID 0xFEAA
の ServiceData として知られています。
このフレームには、次の 3 つのサブ形式を受け入れます:
- EddystoneUID: ビーコンは、Namespace および Instance から構成される識別子をブロードキャストします。
- EddystoneURL: ビーコンは、短縮形式の URL をブロードキャストします。
- EddystoneTLM: ビーコンは、ビーコンのステータスに関連する 測定距離情報 をブロードキャストします。
詳細については、「Eddystone 仕様」を参照してください。
ビーコンの使用方法
RTL のビーコン API により、アプリケーションの動作デバイスとその周囲のビーコンとの Distance(距離)を取得できます。RTL のビーコン API では、定義されたリージョン内のビーコンの情報のみ提供します。Region は、ビーコンのグループです。リージョンは、UUID、MajorID、MinorID(iBeacons および AltBeacons の場合)、または、Namespace と Instance(Eddystone の場合)で、指定することができます。
TBeaconManager のインスタンスの取得
RTL のビーコン API を使用するには、アプリケーションに System.Beacon ユニットを組み込み、TBeaconManager インスタンスの取得に使用する TBeaconScanMode で TBeaconManager.GetBeaconManager を呼び出す必要があります。
iBeacon の場合:
BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Standard);
AltBeacon の場合:
BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Alternative);
Eddystone の場合:
BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Eddystone);
Extended の場合:
BeaconManager := TBeaconManager.GetBeaconManager(TBeaconScanMode.Extended);
ScanMode は、システムが検索する必要のある次のビーコンの種類を指定します: Standard Mode、Alternative Mode、Eddystone Mode または Extended mode。Extended モードでは、複数のビーコンの種類を同時にスキャンすることができます。TBeaconManager は、RTL のビーコン API を実装した主要クラスです。TBeaconManager では、リージョンの登録を担当し、ビーコンから情報を取得するためのイベントを管理します。TBeaconManager インスタンスは、Standard Mode、Alternative Mode、Eddystone Mode のいずれかで作成されなければなりません。
監視対象リージョンの登録
TBeaconManager.RegisterBeacons メソッドを使用すると、監視対象となるビーコンのリージョンを登録することができます。TBeaconsRegion 型のパラメータを渡して、ビーコンとリージョンについての情報を指定する必要があります。
BeaconManager.RegisterBeacons(ABeaconRegion);
iBeacons および AltBeacons の場合:
- TBeaconsRegion 型パラメータは、TiBAltBeaconRegion として設定されます。
- リージョンは、パラメータ UUID、MajorID、MinorID で指定されます。リージョンを登録する場合には、パラメータ UUID のみが必要となります。登録するリージョンをもっと具体的に指定する場合には、MajorID や MinorID、もしくは両方を使用することができます。
Eddystone の場合:
- TBeaconsRegion 型パラメータは、TEddysUIDRegion として設定されます。
- リージョンは、EddystoneUID 形式の場合には、Namespace と Instance で指定されます。リージョンを登録する場合には、パラメータ Namespace のみが必要となります。登録するリージョンをもっと具体的に指定する場合には、Namespace や Instance の両方を使用することができます。
ビーコンのスキャン
登録済みビーコンの場合: 以前のフレームワークは、次のことが必要でした:
未登録のビーコンの場合: スキャン パフォーマンスの新たな改善により、登録されてない複数種のビーコンも同時にスキャンできるようになりました。
- Extended モードを設定。
- 監視したい形式を、型 TKindofBeacon で選択。
- 監視するために選択したビーコンを、ModeExtended プロパティに設定。
- 未登録ビーコンの監視を開始。
- 未登録kビーコンの監視を停止。
検出したビーコンからの情報の取得
ビーコンに関する情報を取得するには、メインのビーコン インターフェイス(IBeacon)に、管理されているビーコンの種類を問い合わせます。その後、それぞれ特定のビーコンのインターフェイスを使用できます: iBeacon には IiBeacon、AltBeacon には IAltBeacon、Eddystone には IEddystoneBeacon。
監視対象ビーコンに関する情報の取得は、TBeaconManager に関連付けられているイベントを通じて行います。各ビーコンの形式では、特定のイベントのセットが用意されています:
- iBeacons および AltBeacons の場合:
- OnCalcDistance: Distance が計算される直前に実行されます。
- OnEnterRegion: 登録されているリージョン内のビーコンに初めて到達可能になったときに発生します。
- OnExitRegion: リージョンに登録されているすべてのビーコンが到達不能になったときに発生します。
- イベントがいったん発生すると、そのイベントから提供される情報を使用できます。
- 同じ UUID を持つすべてのビーコンに関連するイベントを受信するため、特定の UUID、MajorID = -1、MinorID = -1 でリージョンを登録します。
- 固有の UUID でリージョンを登録し、カスタム値とアプリケーション要件に従って MajorID と MinorID をフィルタリングするようにアプリケーションを設計する。
- Eddystone の場合:
- OnNewEddystoneURL: 新しい EddystoneURL ビーコンが見つかるたびに発生します。
- OnNewEddystoneTLM: 新しい EddystoneTLM ビーコンが見つかるたびに発生します。
- いずれの ビーコン形式に対して:
- OnCalculateDistances: ビーコンへの距離が計算される直前に発生します。
- OnBeaconEnter: 新しいビーコンのエリアに入るたびに発生します。
- OnBeaconsEnterRegion: 新しいビーコンがリージョン内で検知されるたびに発生します。ビーコンとリージョン情報の両方が、TBeaconsRegion 型で指定されます。
- OnBeaconExit: ビーコンのエリアから出るたびに発生します。
- OnBeaconsExitRegion: リージョン内で登録されたビーコンが失われるたびに発生します。ビーコンとリージョン情報の両方が、TBeaconsRegion 型で指定されます。
- OnBeaconProximity: 近接度(Proximity)の値が変化するたびに発生します。
例
以下のコード スニペットでは、OnBeaconEnter イベントの使用方法を示しています。このイベントから必要なビーコン情報を取得するには、次のステップをとります:
- メインの Beacon Interface に、監視対象のビーコンの種類について問い合わせます。これの終わりまで、KindofBeacon プロパティを使用します。
- 特定のインターフェイスについて問い合わせます:
- iBeacon について IiBeacon に
- AltBeacon について IAltBeacon
- Eddystone について IEddystoneBeacon
- このイベントをコーディングします。
procedure TForm1.Beacon1BeaconEnter(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
var
LEddyHandler: IEddystoneBeacon;
LiBeacon: IiBeacon;
LAltBeacon: IAltBeacon;
ST: string;
begin
case ABeacon.KindofBeacon of
TKindofBeacon.iBeacons:
if (Supports(ABeacon, IiBeacon, LiBeacon)) then
ST := ' GUID: ' + LiBeacon.GUID.ToString;
// code
TKindofBeacon.AltBeacons:
if (Supports(ABeacon, IAltBeacon, LAltBeacon)) then
ST := ' GUID: ' + LAltBeacon.GUID.ToString;
// code
TKindofBeacon.Eddystones:
if (Supports(ABeacon, IEddystoneBeacon, LEddyHandler)) then
ST := LEddyHandler.EddystoneUID.NamespaceToString;
// code
end;
位置情報サービスの追加
位置情報を使用するアプリケーションでは、位置情報サービスにより、携帯電話基地局、Wi-Fi、GPS、ビーコンなどから得られる情報を使用して、おおよその位置を割り出すことができます。ビーコンを検出するには、位置情報サービスを有効にする必要があります。
Android の場合は、[プロジェクト|オプション...|使用する権限]で Bluetooth のオプションを有効にする必要があります。
iOS プラットフォームの場合、代替モードでは、位置情報サービスをアクティブにする必要はありません。標準モード(iBeacons)では、アプリケーションを初めて起動したときに、位置情報サービスのアクティブ化要求が受理される必要があります。
iOS 8.0 以降で標準モードを使用する場合、ビーコンを検出するには、アプリケーションが位置情報サービスを使用できるようにするためのキーが必要です。IDE には既に NSLocationAlwaysUsageDescription
と NSLocationWhenInUseUsageDescription
が含まれています。
手動で追加する必要があるのは次のキーです。
NSLocationUsageDescription
値には、"This app needs access to Location services to monitor beacons(このアプリケーションでは、ビーコンを監視するのに位置情報サービスにアクセスする必要があります)" などのテキスト メッセージを指定すればよいだけです。アプリケーション構成へのアクセス時に、このテキスト メッセージが表示されます。
このキーは IDE で追加できます。[プロジェクト|オプション...|バージョン情報]を選択し、グリッドを右クリックして[キーの追加]を選択してください。
屋内での制限事項
ビーコンからブロードキャストされる無線信号は、同じ無線周波数帯域で送信する他のデバイスに起因する回折、吸収、多重反射、干渉などの雑音効果にきわめて影響されやすい性質があります。これらの有害な効果は、特に、屋内環境でのビーコンの信号に重大な影響を及ぼします。その結果、送信出力の測定値から得られる推定値(Rssi、Distance、Proximity など)はかなり不安定になり、変動しがちです。そのため、これらの推定値の精度が落ちます。
信号処理
RTL には、ビーコンの信号とその信号から得られる推定値を安定化させる 2 つの異なるアルゴリズムが用意されています。
- RssiToDistance では、Rssi の測定値から導かれる距離の推定値を取得するモデルを導入しています。較正された送信出力を表すパラメータ
ATxPower
により、アルゴリズムの堅牢性が増すことに注意してください。 - TBeaconManager には、オプションの微分フィルタ アルゴリズムが実装されています。このアルゴリズムでは、Rssi(受信信号強度)と距離の測定値を安定化させます。このアルゴリズムを有効にするには、CalcMode プロパティで Stabilized 計算モードを選択します。このモードは、近接度の推定と動きの検出に特に役に立ちます。
アルゴリズムの組み込み
さらに、上記以外の信号処理アルゴリズムを組み込むこともできます。それは、汎用アルゴリズムでも、独自に設計したアルゴリズムでもかまいません。雑音効果を軽減するために実装できるフィルタの例をいくつか以下に示します。
- 移動平均フィルタ
- 加重平均フィルタ
- 曲線適合フィルタ