iBeacon - basic
안녕하세요. 저는 현재 졸업 작품으로 "비콘을 활용한 실내 측위 마케팅 솔루션"이라는 주제로 프로젝트를 진행하고 있습니다. 평소에 비콘에 관심이 많았고 졸업 작품을 계기로 이를 직접 구현해보게 되었습니다.
간단하게 주제를 설명드리자면 코엑스나 스타필드 같이 대형 복합 상업 시설에서 비콘을 활용해 사용자가 선호하는 브랜드들을 바탕으로 할인 정보나 각종 이벤트 정보를 전달해주는 동시에 비콘의 영역 내/외부 판단과 매장 비콘으로부터의 거리 정보, 영역안에 머문 시간등의 데이터들을 실시간으로 서버에 전송하여 사업자로 하여금 마케팅에 활용할 수 있게끔 이러한 데이터들을 제공하는 솔루션입니다.
이를 위해서는 iOS에서의 비콘 프로그래밍에 대해 공부를 하였고 이를 통해 알게 된 사실들을 기록하고자 이렇게 글을 작성하게 되었습니다.
비콘이란?
비콘이란 근거리 무선 통신 기술을 바탕으로 신호를 발산하는 소형 장치를 일컫는 말입니다. 근거리 무선 통신에는 NFC와 블루투스도 존재합니다. NFC는 상당히 근접한 거리에서만 가능하다는 단점과 블루투스는 페어링이라는 과정을 거쳐야 한다는 단점이 존재합니다.
반면에 비콘은 최대 50m라는 비교적 넓은 범위를 제공하며 상호 페어링 과정이 필요없다는 장점이 존재합니다. 또한 실내에서 GPS보다 정확한 위치 파악이 가능하고 비콘과 통신하는데 전력이 많이 소모되지 않는다는 장점등이 존재합니다.
하지만 생각보다 비콘의 기능은 한정적이기도 합니다. 일단 비콘과 디바이스간의 양방향 통신은 불가능합니다. 비콘은 오로지 신호를 전송하는 것만 가능합니다. 또한 비콘은 어떠한 정보를 전달하는 것이 아닌 단순히 비콘 자신의 고유 신호만을 전송합니다. 이러한 신호의 정보를 서버에 등록하여 이를 바탕으로 디바이스가 신호를 인식하면 해당 신호에 대한 정보를 서버로부터 받아와 사용자에게 전달하는 방식으로 설계를 해야합니다.
Settings
비콘을 활용하기 위해선 비콘의 영역을 감지하고 비콘과의 대략적인 거리를 판단하는 기능이 필요합니다. 이를 각각 Monitoring
과 Ranging
이라고 합니다. 이에 대해서는 밑에서 더욱 자세히 다루기로 하고 이 두 기능을 가능케 하려면 몇 가지 설정이 필요합니다.
먼저 위치 서비스는 앱의 사용 유무와 상관없이 항상 켜져있어야 합니다. 이는 info.plist
에 명시해주어야 하고 앱이 실행됨과 동시에 위치 서비스에 대한 권한을 사용자에게 요청해야합니다.
다음은 Background에서도 현재 위치가 계속해서 갱신되어야 합니다. 이를 위해서는 Xcode 내에서 TARGETS
-> Capabilities
-> Background Modes
에서 Location updates
를 활성화 해주면 됩니다.
마지막으로 항상 디바이스는 블루투스 Detecting 기능이 켜져 있어야 합니다.
Monitoring & Ranging
Monitoring
은 비콘의 영역 내/외부를 판단하는 행위입니다. 이는 위에서 언급한 앱의 실행 유무와 상관없는 위치 서비스와 백그라운드 위치 갱신 서비스의 설정이 선행된 후에 가능한 기능입니다. 이에 대해 애플의 공식 문서는 다음과 같이 언급하고 있습니다.
Important
Apps must have always authorization to use region monitoring, and they must be configured with the Location updates background mode to be launched.
이렇게 Monitoring
을 통해 현재 디바이스가 비콘의 영역의 내부에 있다는 것이 판단되면 Ranging
을 통해 해당 비콘과의 근접도를 판단합니다.
거리가 아닌 근접도라고 표현하는 이유는 비콘과 디바이스 간의 거리는 신호의 안정도와 세기에 따라 순간적으로 다르게 나타날 수 있기 때문입니다. 그러므로 거리의 수치에 따른 구현은 옳지 않습니다. 그렇기 때문에 공식 문서에서도 Distance
가 아닌 Proximity
로 표현하고 있고 이에 대해 명시하고 있습니다. 근접도의 단계에는 네 가지가 존재합니다
Immediate
: 비콘과 디바이스가 상당히 가까운 상태로 거의 디바이스에 붙어 있는 수준Near
: 대략적으로 1 ~ 3 미터 내외의 거리로 비교적 가까운 수준이거나 신호가Immediate
에 비해 약할 때Far
: 물리적인 거리가Near
나Immediate
보다 떨어져 있거나 신호의 세기가 이들보다 약한 경우Unknown
: 신호의 세기나 거리에 따른 근접도의 판단이 불가능할 때, 방금 막Ranging
이 시작되었을 때 등과 같이 측정을 하기 충분한 상황이 아닐 때.
위 내용들을 살펴보면 근접도는 단순한 물리적 거리뿐만아니라 신호의 세기도 영향을 받는다는 것을 알 수 있습니다.
안드로이드 환경과 다르게 iOS에서는 Monitoring
과 Ranging
에 제약이 존재합니다.
먼저 Monitoring
할 수 있는 영역이 20개로 제한됩니다. 즉 영역을 판단할 수 있는 비콘의 UUID 값이 최대 20개까지라는 것입니다. 그렇기 때문에 하나의 영역에서 각각의 비콘들을 식별하기 위해서는 major와 minor 값을 이용해야합니다.
다음은 Ranging
은 반드시 앱이 실행된 이후에 가능하다는 것입니다. Monitoring
은 앱이 Terminate 되어 있는 상황에서도 기능이 작동하지만 Ranging
은 반드시 앱이 한번 실행된 이후에 가능합니다. 즉 Ranging
은 Background와 Foreground 모두에서 가능하지만 Terminate된 상황에서는 불가능하다는 것입니다.
Implementation
위의 정보들을 바탕으로 제공되는 메소드를 바탕으로 코드를 작성해보았습니다.