BeaconFence の使用
Go Up to BeaconFence
目次
プラットフォーム サポート
プラットフォーム | サポート状況 |
---|---|
Windows |
10+ |
Mac OS X |
|
iOS |
|
iOS シミュレータ |
|
Android |
|
BeaconFence の設定
BeaconFence の使用を開始するには、BeaconFence パッケージをインストールしておく必要があります。
そうすれば、次のものを組み込むことができます。
- TBeaconMapFencing コンポーネント
- TBeaconZonesFencing コンポーネント
- 上記両者の組み合わせ
- メモ: TBeaconZonesFencing コンポーネントには、ビジュアルな BeaconFence マップ エディタは含まれていません。このコンポーネントは、近接イベントを管理するためのものです。
そのあと、コンポーネントを有効にする必要があります。それにより、ジオフェンシング処理が開始されます。
BeaconMapFencing.Enabled := True;
BeaconZonesFencing.Enabled := True;
次に、現在のマップ プロジェクトのビーコンに関連付けられている TBeaconManagerOptions プロパティに特定の値を設定できます。それには[オブジェクト インスペクタ]を使用することをお勧めします。詳細については、TBeaconManager のプロパティに関するドキュメントや「ビーコンの使用」を参照してください。
位置情報サービスを追加する
TBeaconMapFencing や TBeaconZonesFencing を使用する場合は、お使いのデバイスから位置情報にアクセスするには位置情報サービスを有効にする必要があります。このサービスを有効にするには、「位置情報サービスを追加する」でビーコンについて説明したのと同じ手順に従う必要があります。
メモ: 場合によっては、BLE デバイスが起動して、標準モードか代替モードのどちらかのモードのビーコンに関連付けられている Bluetooth イベントを処理するように、iOS アプリケーションをバックグラウンドで動作させることもできます。それには、プロジェクトの Info.plist
ファイルの UIBackgroundModes
キーに必要な値を追加することにより、Core Bluetooth のバックグラウンド実行モードをサポートする必要があります。
- IDE で[プロジェクト|オプション...|バージョン情報]を開きます。
- [キー]
UIBackgroundModes
を選択します。 - [値]に
bluetooth-central
を追加します。
マップの設定
アプリケーションにマップ プロジェクトを設定するには、以下を行う必要があります。
- PaintControl プロパティに、アプリケーション内のマップを表示するコントロールを設定します。
そのあと、次のいずれかを行います。
- ビジュアルな BeaconFence マップ エディタを使用します。
- XML 形式で記述された XMLMap のデータを使用して、以下を手動で行います。
-
- LoadProjectFromXML でマップ プロジェクトを読み込みます。
- SaveProjectToXML でマップ プロジェクトを保存します。
- SetXmlData でマップ プロジェクトを設定します。
マップ プロジェクトができあがったあと、その情報を監視し変更を管理したい場合は、以下を使用することができます。
- OnBeforeMapChange イベント: マップの変更前のカスタム アクションを管理できます。
- ProjectInformation プロパティ: XMLMap 内の現在の要素に関して入手可能なあらゆる情報にアクセスできます。このプロパティには以下の情報が含まれています。
- 監視対象のリージョン(
BeaconMapFencing1.ProjectInformation.RegionsToMonitorize
) - 関心地点のリスト(
BeaconMapFencing1.ProjectInformation.PoiList
) - マップ(
BeaconMapFencing1.ProjectInformation.Maps
)- 各マップに含まれるゾーン(
BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J]
) - マップ内の各ゾーンの位置
BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Left
BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Top
BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Right
BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Bottom
- 各マップに含まれるビーコンのリスト(
BeaconMapFencing1.ProjectInformation.Maps[I].BeaconList[J]
)
- 各マップに含まれるゾーン(
- パスとそのノード(
BeaconMapFencing1.ProjectInformation.GlobalPath[I].Node
)
- 監視対象のリージョン(
たとえば、各マップのビーコン リストと各ビーコンの情報を取得するには、次のようなコードを使用します。
var
LInformation: TFencingProject;
I: Integer;
J: Integer;
LMapCount: Integer;
LLine: string;
MmMapsInformation: TMemo;
begin
LInformation := BeaconMapFencing1.ProjectInformation;
LMapCount := Length(LInformation.Maps);
for I := 0 to LMapCount - 1 do
begin
LLine := 'Map: ' + LInformation.Maps[I].Map.Name + ' Size: ' + FormatFloat('0.00', LInformation.Maps[I].Map.GetGlobalRect.Width) + '-' +
FormatFloat('0.00', LInformation.Maps[I].Map.GetGlobalRect.Height);
MmMapsInformation.Lines.Add(LLine);
MmMapsInformation.Lines.Add(' Beacon List: ');
for J := 0 to Length(LInformation.Maps[I].BeaconList) - 1 do
begin
LLine := ' ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Name;
LLine := LLine + ' Position : (' + FormatFloat('0.00', LInformation.Maps[I].BeaconList[J].DesignBeacon.CenterInGlobalSpace.X) + '-' +
FormatFloat('0.00', LInformation.Maps[I].BeaconList[J].DesignBeacon.CenterInGlobalSpace.Y) + ')';
MmMapsInformation.Lines.Add(LLine);
LLine := ' BeaconType' + Integer(LInformation.Maps[I].BeaconList[J].DesignBeacon.KindofBeacon).ToString
+ 'GUID' + LInformation.Maps[I].BeaconList[J].DesignBeacon.GUID.ToString
+ ' Major: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Major.ToString
+ ' Minor: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Minor.ToString
+ ' EddyNamespace: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.EddyNamespace
+ ' EddyInstance: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.EddyInstance;
MmMapsInformation.Lines.Add(LLine);
end;
end;
end
TFencingProject LInformation;
Integer I;
Integer J;
Integer LMapCount;
String LLine;
TMemo *MmMapsInformation;
LInformation = BeaconMapFencing1->ProjectInformation;
LMapCount = LInformation.Maps.Length;
for (I = 0; I < LMapCount; I++) {
LLine = "Map: " + LInformation.Maps[I].Map->Name + " Size: " + FormatFloat("0.00", LInformation.Maps[I].Map->GetGlobalRect().Width()) + "-" +
FormatFloat("0.00", LInformation.Maps[I].Map->GetGlobalRect().Height());
MmMapsInformation->Lines->Add(LLine);
MmMapsInformation->Lines->Add(" Beacon List: ");
for (J = 0; J < LInformation.Maps[I].BeaconList.Length; J++) {
LLine = " " + LInformation.Maps[I].BeaconList[J].DesignBeacon->Name;
LLine = LLine + " Position : (" + FormatFloat("0.00", LInformation.Maps[I].BeaconList[J].DesignBeacon->CenterInGlobalSpace.X) + "-" +
FormatFloat("0.00", LInformation.Maps[I].BeaconList[J].DesignBeacon->CenterInGlobalSpace.Y) + ")";
MmMapsInformation->Lines->Add(LLine);
LLine = " BeaconType" + IntToStr(Integer(LInformation.Maps[I].BeaconList[J].DesignBeacon->KindofBeacon))
+ "GUID" + GUIDToString(LInformation.Maps[I].BeaconList[J].DesignBeacon->GUID)
+ " Major: " + IntToStr(LInformation.Maps[I].BeaconList[J].DesignBeacon->Major)
+ " Minor: " + IntToStr(LInformation.Maps[I].BeaconList[J].DesignBeacon->Minor)
+ " EddyNamespace: " + LInformation.Maps[I].BeaconList[J].DesignBeacon->EddyNamespace
+ " EddyInstance: " + LInformation.Maps[I].BeaconList[J].DesignBeacon->EddyInstance;
MmMapsInformation->Lines->Add(LLine);
};
};
ProjectInformation プロパティの詳細は、BeaconFence デモの FencingGeneric サンプルに含まれる ShowProjectInformation という関数を参照してください。
マップ オプション
これで、BeaconManagerOptions を使用して、現在のマップの以下の視覚的オプション(TFencingMapOption)を実行時に変更できます。
- ColorBeacon: 近接度の値に応じて異なる色でビーコンを表示します。
レベル | 色 |
---|---|
Intermediate
|
緑 |
Near
|
黄 |
Far
|
オレンジ |
Away
|
赤 |
- HighlightZones: アクティブなゾーンの不透明度値を変更します。
- ShowPosition: BLE デバイスの推定位置をマップに描画します。
- ShowPositionInPath: 最も近いパスに合致する精密な推定位置を描画します。
- ShowBeacons: 設定したビーコンをマップに表示します。
- ShowBeaconSignal: BLE デバイスまでの現在の距離を示す円をビーコンを中心に描画します。この距離は Rssi 値を基に計算されます。
- ShowZones: 設定したゾーンをマップに表示します。
- ShowPaths: 設定したパスをマップに表示します。
近接イベント
- OnBeaconEnter: 到達可能な距離内に新しいビーコンが検出されたときに発生します。
- OnBeaconExit: 到達可能な距離内でビーコンが検出されなくなったときに発生します。
- OnBeaconProximity: ビーコンの近接度値が変化するたびに発生します。
ゾーン イベント
- OnZoneEnter: 計算した位置が定義したゾーン内に入ったときに発生します。
- OnZoneExit: 計算した位置が定義したゾーンから出たときに発生します。
- OnZoneBeaconEnter: あるゾーンに既に定義されたビーコンがそのゾーンに入ったときに発生します。
- OnZoneBeaconExit: あるゾーンに既に定義されたビーコンがそのゾーンから出たときに発生します。
- OnZoneOnBeaconProximity: ゾーンに定義されたビーコンの近接度値が変化するたびに発生します。
メモ: 位置に基づくこれらのイベントの他に、監視対象のリージョンを UUID、メジャー ID、マイナー ID で登録することもやはりできます。BeaconFence マップ エディタを使用すると、監視対象のビーコンを追加および構成できます。詳細については、「ビーコンの使用」を参照してください。
位置の計算
BeaconFence の API には System.Beacon.Fencing.PositionCalculator ユニットがあり、その中に、特定のマップ内の BLE デバイスの現在位置を推定するのに必要なクラスが用意されています。
TPositionCalculator のデフォルト実装には、位置推定作業に最適化された パーティクル フィルタ アルゴリズムの主要な機能が組み込まれています。特に、このパーティクル フィルタは モンテカルロ位置推定アルゴリズムに対応しています。
モンテカルロ位置推定
モンテカルロ位置推定アルゴリズムが TTrilateration に実装されており、それによって、お使いの BLE デバイスからマップ内の複数のビーコンまでの距離が導き出されます。これらの距離を基に、三辺測量の手法を用いて BLE デバイスの推定位置が計算されます。
以下のプロパティを使用すると、パーティクル フィルタのオプション パラメータを調整することができます。
- ParticlesNumber: 統計計算のためのガウス分布を表すパーティクルの数。パーティクルの数が多いと、正確な推定値が得られますが、計算コストがかかります。お使いのデバイスのリソースに基づいて、両者のバランスを取ります。
- UpdateInterval: 連続した位置の推定を行うための更新間隔(ミリ秒単位)。
- MovementStDeviation: パーティクルの分布をランダム化するための標準偏差。
- SignalRelativeStdDev: 距離計算時の信号対エラー比を表すための標準偏差。
- BeaconsToUse: 距離を計算するためのビーコンの数。TTrilateration では、最終的な推定位置を得るために、この数の距離を使って三辺測量計算を行います。
- OwnsCalcDistance: これを true に設定すると、TPositionCalculator のデフォルト実装を有効にしてビーコンまでの距離が計算されます。
- AutomaticCalibration: これを true に設定すると、TPositionCalculator のデフォルト実装を有効にしてビーコンの自動キャリブレーションが実行されます。
- MotionThreshold: BLE デバイスが移動しているかどうかを判定するためのしきい値。
推定位置を取得する
お使いの BLE デバイスの推定位置を取得するには、次のイベントを使用できます。
- OnEstimatingPosition: 位置が推定されるときに発生します。
- OnCalcPosition: 位置が計算される前に発生します。
- OnPositionEstimated: 計算された位置が変化したときに発生します。
カスタム実装
System.Beacon.Fencing.PositionCalculator には、位置計算のカスタム設計を実装するためにオーバーライドできる抽象クラスが含まれています。そのためには、TPositionCalculatorClass 型のオブジェクトでメソッドをオーバーライドする必要があります。
- メモ: OnEstimatingPosition プロパティを使用すると、現在位置の推定を実行時に取得できます。
経路の計算
BeaconFence の API には System.Beacon.Fencing.PathFinder ユニットがあり、その中に、お使いの BLE デバイスの現在の推定位置(始点)からマップ上の目的地(終点)までの最短経路を計算するための Dijkstra アルゴリズムの実装が用意されています。
ナビゲーションのためにこの機能を利用するには、以下が必要です。
- パスとノードを追加し構成します。
- TCustomBeaconMapFencing.ShowPathToNodeIndex を呼び出すと、目的地点までの最短経路を取得できます。使用可能な最短パスが選択され、マップに表示されます。