ビーコンの使用

提供: RAD Studio
移動先: 案内検索

Bluetooth の使用 への移動


ビーコンとは Bluetooth Low Energy デバイスで、https://www.bluetooth.org/en-us の『Bluetooth Specification Version 4.1(ページ 2023)』で記述されているように、広告データ、特に Manufacturer Specific Data(メーカー固有データ)内にある情報を含んでいます。この情報により、周囲のあらゆる Bluetooth LE デバイスはこのデバイスを特定し、ペアになったり接続を確立することなく、それに対する距離を計算することができます。

ビーコンの概要

プラットフォーム サポート

プラットフォーム サポート対象

Windows(*)

10 以上

OS X

10.7 以上

iOS

5 以上

Android

4.3 以上

(*) メモRTLビーコン用 API は、Windows 10+ プラットフォームでのみ利用できます。利用可能な 2 つの形式は、iBeaconAltBeacon です。以前の Windows のバージョンは、BLE 広告をサポートしていません。

ビーコンの種類

次の 3 つのビーコンの形式が利用可能です:iBeaconAltBeaconEddystoneRTLビーコン用 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

UUID

ビーコン グループ(たとえば、特定企業のビーコンなど)を識別する一意識別子です。

Allowed.png
Allowed.png
Allowed.png

Major

Major ID は、UUID で定義されるリージョン内の部分領域を識別するものです。

Allowed.png
Allowed.png

Minor

Minor ID は Major ID 領域内のさらに一部分を指定します。

Allowed.png
Allowed.png

TxPower

ビーコンまで 1 m 離れた位置で dBm 単位で測定される送信電力です。TxPower と 受信信号強度(RSSI)で、ビーコンまでのおおよその距離が計算されます。

Allowed.png
Allowed.png
Allowed.png

Eddystone フレーム

Eddystone フレームには、Service UUID が含まれており、これは、ID 0xFEAAServiceData として知られています。

このフレームには、次の 3 つのサブ形式を受け入れます:

詳細については、「Eddystone 仕様」を参照してください。

ビーコンの使用方法

RTL のビーコン API により、アプリケーションの動作デバイスとその周囲のビーコンとの Distance(距離)を取得できます。RTL のビーコン API では、定義されたリージョン内のビーコンの情報のみ提供します。Region は、ビーコンのグループです。リージョンは、UUIDMajorIDMinorIDiBeacons および AltBeacons の場合)、または、NamespaceInstanceEddystone の場合)で、指定することができます。

TBeaconManager のインスタンスの取得

RTL のビーコン API を使用するには、アプリケーションに System.Beacon ユニットを組み込み、TBeaconManager インスタンスの取得に使用する TBeaconScanModeTBeaconManager.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 として設定されます。
  • リージョンは、パラメータ UUIDMajorIDMinorID で指定されます。リージョンを登録する場合には、パラメータ UUID のみが必要となります。登録するリージョンをもっと具体的に指定する場合には、MajorIDMinorID、もしくは両方を使用することができます。

Eddystone の場合:

  • TBeaconsRegion 型パラメータは、TEddysUIDRegion として設定されます。
  • リージョンは、EddystoneUID 形式の場合には、NamespaceInstance で指定されます。リージョンを登録する場合には、パラメータ Namespace のみが必要となります。登録するリージョンをもっと具体的に指定する場合には、NamespaceInstance の両方を使用することができます。

ビーコンのスキャン

登録済みビーコンの場合: 以前のフレームワークは、次のことが必要でした:

  1. 登録
  2. 登録済みビーコンの監視を開始
  3. 登録済みビーコンの監視を停止

未登録のビーコンの場合: スキャン パフォーマンスの新たな改善により、登録されてない複数種のビーコンも同時にスキャンできるようになりました。

  1. Extended モードを設定。
  2. 監視したい形式を、型 TKindofBeacon で選択。
  3. 監視するために選択したビーコンを、ModeExtended プロパティに設定。
  4. 未登録ビーコンの監視を開始
  5. 未登録kビーコンの監視を停止

メモ: 事前にビーコンを登録していた場合、後半のステップは未登録のためのため、登録済みビーコンや EddystoneURL ビーコンの取得だけとなります。

検出したビーコンからの情報の取得

ビーコンに関する情報を取得するには、メインのビーコン インターフェイス(IBeacon)に、管理されているビーコンの種類を問い合わせます。その後、それぞれ特定のビーコンのインターフェイスを使用できます: iBeacon には IiBeaconAltBeacon には IAltBeaconEddystone には IEddystoneBeacon

監視対象ビーコンに関する情報の取得は、TBeaconManager に関連付けられているイベントを通じて行います。各ビーコンの形式では、特定のイベントのセットが用意されています:

  1. iBeacons および AltBeacons の場合:
    • OnCalcDistanceDistance が計算される直前に実行されます。
    • OnEnterRegion: 登録されているリージョン内のビーコンに初めて到達可能になったときに発生します。
    • OnExitRegion: リージョンに登録されているすべてのビーコンが到達不能になったときに発生します。
    イベントがいったん発生すると、そのイベントから提供される情報を使用できます。
    メモ: クロスプラットフォーム互換性の要件により、複数のリージョン項目を同じ UUID登録し、それらを監視する場合は、TBeaconRegionCollection に前回登録したリージョン項目のイベントのみ取得できます。さまざまなリージョンを監視する場合は、各自のシナリオに応じて、次のような 2 つの異なる方法のどちらかで作業を進めることができます。
    • 同じ UUID を持つすべてのビーコンに関連するイベントを受信するため、固有の UUIDMajorID=-1、MinorID=-1 でリージョンを登録する。
    • 固有の UUID でリージョンを登録し、カスタム値とアプリケーション要件に従って MajorIDMinorID をフィルタリングするようにアプリケーションを設計する。
  2. Eddystone の場合:
  3. いずれの ビーコン形式に対して:
    • OnCalculateDistances: ビーコンへの距離が計算される直前に発生します。
    • OnBeaconEnter: 新しいビーコンのエリアに入るたびに発生します。
    • OnBeaconsEnterRegion: 新しいビーコンがリージョン内で検知されるたびに発生します。ビーコンとリージョン情報の両方が、TBeaconsRegion 型で指定されます。
    • OnBeaconExit: ビーコンのエリアから出るたびに発生します。
    • OnBeaconsExitRegion: リージョン内で登録されたビーコンが失われるたびに発生します。ビーコンとリージョン情報の両方が、TBeaconsRegion 型で指定されます。
    • OnBeaconProximity: 近接度(Proximity)の値が変化するたびに発生します。

以下のコード スニペットでは、OnBeaconEnter イベントの使用方法を示しています。このイベントから必要なビーコン情報を取得するには、次のステップをとります:

  1. メインの Beacon Interface に、監視対象のビーコンの種類について問い合わせます。これの終わりまで、KindofBeacon プロパティを使用します。
  2. 特定のインターフェイスについて問い合わせます:
  3. このイベントをコーディングします。
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 には既に NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription が含まれています。

手動で追加する必要があるのは次のキーです。

  • NSLocationUsageDescription

値には、"This app needs access to Location services to monitor beacons(このアプリケーションでは、ビーコンを監視するのに位置情報サービスにアクセスする必要があります)" などのテキスト メッセージを指定すればよいだけです。アプリケーション構成へのアクセス時に、このテキスト メッセージが表示されます。

このキーは IDE で追加できます。[プロジェクト|オプション...|バージョン情報]を選択し、グリッドを右クリックして[キーの追加]を選択してください。

BeaconKeysFig1.png

屋内での制限事項

ビーコンからブロードキャストされる無線信号は、同じ無線周波数帯域で送信する他のデバイスに起因する回折、吸収、多重反射、干渉などの雑音効果にきわめて影響されやすい性質があります。これらの有害な効果は、特に、屋内環境でのビーコンの信号に重大な影響を及ぼします。その結果、送信出力の測定値から得られる推定値(RssiDistanceProximity など)はかなり不安定になり、変動しがちです。そのため、これらの推定値の精度が落ちます。

信号処理

RTL には、ビーコンの信号とその信号から得られる推定値を安定化させる 2 つの異なるアルゴリズムが用意されています。

  • RssiToDistance では、Rssi の測定値から導かれる距離の推定値を取得するモデルを導入しています。較正された送信出力を表すパラメータ ATxPower により、アルゴリズムの堅牢性が増すことに注意してください。
  • TBeaconManager には、オプションの微分フィルタ アルゴリズムが実装されています。このアルゴリズムでは、Rssi(受信信号強度)と距離の測定値を安定化させます。このアルゴリズムを有効にするには、CalcMode プロパティで Stabilized 計算モードを選択します。このモードは、近接度の推定と動きの検出に特に役に立ちます。

アルゴリズムの組み込み

さらに、上記以外の信号処理アルゴリズムを組み込むこともできます。それは、汎用アルゴリズムでも、独自に設計したアルゴリズムでもかまいません。雑音効果を軽減するために実装できるフィルタの例をいくつか以下に示します。

  • 移動平均フィルタ
  • 加重平均フィルタ
  • 曲線適合フィルタ

関連項目