使用C++Builder Berlin Update 2开发BeaconFence 应用架构

Posted by on in Blogs

BeaconFence在数个C++Builder/Delphi版本中就推出了, 我记得也在数年前的产品发表会中介绍过,当时Beaconfence身价不菲, 我也没机会用. 但从Seattle版本后Embarcadero大幅降低 Beaconfence的价格, 而且提供开发人员版,所以才有机会试用它.

 

 

日前一位使用C++Builder的朋友向我抱怨Beaconfence只有Delphi的范例, 没有C++Builder的范例, 他问我到底能不能用C++Builder开发Beaconfence? 能不能帮忙用C++Builder做一个BeaconfencePOC? 因此笔者特别商借了3Beacon, 一个是插电式, 2个使用电池的Beacon:

 

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

 

Berlin Update 2Beaconfence我最喜欢的一点就是为TBeaconMapFencing组件加入了Extended Mode, 这个模式可以同时扫瞄iBeacon,AltBeaconEddystone 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设备时BeaconFenceBeacon便变成绿色, 代表笔者就在此Beacon设备附近0.5公尺之内:

 

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

 

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



Comments

Check out more tips and tricks in this development video: