본문 바로가기
[ Developer ]/Android

[Android] 안드로이드 비콘 연동 Beacon

by 김현섭. 2016. 8. 9.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Android Beacon 연동하기

비콘을 연동해보기 위해서 Android Studio 프로젝트를 하나 생성한다
우선은 Gradle Scripts에서 build.gradle에서 2가지를 추가해준다


* Beacon SDK 추가
1
2
3
4
5
6
7
8
9
10
11
// 추가 할 부분
repositories {
    jcenter()
}
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.estimote:sdk:0.10.4@aar'
}
cs


그런 후 Class를 하나 생성해서 다음의 소스를 붙여넣는다
Class 명은 MyApplication으로 생성해준다


* MyApplication - Class
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
77
78
import android.app.Application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
 
import com.estimote.sdk.Beacon;
import com.estimote.sdk.BeaconManager;
import com.estimote.sdk.Region;
 
import java.util.List;
import java.util.UUID;
 
/**
 * Created by MinChang Jang on 2016-06-23.
 */
public class MyApplication extends Application {
 
    private BeaconManager beaconManager;
 
    /**
     * Application을 설치할 때 실행됨.
     */
    @Override
    public void onCreate() {
        super.onCreate();
        beaconManager = new BeaconManager(getApplicationContext());
 
        // Application 설치가 끝나면 Beacon Monitoring Service를 시작한다.
        // Application을 종료하더라도 Service가 계속 실행된다.
        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                beaconManager.startMonitoring(new Region(
                        "monitored region",
                        UUID.fromString("74278BDA-B644-4520-8F0C-720EAF059935"), // 본인이 연결할 Beacon의 ID와 Major / Minor Code를 알아야 한다.
                        00));
            }
        });
 
        // Android 단말이 Beacon 의 송신 범위에 들어가거나, 나왔을 때를 체크한다.
        beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
            @Override
            public void onEnteredRegion(Region region, List<Beacon> list) {
                showNotification("들어옴""비콘 연결됨" + list.get(0).getRssi());
//              getApplicationContext().startActivity(new Intent(getApplicationContext(), PopupActivity.class).putExtra("uuid", String.valueOf(list.get(0).getProximityUUID()) ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
            }
            @Override
            public void onExitedRegion(Region region) {
                showNotification("나감""비콘 연결끊김");
            }
        });
    }
 
    /**
     * Notification으로 Beacon 의 신호가 연결되거나 끊겼음을 알림.
     * @param title
     * @param message
     */
    public void showNotification(String title, String message) {
        Intent notifyIntent = new Intent(this, MainActivity.class);
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivities(this0,
                new Intent[] { notifyIntent }, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(this)
                .setSmallIcon(android.R.drawable.ic_dialog_info)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .build();
        notification.defaults |= Notification.DEFAULT_SOUND;
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);
    }
}
cs


위 클래스는 Application의 설치가 끝나고 최초로 실행될 때 수행되는 코드를 의미한다
주석을 보면 각각의 기능이 되어 있으므로 읽고 언제 수행되는지를 대충 파악하면 된다




소스 중간에 보면 UUID.fromString해서 문자값이 들어가 있는데 저것은 Beacon의 ID값이다
사용을 할 Beacon 마다 다르므로 Beacon의 아이디를 넣어주면 된다

이제는 Manifest를 등록을 해본다
우선 application에서 name을 추가해서 MyApplication을 추가해준다




추가하고 나서 이제 MainActivity를 작성해준다


* MainActivity
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
public class MainActivity extends AppCompatActivity {
 
//    private BeaconManager beaconManager;
//    private Region region;
 
//    private TextView tvId;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
//        tvId = (TextView) findViewById(R.id.tvId);
 
//        beaconManager = new BeaconManager(this);
//
//        // add this below:
//        beaconManager.setRangingListener(new BeaconManager.RangingListener() {
//            @Override
//            public void onBeaconsDiscovered(Region region, List<Beacon> list) {
//                if (!list.isEmpty()) {
//                    Beacon nearestBeacon = list.get(0);
//                    Log.d("Airport", "Nearest places: " + nearestBeacon.getRssi());
//                    tvId.setText(nearestBeacon.getRssi() + "");
//                }
//            }
//        });
//
//        region = new Region("ranged region",
//                UUID.fromString("74278BDA-B644-4520-8F0C-720EAF059935"), null, null); // 본인이 연결할 Beacon의 ID와 Major / Minor Code를 알아야 한다.
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        
        // 블루투스 권한 승낙 및 블루투스 활성화
        SystemRequirementsChecker.checkWithDefaultDialogs(this);
 
//        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
//            @Override
//            public void onServiceReady() {
//                beaconManager.startRanging(region);
//            }
//        });
    }
 
    @Override
    protected void onPause() {
        //beaconManager.stopRanging(region);
 
        super.onPause();
    }
}
cs


주석이 되어 있는 것은 비콘을 통해서 거리를 측정하고 싶을 때 주석을 삭제하면된다
우선은 이대로 실행을 해보자
그러나 에뮬레이터로는 지원이 되지 않기 때문에 핸드폰으로 연결을 해보자

실행 결과는 다음과 같다



이제 주석처리를 지우고 비콘을 연결하고 거리를 측정해본다


* MainActivity - Beacon 거리 측정
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
 
import com.estimote.sdk.Beacon;
import com.estimote.sdk.BeaconManager;
import com.estimote.sdk.Region;
import com.estimote.sdk.SystemRequirementsChecker;
 
import java.util.List;
import java.util.UUID;
 
public class MainActivity extends AppCompatActivity {
 
    private BeaconManager beaconManager;
    private Region region;
 
    private TextView tvId;
 
    private boolean isConnected;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        tvId = (TextView) findViewById(R.id.tvId);
 
        beaconManager = new BeaconManager(this);
 
        // 비콘의 수신 범위를 갱신 받음
        beaconManager.setRangingListener(new BeaconManager.RangingListener() {
 
            @Override
            public void onBeaconsDiscovered(Region region, List<Beacon> list) {
                if (!list.isEmpty()) {
                    Beacon nearestBeacon = list.get(0);
                    Log.d("Airport""Nearest places: " + nearestBeacon.getRssi());
 
                    // nearestBeacon.getRssi() : 비콘의 수신 강도
                    tvId.setText(nearestBeacon.getRssi() + "");
 
                    if ( !isConnected && nearestBeacon.getRssi() > -70 ) {
                        isConnected = true;
 
                        AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                        dialog  .setTitle("알림")
                                .setMessage("비콘 연결")
                                .setPositiveButton("확인"new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
 
                                    }
                                }).create().show();
                    }
                    else {
                        Toast.makeText(MainActivity.this"연결 종료", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
 
        region = new Region("ranged region",
                UUID.fromString("74278BDA-B644-4520-8F0C-720EAF059935"), nullnull); // 본인이 연결할 Beacon의 ID와 Major / Minor Code를 알아야 한다.
    }
 
    @Override
    protected void onResume() {
        super.onResume();
 
        // 블루투스 권한 승낙 및 블루투스 활성화
        SystemRequirementsChecker.checkWithDefaultDialogs(this);
 
        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                beaconManager.startRanging(region);
            }
        });
    }
 
    @Override
    protected void onPause() {
        //beaconManager.stopRanging(region);
 
        super.onPause();
    }
}
cs


비콘을 받아오는 소스는 이 부분이다

* 비콘 수신 범위 측정
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
       // 비콘의 수신 범위를 갱신 받음
        beaconManager.setRangingListener(new BeaconManager.RangingListener() {
 
            @Override
            public void onBeaconsDiscovered(Region region, List<Beacon> list) {
                if (!list.isEmpty()) {
                    Beacon nearestBeacon = list.get(0);
                    Log.d("Airport""Nearest places: " + nearestBeacon.getRssi());
 
                    // nearestBeacon.getRssi() : 비콘의 수신 강도
                    tvId.setText(nearestBeacon.getRssi() + "");
 
                    if ( !isConnected && nearestBeacon.getRssi() > -70 ) {
                        isConnected = true;
 
                        AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                        dialog  .setTitle("알림")
                                .setMessage("비콘 연결")
                                .setPositiveButton("확인"new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
 
                                    }
                                }).create().show();
                    }
                    else if ( nearestBeacon.getRssi() < -70 ){
                        Toast.makeText(MainActivity.this"연결 종료", Toast.LENGTH_SHORT).show();
                        isConnected = false;
                    }
                }
            }
        });
cs


위의 구문을 이용해서 비콘의 수신 범위를 갱신받고 수신 강도를 출력한다
또한 70이상 가까워지면 Dialog가 뜨고 범위를 나가게 되면 연결 종료라는 Toast가 뜬다