안드로이드

안드로이드 비콘(BLE) 스캐너 Android Beacon Library 사용 방법!

알통몬_ 2017. 11. 3. 14:38
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 비콘 스캐너 라이브러리 중 유명한

Android Beacon Library 사용방법에 대해서 알아보겠습니다.

https://altbeacon.github.io/android-beacon-library/index.html


위 사이트에서 기본적이 사용법이나 최적화 방법에 대해 알 수 있습니다.

.aar 파일도 다운로드 받을 수 있구요 ㅎㅎ


기본적인 사용방법입니다.


1. 안드로이드 프로젝트 생성.

안드로이드 프로젝트를 새롭게 만들어 주세요.


2. Permission 추가

저는 아래 4가지 퍼미션을 주었는데요.


<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Location 퍼미션은 둘 중 하나만 줘도 된다고 합니다 ^^

그리고 API 23버전 이상에서는 LOCATION 퍼미션을 사용자에게 승인을 받아야 하는데요.

자바 코드로 구현해야 합니다.

가장 간단한 코드 :

1
2
3
ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSIONS);
cs


위처럼 주시면 되는데요.

PERMISSIONS 은 상수입니다.  1이상의 아무 정수 값이나 주면 됩니다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
 
public class MainActivity extends BaseActivity implements BeaconConsumer {}
 
// 블루투스 권한을 얻는 코드입니다.
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
 
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        } else {
            mBeaconManager = BeaconManager.getInstanceForApplication(this);
            mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BEACON_PARSER));
// BEACON_PARSER 는 문자열인데요. iBeacon 이냐 EddyStone 이냐에 따라 다른 문자열을 필요로합니다.

            //BeaconManager.setRssiFilterImplClass(ArmaRssiFilter.class);
        }
 
@Override
    public void onBeaconServiceConnect() {
        mBeaconManager.addRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                    Iterator<Beacon> iterator = beacons.iterator();
                    items = new Vector<>();
                    while (iterator.hasNext()) {
                        Beacon beacon = iterator.next();
                        String address = beacon.getBluetoothAddress();
                        if(address.equals(ble1) || address.equals(ble2)) {
                            double rssi = beacon.getRssi();
                            int txPower = beacon.getTxPower();
                            double distance = Double.parseDouble(decimalFormat.format(beacon.getDistance()));
                            int major = beacon.getId2().toInt();
                            int minor = beacon.getId3().toInt();
                            items.add(new Item(address, rssi, txPower, distance, major, minor));
                            /*Log.d("major ", beacon.getId2().toString());
                            Log.d("minor ", beacon.getId3().toString());*/
                        }
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            beaconAdapter = new BeaconAdapter(items, MainActivity.this);
                            binding.beaconListView.setAdapter(beaconAdapter);
                            beaconAdapter.notifyDataSetChanged();
                        }
                    });
                }
            }
        });
        try {
            mBeaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId"nullnullnull));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        mBeaconManager.addMonitorNotifier(new MonitorNotifier() {
 
            @Override
            public void didEnterRegion(Region region) {
                Log.i(TAG, "I just saw an beacon for the first time!");
            }
 
            @Override
            public void didExitRegion(Region region) {
                Log.i(TAG, "I no longer see an beacon");
            }
 
 
            @Override
            public void didDetermineStateForRegion(int state, Region region) {
                    Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
            }
        });
        try {
            mBeaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId"nullnullnull));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
cs


BEACON_PARSER 에 들어갈 수 있는 문자열 목록

public static final String ALTBEACON_LAYOUT = "m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25";
public static final String EDDYSTONE_TLM_LAYOUT = "x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15";
public static final String EDDYSTONE_UID_LAYOUT = "s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19";
public static final String EDDYSTONE_URL_LAYOUT = "s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-21v";
public static final String URI_BEACON_LAYOUT = "s:0-1=fed8,m:2-2=00,p:3-3:-41,i:4-21v";

iBeacon 은 "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25" 이에요.

위 5가지 중에 골라서 사용하면 됩니다.

iBeacon을 스캔할 경우 ALTBEACON_LAYOUT 에 있는 문자열을 쓰시면 됩니다.


기본적인 사용법은 위와 같구요.


깃허브에 프로젝트 공유해 놓았습니다.

https://github.com/Parksunggyun/BS


감사합니다.

반응형