[swift] Swift Core Bluetooth를 사용한 자동화 기기 제어

이번 블로그 게시물에서는 Swift Core Bluetooth 프레임워크를 사용하여 자동화 기기를 제어하는 방법에 대해 알아보겠습니다. Swift Core Bluetooth는 iOS 및 macOS에서 Bluetooth Low Energy(BLE) 기능을 사용하기 위한 프레임워크입니다.

1. Core Bluetooth 프로젝트 설정

Core Bluetooth를 사용하기 위해서는 프로젝트 설정 단계에서 몇 가지 추가 작업이 필요합니다.

1.1. Capabilities 설정

Xcode에서 프로젝트의 Signing & Capabilities 탭으로 이동하고, Background Modes를 추가합니다. 그리고 Uses Bluetooth LE accessoriesActs as a Bluetooth LE accessory 항목을 체크합니다.

1.2. Info.plist 설정

Info.plist 파일에서 Privacy - Bluetooth Peripheral Usage Description 항목을 추가하고, Bluetooth 기기로의 접근 목적에 대한 설명을 입력합니다.

2. Bluetooth 장치 검색 및 연결

Core Bluetooth를 사용하여 Bluetooth 장치를 검색하고 연결하는 방법을 알아보겠습니다.

import CoreBluetooth

class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {

    var centralManager: CBCentralManager!

    override init() {
        super.init()
        centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
    }

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            centralManager.scanForPeripherals(withServices: nil, options: nil)
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // Bluetooth 장치를 찾았을 때 호출되는 메서드
        // 연결하려는 장치의 정보를 확인하고, 연결 요청을 보낼 수 있습니다.
    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        // Bluetooth 장치와의 연결이 성공했을 때 호출되는 메서드
        // 연결된 장치와의 통신을 위한 서비스 및 특성을 검색할 수 있습니다.
    }
}

위 예제에서는 BluetoothManager라는 클래스를 사용하여 Bluetooth 장치의 검색 및 연결을 관리합니다. CBCentralManagerDelegateCBPeripheralDelegate 프로토콜을 채택하여 필요한 메서드를 구현합니다. centralManagerDidUpdateState 메서드에서는 Bluetooth 사용 가능 상태인지 확인하고, scanForPeripherals 메서드를 호출하여 장치 검색을 시작합니다. didDiscover 메서드에서는 검색된 장치를 처리하고, didConnect 메서드에서는 장치와의 연결 성공 후 동작을 정의합니다.

3. 서비스와 특성 검색

Bluetooth 장치와 연결된 후에는 해당 장치의 서비스와 특성을 검색하여 제어할 수 있습니다.

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard let services = peripheral.services else { return }
        
    for service in services {
        peripheral.discoverCharacteristics(nil, for: service)
    }
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    guard let characteristics = service.characteristics else { return }
        
    for characteristic in characteristics {
        if characteristic.uuid == YOUR_CHARACTERISTIC_UUID {
            // 특성에 대한 동작을 수행합니다.
        }
    }
}

위 예제에서는 CBPeripheralDelegate 프로토콜로부터 제공되는 didDiscoverServicesdidDiscoverCharacteristicsFor 메서드를 사용하여 서비스와 특성을 검색합니다. 특정 특성을 찾으면 해당 특성에 대한 동작을 수행할 수 있습니다. 반복문을 사용하여 검색된 서비스와 특성을 처리할 수 있습니다.

4. 자동화 기기 제어

서비스와 특성을 검색한 후에는 자동화 기기를 제어할 수 있는 명령을 보낼 수 있습니다.

func writeValueToCharacteristic(characteristic: CBCharacteristic, data: Data) {
    peripheral.writeValue(data, for: characteristic, type: .withResponse)
}

func readValueFromCharacteristic(characteristic: CBCharacteristic) {
    peripheral.readValue(for: characteristic)
}

func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
    // 특성에 값을 쓴 후 호출되는 메서드
}

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    // 특성의 값을 읽은 후 호출되는 메서드
}

위 예제에서는 writeValueToCharacteristicreadValueFromCharacteristic 메서드를 사용하여 특성에 값을 쓰거나 읽을 수 있습니다. 쓰기 작업이 완료되면 didWriteValueFor 메서드가 호출되고, 읽기 작업이 완료되면 didUpdateValueFor 메서드가 호출됩니다.

5. 결론

이번 블로그 게시물에서는 Swift Core Bluetooth 프레임워크를 사용하여 자동화 기기를 제어하는 방법을 살펴보았습니다. Bluetooth 장치의 검색, 연결, 서비스 및 특성 검색, 그리고 제어 기능에 대해 알아보았습니다. 이를 기반으로 자동화 기기를 Swift 언어로 제어하는 애플리케이션을 개발할 수 있습니다.

참고 자료: