블루투스

Android 블루투스 HAL 아이콘

Android는 기본 블루투스와 저전력 블루투스를 모두 지원하는 기본 블루투스 스택을 제공합니다. Android 기기는 블루투스를 사용하여 주변 블루투스 기기와 데이터를 주고받기 위한 개인 영역 네트워크를 만들 수 있습니다.

Android 4.3 이상에서 Android 블루투스 스택은 저전력 블루투스(BLE)를 구현할 수 있는 기능을 제공합니다. BLE API를 충분히 활용하려면 Android 블루투스 HCI 요구사항을 따르세요. 적합한 칩셋이 있는 Android 기기는 기본 블루투스 또는 기본 블루투스와 BLE를 모두 구현할 수 있습니다. BLE는 이전 블루투스 칩셋과 호환되지 않습니다.

Android 8.0에서 네이티브 블루투스 스택은 블루투스 5의 요건을 모두 충족합니다. 제공되는 블루투스 5 기능을 사용하려면 기기에 블루투스 5용 칩셋이 있어야 합니다.

Android 아키텍처

블루투스 애플리케이션은 바인더를 통해 블루투스 프로세스와 통신합니다. 블루투스 프로세스는 JNI를 사용하여 블루투스 스택과 통신하며 개발자는 블루투스 프로세스를 통해 다양한 블루투스 프로필에 액세스할 수 있습니다. 다음 다이어그램은 블루투스 스택의 일반적인 구조를 보여줍니다.

Android 블루투스 아키텍처
그림 1. Android 블루투스 아키텍처
애플리케이션 프레임워크
애플리케이션 프레임워크 수준에는 android.bluetooth API를 사용하여 블루투스 하드웨어와 상호작용하는 애플리케이션 코드가 있습니다. 내부적으로 이 코드는 바인더 IPC 메커니즘을 통해 블루투스 프로세스를 호출합니다.
블루투스 애플리케이션
packages/modules/Bluetooth/android/app에 있는 블루투스 애플리케이션은 Android 앱으로 패키징되며 Android 프레임워크 레이어에서 블루투스 프로필을 구현합니다. 이 앱은 JNI를 통해 네이티브 블루투스 스택을 호출합니다.
JNI
android.bluetooth와 연결된 JNI 코드는 packages/modules/Bluetooth/android/app/jni에 있습니다. JNI 코드는 기기가 검색될 때와 같이 특정 블루투스 작업이 발생할 때 블루투스 스택을 호출합니다.
블루투스 스택
기본 블루투스 스택은 AOSP에 제공되며 packages/modules/Bluetooth/system에 있습니다. 스택은 일반 블루투스 HAL을 구현하고 확장 프로그램 및 구성 변경사항을 사용하여 맞춤설정합니다.
공급업체 구현
공급업체 기기는 하드웨어 인터페이스 디자인 언어(HIDL)를 사용하여 블루투스 스택과 상호작용합니다.

HIDL

HIDL은 블루투스 스택과 공급업체 구현 사이의 인터페이스를 정의합니다. 블루투스 HIDL 파일을 생성하려면 블루투스 인터페이스 파일을 HIDL 생성 도구에 전달하세요. 인터페이스 파일은 hardware/interfaces/bluetooth에 있습니다.

블루투스 스택 개발

Android 블루투스 스택은 블루투스 자격 요건을 충족하는 스택입니다. 인증 목록은 블루투스 SIG 웹사이트의 QDID 169365에 있습니다.

핵심 블루투스 스택은 packages/modules/Bluetooth에 있습니다. 개발은 AOSP에서 이루어지며 참여를 환영합니다.

Android 7.x 이하 아키텍처

블루투스 시스템 서비스는 JNI를 통해 블루투스 스택과 통신하고 바인더 IPC를 통해 애플리케이션과 통신합니다. 시스템 서비스를 통해 개발자는 다양한 블루투스 프로필에 액세스할 수 있습니다. 다음 다이어그램은 블루투스 스택의 일반적인 구조를 보여줍니다.

Android 블루투스 아키텍처
그림 2. Android 7.x 이하 블루투스 아키텍처
애플리케이션 프레임워크
애플리케이션 프레임워크 수준에는 android.bluetooth API를 활용하여 블루투스 하드웨어와 상호작용하는 애플리케이션 코드가 있습니다. 내부적으로 이 코드는 바인더 IPC 메커니즘을 통해 블루투스 프로세스를 호출합니다.
블루투스 시스템 서비스
packages/apps/Bluetooth에 있는 블루투스 시스템 서비스는 Android 앱으로 패키징되며 Android 프레임워크 레이어에서 블루투스 서비스와 프로필을 구현합니다. 이 앱은 JNI를 통해 HAL 레이어를 호출합니다.
JNI
android.bluetooth와 연결된 JNI 코드는 packages/apps/Bluetooth/jni에 있습니다. JNI 코드는 HAL 레이어를 호출하고 기기가 검색될 때와 같이 특정 블루투스 작업이 발생할 때 HAL에서 콜백을 수신합니다.
HAL
하드웨어 추상화 계층은 android.bluetooth API와 블루투스 프로세스에서 호출하고 블루투스 하드웨어를 올바로 작동하기 위해 구현해야 하는 표준 인터페이스를 정의합니다. 블루투스 HAL의 헤더 파일은 hardware/libhardware/include/hardware/bluetooth.h입니다. 모든 hardware/libhardware/include/hardware/bt_*.h 파일을 검토하세요.
블루투스 스택
기본 블루투스 스택이 제공되며 system/bt에 있습니다. 스택은 일반 블루투스 HAL을 구현하고 확장 프로그램 및 구성 변경사항을 사용하여 맞춤설정합니다.
공급업체 확장 프로그램
추적을 위해 맞춤 확장 프로그램과 HCI 레이어를 추가하려면 libbt-vendor 모듈을 만들고 이러한 구성요소를 지정하세요.

HAL 구현

블루투스 HAL은 /hardware/libhardware/include/hardware/bluetooth.h에 있습니다. bluetooth.h 파일은 블루투스 스택의 기본 인터페이스를 포함하며 블루투스 스택의 기능을 구현해야 합니다.

프로필별 파일은 동일한 디렉터리에 있습니다. 자세한 내용은 HAL 파일 참조를 참고하세요.