자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 비콘 컴포넌트를 이용한 어플에 대한 질문 드립니다.
2016.12.07 13:47
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
1. 개발/실행 플랫폼
(1) OS : Window 7
(2) 개발툴 : Rad Studio 10.1
2. 개발 중인 프로그램
비콘을 이용하여 일정 거리 이상 멀어지면 폰에 서로 다른 소리의 알람을 울리게 하는 어플을 제작하였습니다.
3. 질문 내용
위에 글 처럼 어플을 제작하였는데 하나의 비콘을 인식하면 다른 비콘을 인식을 못하네요.
각 비콘은 스위치를 이용하여 켜고 끌수 있게 해 두었습니다.
procedure TForm1.Switch1Switch(Sender: TObject);
begin
Beacon1.Enabled := Switch1.IsChecked;
end;
procedure TForm1.Switch2Switch(Sender: TObject);
begin
Beacon2.Enabled := Switch2.IsChecked;
end;
procedure TForm1.Switch3Switch(Sender: TObject);
begin
Beacon3.Enabled := Switch3.IsChecked;
end;
이런식으로 해서 비콘 3개에 스위치를 부가하였고
procedure TForm1.Beacon1BeaconEnter(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
FBeacon := ABeacon;
end;
procedure TForm1.Beacon1BeaconExit(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
FBeacon := nil;
end;
procedure TForm1.Beacon2BeaconEnter(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
GBeacon :=ABeacon;
end;
procedure TForm1.Beacon2BeaconExit(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
GBeacon := nil;
end;
procedure TForm1.Beacon3BeaconEnter(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
HBeacon :=ABeacon;
end;
procedure TForm1.Beacon3BeaconExit(const Sender: TObject;
const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
HBeacon := nil;
end;
이렇게 각 비콘에 관한 이벤트를 설정해 두었습니다.
알람부분은
procedure TForm1.Timer1Timer(Sender: TObject);
var
InDangerArea: Boolean;
//이탈 여부
begin
if Assigned(FBeacon) then
begin
InDangerArea := FBeacon.Distance >=3;
if not FIsWarning then
begin
if InDangerArea then
Inc(FDangerAreaStaySecs)
else
FDangerAreaStaySecs := 0
;
if FDangerAreaStaySecs >= 1 then
//2초 이상 구역에 있을 경우
begin
FIsWarning := True;
StartWarning;
FDangerAreaStaySecs := 0
end;
end
//알람 울리지 않을때
else if FIswarning then
begin
if not InDangerArea then
Inc(FDangerAreaOutSecs)
else
FDangerAreaOutSecs :=0
;
if FDangerAreaOutSecs >= 1 then
//2초 이상 구역에서 벗어날 경우
begin
FIsWarning :=False;
StopWarning;
FDangerAreaOutSecs := 0;
end;
end;
lblDistance.Text := FBeacon.Distance.ToString;
end;
//알람 울릴 때
end;
이렇게 설정 하였고 이 코드는 Beacon1에 관한 알람 코드입니다.
Beacon2는 FBeacon부분을 GBeacon으로 바꾸고 모든 알람에 관한 변수 (FIsWarning, StopWarning,FDangerAreaOutSecs 등)도 GBeacon을 위한 새로운 변수(GIsWarning, GDangerAreaOutSecs 등)로
따로 선언을 해 두었습니다.
실제 어플을 구동해보면 각 스위치를 켰을때는 잘 작동하였습니다. 하지만 스위치를 동시에 켜면 하나가 작동을 하면 다른것은 작동을 하지 않았습니다.
제 추측이지만 3개 비콘 모두 ABeacon이라는 동일한 Const를 가져서 그런거 같기도 하지만 정확히 몰라서 여기에 질문을 올립니다.
긴글 읽어 주셔서 감사합니다! 전체 코드도 첨부파일로 올렸습니다.
코드는 http://blog.hjf.pe.kr/384 이곳의 코드를 응용했습니다.
Delphi 비콘 컴포넌트를 이용한 어플에 대한 질문 드립니다.
2016.12.07 13:47
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
1. 개발/실행 플랫폼
코드는 http://blog.hjf.pe.kr/384 이곳의 코드를 응용했습니다. |
비콘 컴포넌트(TBeacon)를 3개 추가해 사용하셨는데요.
3개의 비콘의 UUID와 Major, Minor를 하나의 비콘 컴포넌트에 등록해서 사용해보시기 바랍니다.
MonitorizedRegions에 3개를 등록하시고,
각 이벤트에서 UUID, Major, Minor 값을 확인해 각각의 변수에 할당하면 되지 않을까 생각합니다^^