오늘은 안드로이드 내 블루투스 사용에 있어 저전력 블루투스(BLE)의 기본 개념 및 주요 용어, 사용에 있어 준비해야할 것들에 대해 정리해보았습니다.
저전력 블루투스(BLE)는 기존 블루투스와 달리 상당히 전력을 적게 소모하도록 설계되어있습니다.
사용예시로 2가지를 살펴보면 아래와 같습니다.
- 근처 기기 사이에서 소량의 데이터를 전송할때
- 근접센서와 상호작용하여 사용자에게 현재 위치에 기반한 맞춤 설정된 환경을 제공할때
BLE 주요 용어 및 개념
- 포괄적 특성 프로필(GATT) - GATT는 BLE 링크를 통해 "속성"이라고 알려진 짧은 데이터를 주고받기 위한 일반적인 사양입니다. 현재 모든 저전력 애플리케이션 프로필은 GATT에 기초합니다.
- 속성 프로토콜(ATT) - GATT는 속성 프로토콜(ATT) 위에 구축됩니다. 이를 일컬어 GATT/ATT라고도 합니다. ATT는 BLE 기기에서 실행되도록 최적화되므로 최대한 적은 양의 데이터를 사용합니다. 각 속성은 UUID(Universally Unique Identifier)로 고유하게 식별되는데, UUID는 고유 식별 정보에 사용하는 문자열 ID의 표준화된 128비트 형식을 나타냅니다. ATT가 전송하는 속성은 "특성"과 "서비스"로 구성됩니다.
- 특성(Characteristic) - 특성에는 하나의 값과 특성의 값을 설명하는 0-n "설명자"가 포함됩니다. 특성은 일종의 유형으로, 클래스와 유사하다고 생각하면 됩니다.
- 설명자(Descriptor) - 설명자는 특성 값을 설명하도록 정의된 속성입니다. 예를 들어 설명자는 사람이 읽을 수 있는 설명, 특성 값의 허용 가능한 범위 또는 특성 값에 적용되는 측정 단위를 지정할 수 있습니다.
- 서비스(Service) - 서비스는 특성의 모음입니다.
* 중앙 vs. 주변
중앙에서는 주변의 기기들을 스캔하고 광고(advertisement)를 찾으며, 주변에서는 광고를 게재하여 스캔될 수 있게합니다. 이는 BLE 자체에 적용되는 구조입니다.
* GATT 서버 vs. GATT 클라이언트(두 기기간 통신 방법 설정)
휴대전화 앱과 블루투스 기기간의 통신의 기초는 서버, 클라이언트 구조로 구성되어있습니다. 앞으로 설명드릴 예시는 앱이 클라이언트 역할, 블루투스 기기가 서버 역할을 하게됩니다.(이러한 구조는 뒤바뀔 수 있습니다.)
BLE 권한
앱에서는 블루투스 기능을 사용하기 위해 몇가지 권한을 선언해야합니다. 안드로이드 30이하 버전에서는
"BLUETOOTH", "BLUETOOTH_ADMIN" 두 가지 권한만을 선언하면 되었지만, 31버전부터는 블루투스 기능에 따라
권한이 세분화되어 그에 맞게 필요한 권한을 설정하시면 되겠습니다.
* 아래 예시에서는 페어링된 블루투스 기기와 통신 권한인 "BLUETOOTH_CONNECT" 와 블루투스 기기 검색 권한인 "BLUETOOTH_SCAN" 두 가지만 선언되어 있으나, 필요에 따라 다른 블루투스 기기에서 현재 기기를 검색할 수 있도록 하는 권한인 "BLUETOOTH_ADVERTISE" 가 추가로 있습니다.
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
* 저전력 블루투스 지원기기에만 제공하기 위해서는 Manifest에 아래와 같이 선언하시면 됩니다.
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
반면 그렇지않는 경우에는 required="false"로 설정한 다음에 런타임에서 PackageManger.hasSystemFeature() 를 사용하여 저전력 블루투스의 가용성을 지정하실 수 있습니다.
private fun PackageManager.missingSystemFeature(name: String): Boolean = !hasSystemFeature(name)
...
packageManager.takeIf { it.missingSystemFeatrue(PackageManger.FEATURE_BLUETOOTH_LE) }?.also {
Toast.makeText(this, "not supported BLE!!", Toast.LENGHT_SHORT).show()
}
오늘은 간단하게 BLE의 개념 및 기본용어, 사용에 필요한 몇몇 설정에 대해 알아보았습니다.
다음에는 BLE를 이용한 BLE 기기를 스캔하는 방법에 대해 소개하도록 하겠습니다.
부족한 글 봐주셔서 감사합니다:)
참고 : https://developer.android.com/guide/topics/connectivity/bluetooth-le?hl=ko#terms
저전력 블루투스 개요 | Android 개발자 | Android Developers
저전력 블루투스 개요 Android 4.3(API 레벨 18)에서는 저전력 블루투스(BLE)에 대한 플랫폼 내 지원을 핵심적 역할로 도입하고 앱이 기기를 검색하고, 서비스를 쿼리하고, 정보를 전송하는 데 사용할
developer.android.com
'Android' 카테고리의 다른 글
[안드로이드 / Kotlin] 화면 전환 시 작업 처리, 구성 변경 처리(onConfigurationChanged) (0) | 2022.03.06 |
---|---|
[안드로이드 / Kotlin] 저전력 블루투스 BLE(2), 스캔 (0) | 2022.02.28 |
[안드로이드 / Kotlin] 진동 (0) | 2022.02.13 |
[안드로이드 / Kotlin] RecyclerView에 대한 고찰 (0) | 2022.01.22 |
[안드로이드 / Kotlin] Retrofit2 (0) | 2022.01.15 |