안드로이드 아이비콘 빌드하는 방법 1/3
Published: 2024-01-18 14:51:57

[리테일러는](https://pubnub.com/blog/ecommerce-transformed-cognitive-services-and-the-future/) 항상 매출 증대를 위한 혁신적인 방법을 찾고 있습니다. 비콘, 특히 BLE(Bluetooth 저에너지) 비콘은 계속해서 주목을 받고 있는 기술 중 하나입니다. 블루투스 비콘이라고도 하는 비콘은 도입된 지 몇 년이 지난 지금도 주로 비콘 기술을 활용하는 Apple의 프로토콜인 'iBeacon'이라는 이름으로 여전히 헤드라인을 장식하고 있습니다.

아이비콘의 명성은 애플이 이 기술을 일찍부터 채택했기 때문이라고 할 수 있습니다. 애플은 4S 모델부터 비콘을 아이폰에 통합해 왔으며( ), iOS 기기를 BLE 비콘 기술의 대명사로 만들었습니다(!). 또한 비콘 프로토콜 개발의 선구자이기도 하지만, 이에 대해서는 나중에 자세히 설명하겠습니다.

Android 생태계에서는 비콘으로 작동하는 데 필요한 하드웨어를 갖춘 디바이스가 소수에 불과합니다. 예를 들어, 안드로이드 5.0의 테스트 버전에서는 넥서스 5가 비콘 역할을 할 수 있었습니다. 그러나 여러 개의 비콘을 동시에 방출할 수 없는 칩의 한계로 인해 안드로이드 롤리팝의 최종 릴리스에서는 넥서스 5에서 이 기술을 사용할 수 없게 되었습니다. 현재 Android 12.0에서는 새로운 위치 권한 모델이 도입되어 비콘 앱이 SDK 버전 29 이상을 대상으로 변경해야 합니다. 안드로이드 버전 6.0 이상에서는 앱이 비콘을 감지하기 위해 런타임에 사용자에게 위치 권한을 요청하는 것이 필수적입니다. 이 개발은 안드로이드 휴대폰에 비교적 새로운 것이므로, 특히 [IoT 디바이스 제어의](https://www.pubnub.com/solutions/iot-device-control/) 출현으로 인해 가까운 미래에 BLE 디바이스와 비콘 현상이 더 많은 관심을 받을 것으로 예상됩니다!

비콘의 종류와 차이점
-----------

### 아이비콘

Apple의 iBeacon은 최초로 도입된 비콘 프로토콜입니다. 사용자 친화적이며 광범위한 지원을 받고 있습니다.

### 에디스톤

에디스톤은 애플의 아이비콘에 대한 구글의 대응책입니다. 초기 이름은 UriBeacon이었으며, 유연성을 제공하며 Google 제품이기 때문에 와이파이 연결을 사용하는 기기를 포함한 모든 Google 제품 및 기기와 원활하게 통합됩니다.

### AltBeacon

Radius Networks의 아이디어로 탄생한 AltBeacon은 특정 공급업체를 선호하지 않습니다. 오픈 소스 특성상 소스 코드를 사용자 정의할 수 있어 앱 개발을 위한 다목적 선택이 가능합니다.

### **지오비콘**

지오비콘은 테크노월드에서 개발한 오픈소스 비콘 프로토콜입니다. 8가지 유형의 사용자 데이터를 제공하며, 오픈 소스이기 때문에 다양한 모바일 플랫폼과의 호환성을 보장합니다. 따라서 BLE 비콘과 블루투스 기술()을 활용하는 [지리적 위치](https://www.pubnub.com/solutions/geolocation/) 시나리오( )에서 강력한 도구가 될 수 있습니다.

하지만 먼저 - 비콘 앱 프로젝트에 사용할 API 키
-----------------------------

시작하기 전에 [PubNub 계정에 가입해야](https://dashboard.pubnub.com/signup) 합니다. 개발을 위해 엄청나게 넉넉한 무료 샌드박스 티어를 제공합니다! 이 튜토리얼을 시작할 때 API 키가 필요합니다. 이에 대한 자세한 내용은 [PubNub 문서에서](https://www.pubnub.com/docs/general/basics/set-up-your-account) 확인할 수 있습니다.

안드로이드 아이비콘 프로젝트 개요
------------------

이 튜토리얼에서는 비콘에서 방출되는 신호에 대해 살펴본 다음 이 지식을 활용하여 Android BLE 패키지를 활용합니다. 이 블로그 게시물은 시리즈의 시작점입니다. 그 다음에는 [Android 비콘 이미터(퍼블리셔)](https://pubnub.com/blog/build-android-ibeacon-beacon-emitter/) 및 [Android 비콘 감지기(리스너)](https://pubnub.com/blog/build-android-beacon-ibeacon-detector/) 구축에 대한 심층적인 튜토리얼을 확인하세요.

이 튜토리얼은 더 스마트한 비콘 구축에 대한 포괄적인 시리즈의 일부이며, 여기에서 [비콘 시리즈 개요를](https://pubnub.com/blog/building-smarter-beacons-bidirectional-beacon-communication/) 통해 살펴볼 수 있습니다. 정보만 전송할 수 있었던 기존 비콘에서 한 단계 더 나아가 비콘으로 양방향 통신을 시작하는 방법을 안내해 드립니다!

![](/cdn/3prze68gbwl1/asset-17suaysk1qa1ht1/390c225f5a3d712a449ad6df71d656a9/nexus9-framed.gif?w=700&h=550)

비콘의 광고는 어떻게 생겼나요?
-----------------

[블루투스 핵심 사양에](https://www.bluetooth.com/specifications/bluetooth-core-specification/) 따라 비콘은 스캔 응답 데이터라고 하는 데이터 패키지를 브로드캐스트합니다.

이 데이터는 최대 31바이트까지 포함할 수 있습니다. 더 작은 스캔 응답을 생성하면 나머지 바이트는 0으로 채워집니다.

스캔 응답은 AD 구조라고 하는 것으로 나뉩니다. 이는 다양한 크기의 바이트 시퀀스이며, 다음과 같이 미리 정의된 구조를 갖습니다:

-   첫 번째 바이트는 AD 구조의 끝까지 남은 바이트 수를 나타냅니다. 이를 통해 이 구조의 수신자는 구조가 끝나는 시점과 새 AD 구조가 시작되는 시점을 알 수 있습니다.
    
-   두 번째 바이트는 AD 구조 타입의 ID입니다.
    
-   나머지 바이트는 이전 유형이 정의한 AD 유형에 따라 미리 정의된 방식으로 데이터 구조화됩니다.
    

AD 구조의 연속일 뿐입니다.

전부는 아니더라도 대부분의 비콘 프로토콜에는 다음과 같은 두 가지 AD 구조만 있습니다.

첫 번째 AD 구조
----------

첫 번째 구조는 3바이트로 구성됩니다:

-   첫 번째 바이트: `**0x02**`: 다음 바이트만 계산하기 때문입니다.
    
-   두 번째 바이트: `**0x01은**` "플래그" AD 유형이 있음을 나타냅니다.
    
-   마지막 바이트는 이러한 플래그를 나타냅니다. 이 플래그는 발신 디바이스가 "Li
    
    발견 가능 모드", "일반 발견 가능 모드" 등... 바이트는 다음과 같은 방식으로 계산됩니다:
    

5개의 플래그는 바이트의 처음 5비트로 표시됩니다. 이 비트의 값은 플래그가 켜져 있는지 또는 꺼져 있는지를 정의합니다. 그런 다음 이진수는 16진수 값으로 기록되어 광고됩니다. 예시를 보면 이해가 쉬울 것입니다:

![](/cdn/3prze68gbwl1/41MNctRGxlM3f2cVZKjm3o/6a5cce32f5e53ae616c848f3ddf130c8/Screen-Shot-2015-04-13-at-9.49.01-AM.png)

따라서 결과 이진 값은 `**b00011010이**` 됩니다. 16진수로 변환하면 다음과 같이 됩니다: `**0x1A**`. 아래 로그를 참조하세요.

첫 번째 AD 구조는 여기까지입니다! 이제 필요한 대부분의 정보를 담고 있는 두 번째 구조를 살펴보겠습니다.

![](/cdn/3prze68gbwl1/asset-17suaysk1qa1hss/e66e14a10c6786db9b16531a146979d8/scan-response-structure.png)

두 번째 AD 구조
----------

두 번째 구조는 프로토콜에 따라 크기가 다를 수 있습니다. 다른 프로토콜과 거의 동일한 [AltBeacon의](https://altbeacon.org/) 예를 들어보겠습니다.

-   첫 번째 바이트는 `**0x1B**` (16진수 27)로, 31바이트 스캔 응답에서 사용 가능한 마지막 바이트를 모두 가져옵니다. 이는 프로토콜에 따라 달라질 수 있습니다.
    
-   다음 바이트는 항상 `**0xFF이며**`, 이는 "제조사별" 유형의 AD 구조가 있음을 의미합니다.
    
-   결과적으로, 다음 2바이트는 회사 식별자를 나타냅니다.
    
    [bluetooth.org](https://www.bluetooth.com/specifications/assigned-numbers/company-Identifiers/)
    
    . Nexus 9 기기의 경우 블루투스 칩의 제조업체가 명확하지 않으므로 Google의 제조업체 ID인 224를 사용하여 이를 단순화하겠습니다. 16진수 값으로 이 값은 0x00E0에 해당합니다. 리틀 엔디안으로 작성된 ID는 2바이트를 차지합니다. 여기서는 `**0x0E0 0x00**` 순서입니다.
    
-   나머지는 제조사별 데이터입니다! 이것이 프로토콜 간에 가장 많이 바뀌는 부분입니다.
    

알트비콘 프로토콜의 경우, 제조사별 데이터의 첫 2바이트는 `**0xBE 0xAC이며**` 알트비콘 AD를 식별합니다. 저는 개인적으로 비콘의 첫 네 글자를 사용하기로 결정한 것이 정말 마음에 듭니다! 기억하기 쉽죠. 다음 16바이트는 광고주의 조직 단위를 나타내는 UUID이며, 그 다음 4바이트는 원하는 대로 세분화할 수 있습니다. 여기서는 2바이트로 나누겠습니다. 아이비콘의 메이저와 마이너와 비슷한 2바이트 길이의 숫자를 사용하겠습니다. 다음 바이트는 하드웨어에 따라 설정해야 하며, 마지막 바이트는 0으로 남겨둘 수도 있고, 원하는 의미를 부여할 수도 있습니다.

하드웨어에 따라 달라지는 바이트는 장치에서 1미터 떨어진 위치에서 신호의 강도를 나타냅니다. 이 값은 dB 단위의 값의 2의 보수입니다. 강도의 값은 여러 가지 요인에 따라 달라지며 정확하지 않은 경우가 많습니다. 제 Nexus 9의 경우 -75dB이 정확한 추정치인 것 같습니다. 즉, 두 값의 합이 `**-75 + 256 = 181이**` 되므로 16진수 값으로 바이트는 `**0xB5가**` 됩니다.

비콘까지의 거리 계산하기
-------------

비콘 프로토콜의 가장 큰 장점 중 하나는 사용자와 비콘을 발신하는 디바이스 사이의 대략적인 거리를 알려준다는 점입니다.

이는 비콘 스캔 응답과 함께 전송되는 기준 RSSI를 휴대폰이 감지한 RSSI와 비교하여 계산합니다. 이 값을 계산하는 알고리즘은 비콘 프로토콜 소유자(Estimote 또는 iBeacon)의 속성인 경우가 많습니다. 그러나 [AltBeacon은](https://altbeacon.org/) 오픈 소스 프로젝트이므로 [여기와](https://github.com/AltBeacon/android-beacon-library) [여기에서](https://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing) 제공되는 알고리즘을 사용할 것입니다.

예제 코드에서 이 알고리즘을 사용하여 거리를 계산하겠습니다. 사용하는 프로토콜에 관계없이 거리에 대한 계산된 값은 신뢰할 수 없으며 사용자의 정확한 위치를 감지하는 데 사용할 수 없습니다. 비콘의 한계에 대한 자세한 내용은 [Apple의 문서에서](https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf) 확인할 수 있습니다.

비콘에 Android BLE 패키지 사용
----------------------

Android 디바이스에서 블루투스를 사용하려면 먼저 Android 매니페스트에 권한을 추가해야 합니다:

```js
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```

패키지의 핵심은 하드웨어에 대한 액세스를 허용하는 도구인 Bluetooth 어댑터에 있습니다. 예를 들어, Android 12.0에서 볼 수 있듯이 onCreate 메서드에 있습니다:

```js
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity\_your\_activity);
  mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
```

시작하기 위해 필요한 것은 이것뿐입니다. 비콘 스캔 및 방출의 보다 구체적인 사례를 살펴보겠습니다. Android BLE 패키지를 사용할 때 첫 번째 AD 구조가 자동으로 읽히거나 생성된다는 점에 유의하세요. 여기서는 두 번째 AD 구조에 중점을 두겠습니다. 특히 SDK는 제조업체별 데이터 구조를 자동으로 식별하거나 생성하므로 크기와 데이터 유형을 정의하는 처음 2바이트를 편집할 필요가 없습니다. 회사 ID도 자동으로 편집되어 소수점 값만 입력하면 됩니다. 따라서 프로세스가 크게 간소화됩니다.

### Android에서 비콘 스캔

이 프로세스를 시작하려면 Bluetooth LE 스캐너를 인스턴스화해야 합니다:

```js
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
```

안드로이드의 패키지를 통해 사용자는 필터를 생성하여 필터와 일치하는 비콘을 감지할 수 있습니다. 알트비콘을 감지하려면 먼저 스캔 필터를 구축해야 합니다. 24바이트 크기의 바이트 배열을 만듭니다. 처음 2바이트는 알트비콘 식별자 접두사(\`\*\*0xBE 0xAC\*\*\`)가 됩니다. 탐지하려는 비콘의 UUID를 위해 16바이트를 삽입합니다(일반적으로 조직의 UUID가 될 것입니다). 나머지 바이트는 0으로 남겨둘 수 있습니다.

인덱스 0에서 17까지의 배열과 나머지 배열을 0으로 포함하는 크기 24의 다른 배열을 만듭니다. 이는 처음 18바이트만 필수이며 스캐너가 제조업체 데이터의 시작 부분과 일치하는 스캔 레코드에 대해서만 결과를 생성해야 함을 나타냅니다.

### 안드로이드를 발광(퍼블리셔) 비콘으로 전환하기

먼저 블루투스 LE 광고주를 인스턴스화합니다:

```js
mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
```

데이터를 구축하려면 광고 데이터 빌더를 사용합니다. 마찬가지로 AltBeacon 접두사, UUID, 메이저, 마이너, TX 파워가 포함된 바이트 배열을 생성합니다. 이 작업이 완료되면 비콘이 성공적으로 생성된 것입니다!

### 요약하기

지금까지 비콘에서 방출되는 신호, 비콘까지의 거리 계산, Android 디바이스에서 비콘을 스캔하는 방법에 대해 살펴보았습니다. 이 지식을 바탕으로 Android 12.0을 사용하여 새 Android BLE 패키지를 만들 수 있습니다.

다음으로 [비콘 감지기를 만드는 방법을](https://www.pubnub.com/blog/tessel-ibeacon-tutorial-building-the-detector-data-beacon-subscriber/) 자세히 살펴보겠습니다. 그런 다음 [이미터를 빌드하는 방법을](https://www.pubnub.com/blog/build-android-ibeacon-beacon-emitter/) 안내해 드리겠습니다.

펍넙이 어떤 도움을 줄 수 있을까요?
====================

이 문서는 원래 [PubNub.com에](https://www.pubnub.com/blog/building-android-beacon-android-ibeacon-tutorial-overview/) 게시되었습니다.

펍넙의 플랫폼은 개발자가 웹 앱, 모바일 앱, IoT 디바이스를 위한 실시간 인터랙티브를 구축, 제공, 관리할 수 있도록 지원합니다.

저희 플랫폼의 기반은 업계에서 가장 크고 확장성이 뛰어난 실시간 에지 메시징 네트워크입니다. 전 세계 15개 이상의 PoP가 8억 명의 월간 활성 사용자를 지원하고 99.999%의 안정성을 제공하므로 중단, 동시 접속자 수 제한, 트래픽 급증으로 인한 지연 시간 문제를 걱정할 필요가 없습니다.

PubNub 체험하기
-----------

[라이브 투어를](https://www.pubnub.com/tour/introduction/) 통해 5분 이내에 모든 PubNub 기반 앱의 필수 개념을 이해하세요.

설정하기
----

PubNub [계정에](https://admin.pubnub.com/signup/) 가입하여 PubNub 키에 무료로 즉시 액세스하세요.

시작하기
----

사용 사례나 [SDK에](https://www.pubnub.com/docs) 관계없이 [PubNub 문서를](https://www.pubnub.com/docs) 통해 바로 시작하고 실행할 수 있습니다.