Central은 Bluetooth Low Energy 아키텍처에서 스캐닝을 시작하고, 연결을 설정하며, 주변 장치와의 데이터 교환을 관리하는 장치입니다. 모바일 개발의 맥락에서 Central은 iOS 또는 Android를 사용하는 스마트폰이나 태블릿으로, BLE 센서, 피트니스 트래커 및 스마트 액세서리에 연결됩니다. Bluetooth Core Specification 5.4(2023)에 따르면 Central은 최대 7개의 서로 다른 Peripheral과 동시 연결을 지원할 수 있지만, 실제 제한은 칩 제조업체와 OS 버전에 따라 다릅니다. iOS의 Core Bluetooth와 Android의 android.bluetooth.le은 Central 역할을 관리하기 위한 완전한 API를 제공합니다.
핵심 요점
Central은 Bluetooth Low Energy 아키텍처의 GATT 클라이언트로, 모든 통신을 시작합니다. 수동적으로 연결을 기다리고 서비스를 광고하는 Peripheral과 달리, Central은 능동적으로 전파를 스캔하고 광고 패킷을 발견하며 연결을 시작합니다.
비대칭적인 Central-Peripheral 모델은 BLE의 기본적인 특징입니다. Central은 상호작용 로직을 관리합니다. 즉, 어떤 장치에 연결할지, 어떤 서비스를 탐색할지, 어떤 특성을 읽고 쓸지 결정합니다. Peripheral은 데이터 서버 역할을 하여 서비스와 특성을 저장하지만 연결을 시작하지는 않습니다.
Bluetooth Core Specification 5.4(2023)에 따르면 장치는 동시에 Central과 Peripheral(이중 역할)이 될 수 있습니다. 예를 들어, 스마트폰은 피트니스 밴드의 Central이면서 동시에 파일을 전송하는 다른 스마트폰의 Peripheral이 될 수 있습니다. 하지만 두 역할을 동시에 수행하면 전력 소비와 연결 관리 복잡성이 증가합니다.
모바일 개발 생태계에서 Central 역할은 가장 일반적인 시나리오입니다. 스마트폰의 앱이 BLE 장치(센서, 헤드폰, 밴드)를 검색하고 연결하여 데이터를 수신합니다. 개발자는 운영 체제 API를 사용하여 Central을 제어합니다. iOS에서는 CBCentralManager, Android에서는 BluetoothLeScanner와 BluetoothGatt를 사용합니다.
스캔은 Central 작동의 첫 번째 단계입니다. 장치는 BLE 무선 채널(37, 38, 39)을 청취하여 Peripheral이 주기적으로 보내는 광고 패킷을 감지합니다. 각 광고 패킷에는 장치 이름, Service UUID 목록 및 사용자 정의 데이터가 포함됩니다.
Central은 두 가지 스캔 모드로 작동할 수 있습니다. 수동 스캔(광고 패킷 수신만)과 능동 스캔(스캔 응답을 통해 추가 데이터를 얻기 위한 스캔 요청 전송)입니다. 수동 스캔은 에너지를 절약하지만 얻는 정보가 적습니다. 능동 스캔은 장치 이름과 전체 서비스 목록을 포함한 광고 패킷의 전체 데이터를 얻을 수 있습니다.
UUID 필터링은 중요한 최적화입니다. Central은 특정 Service UUID가 있는 장치만 스캔하고 나머지는 무시할 수 있습니다. 이는 에너지를 절약할 뿐만 아니라 애플리케이션 로직도 단순화합니다. 델리게이트는 관련 장치만 수신합니다.
import CoreBluetooth
class BLECentralManager: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager = CBCentralManager(
delegate: self,
queue: nil
)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(
withServices: nil,
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
}
연결 관리는 Central의 핵심 책임입니다. 적합한 Peripheral을 발견한 후 Central은 연결을 시작합니다. BLE 연결은 연결 간격, 슬레이브 대기 시간, 감독 타임아웃 등의 매개변수 교환을 포함하는 연결 설정 절차를 통해 설정됩니다.
연결 간격은 연결 후 Central과 Peripheral이 데이터를 교환하는 빈도를 결정합니다. 간격은 7.5ms에서 4초까지 가능합니다. 간격이 짧을수록 처리량은 높아지지만 전력 소비도 증가합니다. 슬레이브 대기 시간을 통해 Peripheral은 에너지 절약을 위해 여러 연결 이벤트를 건너뛸 수 있습니다. 감독 타임아웃은 응답 없는 최대 시간으로, 이를 초과하면 연결이 끊어진 것으로 간주됩니다.
Central은 데이터 교환 완료 후 연결 종료를 담당합니다. BLE 장치는 일반적으로 영구적으로 연결을 유지하지 않습니다. Central은 연결하고, 데이터를 가져오고, 연결을 끊습니다. 이는 IoT 센서의 표준 패턴입니다. Central이 스캔하고, 온도 센서를 찾고, 연결하고, 값을 읽고, 연결을 끊습니다.
| 매개변수 | 범위 | 목적 | 권장사항 |
|---|---|---|---|
| 연결 간격 | 7.5 ms – 4 s | 데이터 교환 빈도 | 스트리밍: 30–50 ms, 드문 데이터: 1–4 s |
| 슬레이브 대기 시간 | 0–499 이벤트 | Peripheral 이벤트 건너뛰기 | 센서 절전: 4–10 |
| 감독 타임아웃 | 100 ms – 32 s | 연결 손실 타임아웃 | 대부분의 시나리오: 6–10초 |
| MTU | 23–517 바이트 | ATT 패킷 크기 | 연결 시 최대값 요청 |
Core Bluetooth는 iOS 및 macOS에서 BLE를 사용하기 위한 Apple의 프레임워크입니다. CBCentralManager 클래스는 Central 역할(스캔, 연결, 연결 관리)을 구현하기 위한 완전한 API를 제공합니다. iOS에서 Central 작업은 델리게이트 모델을 기반으로 합니다. CBCentralManagerDelegate가 상태 변경, 장치 발견 및 연결 결과 이벤트를 수신합니다.
iOS에서 Central의 주요 단계: CBCentralManager 초기화, Bluetooth 상태 확인, 스캔 시작, 델리게이트를 통한 발견된 장치 처리, 선택한 Peripheral에 연결, 서비스 및 특성 발견, 데이터 교환.
// 발견된 Peripheral에 연결
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// Peripheral 참조 유지 및 연결
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// 연결 성공
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOS는 백그라운드 BLE 작업을 제한합니다. 백그라운드에서는 앱이 Info.plist의 특정 키로만 스캔할 수 있으며, 연결된 장치가 Central에 데이터 변경을 알릴 수 있습니다. 중요한 애플리케이션(의료 기기)의 경우 bluetooth-central 키와 함께 백그라운드 모드를 사용하세요.
Android는 BLE 장치 스캔을 위한 BluetoothLeScanner API와 연결 관리를 위한 BluetoothGatt를 제공합니다. Android 5.0(API 21)부터 BluetoothLeScanner는 더 이상 사용되지 않는 startLeScan을 대체했습니다. 이 API에는 BLUETOOTH, BLUETOOTH_ADMIN 및 ACCESS_FINE_LOCATION 권한(Android 10+의 경우 ACCESS_BACKGROUND_LOCATION)이 필요합니다.
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// 스캔 구성
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// 스캔 시작
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// 장치에 연결
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
Android에서는 스캔 제한을 고려하는 것이 중요합니다. Android 7(API 24)부터 위치를 사용하지 않는 앱에서는 30초에 5회 이상 스캔을 시작할 수 없습니다. Android 12+에서는 BLUETOOTH_SCAN, BLUETOOTH_CONNECT 및 ADVERTISE 권한과 이러한 권한에 대한 런타임 요청이 필요합니다.
Central의 전력 소비는 무선 채널을 지속적으로 스캔해야 하기 때문에 Peripheral보다 높습니다. Central은 BLE 패킷을 수신하고 처리하며 연결을 관리하고 종종 애플리케이션 프로세서에서 계산을 수행합니다. Bluetooth SIG에 따르면 스캔은 모드에 따라 30mA에서 100mA까지 소비합니다.
Central을 위한 여러 에너지 절약 전략이 있습니다. 간격 스캔이 가장 효과적인 방법입니다. Central은 긴 휴지(스캔 간격)와 함께 짧은 윈도우(스캔 윈도우)에서 스캔합니다. 예를 들어, 스캔 윈도우 30ms, 스캔 간격 1000ms의 경우 지속적 스캔에 비해 전력 소비가 97% 감소합니다.
추가 최적화로 UUID 필터링이 있습니다. Central은 관련 광고 패킷만 빠르게 처리하고 나머지는 무시합니다. 이는 CPU 부하를 줄이고 장치의 배터리 수명을 늘립니다. 또한 원하는 장치를 찾은 즉시 스캔을 중지하고 필요 이상으로 연결을 유지하지 않는 것이 좋습니다.
자주 묻는 질문
네, BLE는 이중 역할을 지원합니다. 장치는 일부 장치에 대해 Central로, 다른 장치에 대해 Peripheral로 동시에 작동할 수 있습니다. 예를 들어, 스마트폰이 센서에서 데이터를 읽고(Central로), 동시에 다른 장치로 데이터를 전송하기 위해 자체 서비스를 광고(Peripheral로)할 수 있습니다.
BLE 사양은 단일 Central에 대해 최대 7개 연결 제한을 정의합니다. 실제로 제한은 칩 제조업체에 따라 다릅니다. Nordic nRF52840 칩은 최대 20개의 연결을 지원하는 반면, 일부 저가형 Bluetooth 어댑터는 3~4개 이상 지원하지 않습니다.
이유는 다양할 수 있습니다. 센서가 광고하지 않음(광고 모드 아님), UUID 필터가 너무 엄격함, 스마트폰에서 Bluetooth가 꺼져 있음, 필요한 권한이 없음(Android의 위치), 또는 센서가 범위를 벗어남(실내에서 최대 10미터 권장) 등이 있습니다.
반드시 그렇지는 않습니다. 많은 시나리오에서 연결 후 읽기 패턴이 사용됩니다. Central이 스캔하고, 연결하고, 필요한 데이터를 읽고, 연결을 끊습니다. 지속적인 연결은 스트리밍 데이터(맥박, 심전도)나 실시간 장치 제어에만 필요합니다.
스캔 윈도우 30~50ms, 스캔 간격 500~1000ms의 간격 스캔을 사용하세요. UUID로 장치를 필터링하여 관련 광고 패킷만 처리하세요. 원하는 Peripheral을 찾은 즉시 스캔을 중지하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.