BeaconFence在数个C++Builder/Delphi版本中就推出了, 我记得也在数年前的产品发表会中介绍过,当时Beaconfence身价不菲, 我也没机会用. 但从Seattle版本后Embarcadero大幅降低 Beaconfence的价格, 而且提供开发人员版,所以才有机会试用它.
日前一位使用C++Builder的朋友向我抱怨Beaconfence只有Delphi的范例, 没有C++Builder的范例, 他问我到底能不能用C++Builder开发Beaconfence? 能不能帮忙用C++Builder做一个Beaconfence的POC? 因此笔者特别商借了3个Beacon, 一个是插电式, 2个使用电池的Beacon:



藉由TBeaconMapFencing组件加载POC地点的布建架构图, ,再分别把3个Beacon设置在书房, 客厅和玄关处:

Berlin Update 2版Beaconfence我最喜欢的一点就是为TBeaconMapFencing组件加入了Extended Mode, 这个模式可以同时扫瞄iBeacon,AltBeacon和Eddystone 3种不同型式的Beacon, 又方便而且又稳定:

之后我们就可以藉由下面的C++程序代码根据用户的喜好设定TBeaconMapFencing组件的地图设定值:
void TfmMainForm::ChangeOption(TFencingMapOption AOption, bool ShouldInclude)
{
TFencingMapOptions LOp = BeaconMapFencing1->MapOptions;
if (ShouldInclude)
{
LOp << AOption;
}
else
{
LOp >> AOption;
}
BeaconMapFencing1->MapOptions = LOp;
}
最后实作TBeaconMapFencing组件的On PositionEstimated事件处理函式:
void __fastcall TfmMainForm::BeaconMapFencing1PositionEstimated(TPointF &AEstimatedPoint,
TPointF &APointToPath)
{
ShowStatus(AEstimatedPoint, APointToPath);
}
//-------------------------------------------------------------
void TfmMainForm::ShowStatus(TPointF AEstimatedPoint, TPointF APathPoint)
{
String LMapsInfo = "";
for (int I = 0; I < BeaconMapFencing1->ProjectInformation.Maps.Length; I++)
{
LMapsInfo = LMapsInfo + " Map:" + IntToStr(I) + " Act:" + IntToStr(BeaconMapFencing1->ProjectInformation.Maps[I].GetActiveBeaconsCount() );
if (BeaconMapFencing1->ProjectInformation.Maps[I].NearestBeacon().BTBeacon != NULL)
LMapsInfo = LMapsInfo + " dis:" + FormatFloat("0.00", BeaconMapFencing1->ProjectInformation.Maps[I].NearestBeacon().BTBeacon->Distance);
}
LbStatus->Text = IntToStr(GTimes) + " at " +
FormatFloat("0.00", AEstimatedPoint.X) + " , " + FormatFloat("0.00", AEstimatedPoint.Y) +
" (" + FormatFloat("0.00", APathPoint.X) + " , " + FormatFloat("0.00", APathPoint.Y) + ")" +
" " + LMapsInfo;
GTimes++;
}
把此范例App部署到笔者的HTC手机中执行并且在POC地点中行走时就可以看到此App能精确的在室入定位笔者的位置, 例如下图是笔者在客厅中移动, 在接近设置在客厅的Beacon设备时BeaconFence的Beacon便变成绿色, 代表笔者就在此Beacon设备附近0.5公尺之内:

下图则显示笔者移动到书房时也能立刻且精准的定位笔者:

本文说明了使用C++Builder不但能完全没问题的开发BeaconFence的应用, 而且充满了乐趣.