[swift] Swift Core Bluetooth의 적용 사례

Swift Core Bluetooth는 iOS 앱에서 블루투스 연결을 구현하는 데 사용되는 프레임워크입니다. 이를 통해 앱은 다른 블루투스 장치와 통신하고 데이터를 교환할 수 있습니다. 이 글에서는 Swift Core Bluetooth를 사용하여 간단한 예제를 만들어보겠습니다.

예제 설명

이 예제는 iPhone을 통해 블루투스로 연결된 LED 조명을 제어하는 앱을 만드는 것을 목표로 합니다. 사용자는 앱을 통해 LED를 켜고 끌 수 있으며, 또한 LED의 색상을 변경할 수도 있습니다.

단계 1: 프로젝트 설정

  1. Xcode를 열고 “New Project”를 선택하여 새로운 iOS 앱 프로젝트를 생성합니다.
  2. 프로젝트 설정에서 “Capabilities” 탭으로 이동하고 “Background Modes”를 활성화합니다. “Uses Bluetooth LE accessories”를 선택합니다.
  3. “Info.plist” 파일에서 “Privacy - Bluetooth Peripheral Usage Description” 키를 추가하고 사용자에게 블루투스 장치에 액세스하는 이유를 설명하는 메시지를 입력합니다.

단계 2: Core Bluetooth 관리자 생성

  1. import CoreBluetooth 문을 추가하여 Core Bluetooth 프레임워크를 임포트합니다.
  2. class ViewController: UIViewController, CBCentralManagerDelegate와 같이 CBCentralManagerDelegate 프로토콜을 상속하는 ViewController 클래스를 만듭니다.
  3. ViewController 클래스에 다음 코드를 추가하여 Core Bluetooth 관리자를 만듭니다.
var centralManager: CBCentralManager!

override func viewDidLoad() {
    super.viewDidLoad()

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

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    if central.state == .poweredOn {
        // 블루투스가 켜져 있는 경우
    } else {
        // 블루투스가 꺼져 있는 경우 또는 제한된 상태인 경우
    }
}

단계 3: 블루투스 장치 검색

  1. ViewController 클래스에 다음 코드를 추가하여 블루투스 장치 검색을 시작합니다.
func startScanning() {
    centralManager.scanForPeripherals(withServices: nil, options: nil)
}

func stopScanning() {
    centralManager.stopScan()
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    // 장치를 찾았을 때 수행할 작업을 여기에 추가합니다.
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    startScanning()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    stopScanning()
}

위의 코드에서 startScanning 함수는 블루투스 장치 검색을 시작하고, stopScanning 함수는 검색을 멈춥니다. didDiscover 메서드는 장치를 발견했을 때 호출됩니다.

단계 4: 장치에 연결하고 데이터 교환

  1. ViewController 클래스에 다음 코드를 추가하여 장치에 연결하고 데이터를 교환할 준비를 합니다.
var connectedPeripheral: CBPeripheral!

func connectToDevice(_ peripheral: CBPeripheral) {
    centralManager.connect(peripheral, options: nil)
}

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    connectedPeripheral = peripheral
    peripheral.delegate = self
    peripheral.discoverServices(nil)
}

위의 코드에서 connectToDevice 함수는 선택한 장치에 연결하도록 합니다.

  1. ViewController 클래스에 CBPeripheralDelegate 프로토콜을 구현한 확장을 추가합니다.
extension ViewController: CBPeripheralDelegate {

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

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if let characteristics = service.characteristics {
            for characteristic in characteristics {
                // 장치의 특성을 찾았을 때 수행할 작업을 여기에 추가합니다.
            }
        }
    }

    // 데이터 교환을 위한 추가적인 메서드를 구현할 수 있습니다.
}

위의 코드는 장치와 서비스, 특성을 검색한 후 해당 데이터를 교환하기 위한 추가 메서드를 구현하는 예입니다.

결론

Swift Core Bluetooth를 사용하여 iOS 앱에서 블루투스 장치와 연결하고 데이터를 교환하는 방법을 살펴보았습니다. 이를 기반으로 LED 조명을 제어하는 앱을 만들 수 있습니다. Swift Core Bluetooth의 기능을 활용하면 다양한 종류의 블루투스 장치와 통신할 수 있으며, IoT 및 웨어러블 디바이스 등에 유용하게 활용할 수 있습니다.

참고 자료