티스토리 뷰

< Sdk 제공받기 / Sample app >

 

Reco beacon은 Memeber center에 'serial number', 'configuration code'를 등록하면 sdk를 제공받을 수 있다. 

 

 

 

 

제공되는 SDK에는 sample app이 있는데, 

조금 복잡한듯 보이지만 뜯어보면 크게 다음과 같은 구조로 되어있다. 

 

1. 먼저 BeaconManager로 Service를 실행시키고, 

2. Monitoring이나 Ranging callback을 받아낸다. 

 

이런식으로 callback을 주더라.

 



/**
*------------------------ 1. Monitoring callbacks ------------------------
*/

@Override
public void didEnterRegion(RECOBeaconRegion recoBeaconRegion, Collection<RECOBeacon> collection) {
// 1. region 입장시
tv.append("region 입장. \n");
}

@Override
public void didStartMonitoringForRegion(RECOBeaconRegion recoBeaconRegion) {
// 2. region 입장 후 정상 실행 시
tv.append("region 정상 실행! \n");
}

@Override
public void didDetermineStateForRegion(RECOBeaconRegionState recoBeaconRegionState, RECOBeaconRegion recoBeaconRegion) {
// 3. region의 변화가 감지될 시
tv.append("region 변화감지~ \n");
}

@Override
public void didExitRegion(RECOBeaconRegion recoBeaconRegion) {
// 4. region 퇴장시
tv.append("region 퇴장! \n");
}

@Override
public void monitoringDidFailForRegion(RECOBeaconRegion recoBeaconRegion, RECOErrorCode recoErrorCode) {
// monitoring 실패 시
tv.append("monitoring 실패... ㅠ.ㅠ \n");
}

/**
* ------------------------- 2. Ranging callbacks -------------------------
*/

@Override
public void didRangeBeaconsInRegion(Collection<RECOBeacon> collection, RECOBeaconRegion recoBeaconRegion) {
// ranging중인 region에서, 1초 간격으로 변경사항을 받아 이 callback을 부름

tv.append("ranging..! - ");

if(collection.size() == 0){
tv.append(recoBeaconRegion.getUniqueIdentifier() + " 안잡힘");
} else
{
if (recoBeaconRegion.getUniqueIdentifier().equals("1번 비콘") || recoBeaconRegion.getUniqueIdentifier().equals("2번 비콘")

||recoBeaconRegion.getUniqueIdentifier().equals("3번 비콘")) {
TextView proxText = (TextView) findViewById(R.id.textView);


ArrayList<RECOBeacon> mRangedBeacons = new ArrayList<RECOBeacon>(collection);

for (RECOBeacon beacon : mRangedBeacons) {
proxText.append("떨어진 정도 : " + beacon.getProximity() + "\n");
proxText.append("" + beacon.getAccuracy() + " meters \n" );
}
}

}

}

@Override
public void rangingBeaconsDidFailForRegion(RECOBeaconRegion recoBeaconRegion, RECOErrorCode recoErrorCode) {
// ranging 실패시
tv.append("ranging 실패... ㅠ.ㅠ \n");
}

/**
* -----------------------------------------------------------------------
*/

 

 

------------------------------------------------------------------------------------------------------------------------------

 

 

Monitoring vs Ranging >

 

 

1. Region Monitoring

 

device가 감지할 수 있는 반경안에 beacon들이 들어왔는지 

여부를 알려주는 것으로 ( inside, outside, unknown ) 정보를 알 수 있다. 

 

 

 

2. Region Ranging

 

region에서 감지되는 beacon들의 정보를 열람하는 기능.

 사용자가 정의한 region에 대해 ranging을 시작할 경우, 

해당 region에 속하는 beacon들의 list를 전달 받아 각 비콘의 정보를 열람할 수 있다.

 

 

추가로) Beacon Monitoring / Ranging을 background에서 Service로 돌리는 api도 제공된다. 하지만 계속 돌아가면 배터리 낭비가 있기 때문에 권장되는 사항은 Monitoring만 service로 돌리고, monitoring에서 beacon을 감지했을때 한시적으로 ranging을 수행하도록 한다! (이때 default ranging timeout : 10s

 

 

 

 

생각의 전환) 우리는 android를 기준으로 프로그래밍 하는 것이므로 이렇게 생각해야 한다. - 비콘이 일정 반경에 들어온 device를 감지한다 (X)- device를 기준으로 일정 반경안에 들어온 beacon들을 감지한다(O) 

 

------------------------------------------------------------------------------------------------------------------------------

 

< Testing >



다음은 Region Ranging을 test중인데 3개의 beacon이 모두 잘 잡히는 것을 볼 수 있다. 



beacon기기 다 바로 옆에 똑같이 모여있는데, 가끔씩 하나가 위처럼 자꾸 튀는 meter값을 냈다. 
원인을 찾다보니 다음과 같은 이슈가 있다고 한다.

 

 


RSSI (

Received Signal Strength Indication)란, 

수신 신호 강도를 나타내는 수치인데, 

일반적으로 -80dbm 안쪽으로는 들어와야 

그래도 믿을만한 결과라고 간주한다고 한다. 





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함