[swift] Swift Core Bluetooth를 활용한 스마트 홈 기기 연동

스마트 홈은 우리 생활을 편리하게 만들어주는 기술입니다. 간단한 조작으로 가전 제품들을 제어하거나 상태를 모니터링할 수 있습니다. 이번 글에서는 Swift Core Bluetooth를 사용하여 스마트 홈 기기를 연동하는 방법에 대해 알아보겠습니다.

Core Bluetooth란?

Core Bluetooth는 iOS와 macOS에서 iOS 기기와 외부 장치 간에 무선 통신을 수행할 수 있는 프레임워크입니다. 이를 통해 Bluetooth Low Energy(BLE)를 지원하는 장치와 통신할 수 있습니다. 스마트 홈 기기 중에서도 BLE를 지원하는 기기들을 Core Bluetooth를 통해 연동할 수 있습니다.

프로젝트 설정

먼저, Xcode에서 사용할 프로젝트를 생성하고 Core Bluetooth를 사용할 수 있도록 설정해야합니다. 프로젝트의 Target 설정으로 들어가서 “Capabilities” 탭에 들어간 뒤, “Background Modes” 항목을 활성화합니다. 이후 “Uses Bluetooth LE accessories” 옵션을 선택합니다.

Central Manager 설정

Central Manager는 BLE 통신을 관리하는 역할을 합니다. Central Manager를 초기화하고 기기와 연결하고자 하는 서비스 및 특성을 스캔하는 등의 작업을 수행할 수 있습니다.

import CoreBluetooth

class ViewController: UIViewController, CBCentralManagerDelegate {

    var centralManager: CBCentralManager!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Central Manager 초기화
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }
    
    // BLE 상태 변화 감지
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            // 스캔 시작
            centralManager.scanForPeripherals(withServices: nil)
        } else {
            // BLE 비활성화 알림
        }
    }
    
    // BLE 디바이스를 찾으면 호출되는 메소드
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // 연결하고자 하는 기기를 찾으면 연결 수행
        if peripheral.name == "SmartHomeDevice" {
            centralManager.connect(peripheral, options: nil)
        }
    }
    
    // 디바이스 연결 성공시 호출되는 메소드
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        // 연결된 기기에서 서비스 스캔
        peripheral.discoverServices(nil)
    }
    
    // 디바이스 연결 실패시 호출되는 메소드
    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
        // 연결 실패 알림
    }
}

위의 코드에서 Central Manager의 delegate 메소드를 구현하여 연결, 연결 실패 및 디바이스 스캔 등의 이벤트를 처리할 수 있습니다.

서비스 및 특성 탐색

디바이스와 연결이 성공하면 해당 디바이스에서 제공하는 서비스 및 특성을 탐색해야합니다. 이를 위해 delegate 메소드를 구현합니다.

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard let services = peripheral.services else {
        return
    }
    
    for service in services {
        // 원하는 서비스 찾기
        if service.uuid == CBUUID(string: "ServiceUUID") {
            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 == CBUUID(string: "CharacteristicUUID") {
            // 특성 값을 읽거나 쓰기 위한 작업 수행
        }
    }
}

위의 코드에서는 디바이스에서 제공하는 서비스와 그 서비스에 포함된 특성들을 탐색하는 과정을 보여줍니다. 원하는 서비스 또는 특성을 찾으면 해당 작업을 수행할 수 있습니다.

특성 값 읽기 및 쓰기

특성 값을 읽거나 쓰기 위해서는 readValue(for:), writeValue(_:for:)와 같은 메소드를 사용합니다.

peripheral.readValue(for: characteristic)

peripheral.writeValue(value, for: characteristic, type: .withResponse)

위의 코드에서 characteristic는 원하는 특성을 가리킵니다. readValue(for:)를 호출하여 특성 값을 읽어올 수 있고, writeValue(_:for:)를 호출하여 특성 값으로 쓸 값을 전달할 수 있습니다.

결론

이렇게 Swift Core Bluetooth를 사용하여 스마트 홈 기기를 연동하는 방법을 알아보았습니다. Core Bluetooth를 사용하면 iOS 기기에서 BLE 통신을 통해 다양한 스마트 홈 기기들과 손쉽게 연결할 수 있습니다. 자유롭게 Core Bluetooth를 활용하여 스마트 홈 앱을 개발해보세요!

참고 자료