[swift] Swift Core Bluetooth와 중앙 및 주변 기기 역할 지정

Swift Core Bluetooth는 iOS 및 macOS에서 Bluetooth 기능을 사용하는 애플리케이션을 개발할 수 있도록 도와주는 프레임워크입니다. Core Bluetooth를 사용하여 중앙 혹은 주변 기기 역할을 할 수 있습니다. 이번 블로그 포스트에서는 Swift를 사용하여 Core Bluetooth를 통해 중앙 및 주변 기기 역할을 지정하는 방법에 대해 알아보겠습니다.

1. 중앙 기기 역할

중앙 기기는 Bluetooth 연결을 관리하고 주변 기기와 통신하는 역할을 담당합니다. 이것은 주로 iOS 또는 macOS 앱에 해당합니다.

중앙 기기를 만들기 위해 다음 단계를 따르세요:

단계 1: CBCentralManager 인스턴스 생성

중앙 기기를 생성하기 위해 우선 CBCentralManager 인스턴스를 생성해야 합니다. 이 인스턴스는 Bluetooth 기능에 대한 액세스를 제공하고 중앙 기기의 동작을 관리합니다. 다음과 같은 코드로 CBCentralManager 인스턴스를 생성할 수 있습니다:

import CoreBluetooth

let centralManager = CBCentralManager(delegate: self, queue: nil)

단계 2: CBCentralManagerDelegate 구현

CBCentralManagerDelegate 프로토콜을 구현하여 중앙 기기의 동작을 관리합니다. 중앙 기기에서 주변 기기를 검색하거나 주변 기기와의 연결을 처리할 수 있습니다. 예를 들어, 주변 기기를 검색하기 위해 scanForPeripherals 메서드를 호출하거나 주변 기기와 연결하기 위해 connect 메서드를 호출할 수 있습니다.

extension YourViewController: CBCentralManagerDelegate {
    // 중앙 기기의 상태가 변경될 때 호출됩니다.
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        // Bluetooth 상태 체크
        if central.state == .poweredOn {
            // 주변 기기 검색 시작
            centralManager.scanForPeripherals(withServices: nil, options: nil)
        } else {
            // Bluetooth가 꺼져있는 경우 사용자에게 메시지 표시
            print("Bluetooth is not available.")
        }
    }
    
    // 주변 기기를 발견했을 때 호출됩니다.
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // 발견된 주변 기기에 대한 처리
    }
    
    // 주변 기기와의 연결이 성공했을 때 호출됩니다.
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        // 주변 기기와의 연결에 대한 처리
    }
}

위의 예제 코드에서는 centralManagerDidUpdateState 메서드를 사용하여 Bluetooth 상태를 확인하고, scanForPeripherals 메서드를 사용하여 주변 기기 검색을 시작합니다. 또한, didDiscover 메서드와 didConnect 메서드를 사용하여 주변 기기를 발견하거나 연결하였을 때 처리할 수 있습니다.

2. 주변 기기 역할

주변 기기는 중앙 기기와 통신하기 위해 Bluetooth 신호를 브로드캐스팅하는 역할을 담당합니다. 보통 주변 기기는 하드웨어 장치나 센서와 연결되어 작동합니다.

주변 기기를 만들기 위한 단계는 다음과 같습니다:

단계 1: CBPeripheralManager 인스턴스 생성

주변 기기를 생성하기 위해 우선 CBPeripheralManager 인스턴스를 생성해야 합니다. 이 인스턴스는 주변 기기의 동작을 관리하고 중앙 기기와의 통신을 처리합니다. 다음과 같은 코드로 CBPeripheralManager 인스턴스를 생성할 수 있습니다:

import CoreBluetooth

let peripheralManager = CBPeripheralManager(delegate: self, queue: nil)

단계 2: CBPeripheralManagerDelegate 구현

CBPeripheralManagerDelegate 프로토콜을 구현하여 주변 기기의 동작을 관리합니다. 주변 기기에서 중앙 기기의 요청에 응답하거나 서비스 및 특성을 제공할 수 있습니다. 예를 들어, 주변 기기에서 요청에 응답하기 위해 respond(to:withResult:) 메서드를 구현하거나 서비스 및 특성을 제공하기 위해 add(_:) 메서드를 호출할 수 있습니다.

extension YourViewController: CBPeripheralManagerDelegate {
    // 주변 기기의 상태가 변경될 때 호출됩니다.
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        // Bluetooth 상태 체크
        if peripheral.state == .poweredOn {
            // 서비스 및 특성 추가
            let service = CBMutableService(type: CBUUID(string: "your_service_uuid"), primary: true)
            // 서비스에 특성 추가
            service.characteristics = [yourCharacteristic]
            // 주변 기기에 서비스 등록
            peripheralManager.add(service)
            // 주변 기기가 광고되도록 시작
            peripheralManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey : ["your_service_uuid"]])
        } else {
            // Bluetooth가 꺼져있는 경우 사용자에게 메시지 표시
            print("Bluetooth is not available.")
        }
    }
    
    // 중앙 기기에서 읽기 요청이 온 경우 호출됩니다.
    func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
        // 요청에 대한 응답
    }
    
    // 중앙 기기에서 쓰기 요청이 온 경우 호출됩니다.
    func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) {
        // 요청에 대한 응답
    }
}

위의 예제 코드에서는 peripheralManagerDidUpdateState 메서드를 사용하여 Bluetooth 상태를 확인하고, add 메서드를 사용하여 서비스와 특성을 추가합니다. 또한, didReceiveReaddidReceiveWrite 메서드를 사용하여 중앙 기기의 읽기 및 쓰기 요청에 응답할 수 있습니다.

결론

이러한 단계를 따라 Swift Core Bluetooth를 사용하여 중앙 및 주변 기기 역할을 지정할 수 있습니다. 중앙 기기는 Bluetooth 연결을 관리하고 주변 기기와 통신할 수 있습니다. 주변 기기는 중앙 기기의 요청에 응답하거나 서비스 및 특성을 제공할 수 있습니다. 이러한 기능을 활용하여 Bluetooth를 쉽게 사용할 수 있으며, 다양한 애플리케이션에서 활용할 수 있습니다.

자세한 내용은 Apple Developer Documentation을 참조하십시오.