2016 年 12 月 的封存

使用C++Builder Berlin Update 2開發BeaconFence 應用程式

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:

upload1

upload2

upload3

藉由TBeaconMapFencing元件載入POC地點的佈建架構圖, ,再分別把3個Beacon設置在書房, 客廳和玄關處:

upload4

Berlin Update 2版Beaconfence我最喜歡的一點就是為TBeaconMapFencing元件加入了Extended Mode, 這個模式可以同時掃瞄iBeacon,AltBeacon和Eddystone 3種不同型式的Beacon, 又方便而且又穩定:

upload5

之後我們就可以藉由下面的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公尺之內:

upload6

下圖則顯示筆者移動到書房時也能立刻且精準的定位筆者:

upload7

本文說明了使用C++Builder不但能完全沒問題的開發BeaconFence的應用, 而且充滿了樂趣.

2 則迴響

使用Berlin Update 2的TCalendarView, TCalendarPicker和Livebindings

Berlin Update 2的新功能之一就是提供了2個新的VCL元件:

TCalendarView和TCalendarPicker

這2個元件可以讓開發人員藉由它們的Date特性值來處理日期資料:

snap1

不過這2個元件也仍然可以藉由Livebindings和資料庫中的欄位資料繫結,開發人員可以右擊滑鼠選擇Bind Visually:

snap2

於Live Bindings視窗中再點選元件下方的”…”啟動Bindable Memebers對話盒, 再於其中選擇要繫結Date特性:

snap3

最後再拖曳資料庫的日期欄位到此2個元件的Date特性即可. 例如下圖就是筆者在TCalendarView和TCalendarPicker人件中繫結和顯示MS SQL Server 2012中Northwind資料庫Employees資料表的BirthDate欄位資料:

snap4

TCalendarView和TCalendarPicker元件可以結合程式碼或是Live Bindings技術處理資料, 仍然保持和其他VCL元件一樣的直覺和好用的特性.

發表留言