본문 바로가기

swift공부

Core Bluetooth(BLE, Classic)

Core Bluetooth로 서비스를 만들고 있기 때문에 해당 기술에 대한 정리를 한 번 해보고자 합니다.

BLE

  • BLE 는 Bluetooth Low Energy라는 의미로 저전력 통신을 목적으로 설계된 블루투스 프로토콜
  • 배터리 소모를 최소화, 짧은 데이터 교환을 목적으로 사용

 

Bluetooth Classic

Bluetooth Profile

  • 블루투스 프로파일 = “이 연결로 무엇을 할 것인가에 대한 규칙”
  • 주된 프로파일 HFP, A2DP

HFP

  • 오디오 방향 - 양방향 (마이크 + 스피커)
  • 음질 - A2DP에 비해 상대적으로 떨어짐
  • 전화, 음성 대화, 음성 인식 등의 기술에 사용됨
  • Bluetooth Classic

A2DP

  • 오디오 방향 - 단방향(송신 → 수신)
  • 음질 - 좋음
  • 음악, 소리 등의 기술에 사용됨
  • Bluetooth Classic

 

GATT

GATT는 Client / Server 모델

  • Central = GATT Client - 요청
  • Peripheral = GATT Server - 제공

즉, 앱은 클라이언트, BLE 기기는 서버

 

Service

  • 기능 카테고리
  • service 자체에는 데이터가 없음, characteristic을 담는 컨테이너 역할
  • ex) battery 서비스

Characteristic

  • 통신의 최소 단위

 

Core Bluetooth 통신 흐름

1.centralManagerDidUpdateState(.poweredOn)

  • central manager가 상태가 업데이트 되었음을 알려줌
  • 블루투스가 꺼져있거나 특정 상태에 팝업을 띄워주는 상태로 쓰임

2.scanForPeripherals()

  • advertising service를 제공하는 주변 기기들을 검색함

3.didDiscover(peripheral, advData, RSSI)

  • central manager가 검색한 peripheral을 알려줌
  • 얻은 peripheral를 연결 작업을 진행할 수 있는 상태

4.connect(peripheral)

  • 선택된 peripheral에 대해 연결 요청

5.didConnect(peripheral)

  • central manager가 peripheral에 연결되었음을 알려줌
  • 이 때부터 peripheral에 접근 가능

6.discoverServices()

  • peripheral의 서비스를 검색

7.didDiscoverServices()

  • 주변 장치 검색이 성공했음을 알림

8.discoverCharacteristics(service)

  • 찾은 serivce의 characteristics를 검색

9.didDiscoverCharacteristics()

  • Peripheral이 service에 대한 characteristics를 찾았음을 알림.

10.setNotifyValue(true)

  • Peripheral → App
  • characteristics 값이 변경될 때마다 알림을 받을지 여부를 나타내는 메서드.
  • 심박수나 온도 변경 감지와 같이 변경을 알기 위해서는 해당 메서드로 변경을 감지할 수 있도록 함
  • 반대로 디바이스 정보, 펌웨어 버전과 같이 1번만 받으면 되는 값들은 해당 메서드를 세팅하지 않고 한번만 read할 수 있도록 함

11.didUpdateValue (Notify)

  • Peripheral → App
  • 지정된 chracteristics 값을 가져오는데 성공하거나 특성의 값이 변경되었음을 알리는 메서드

값을 받을 때 특정 규약에 맞춰 값을 읽을 수 있음. ex) 퀄컴에서 만든 Gaia protocol

12.writeValue(data)

  • characteristic에 값을 써서 명령하는 메서드

13.didWriteValueForCharacteristic

  • 보낸 요청이 peripheral이 정상적으로 전달됐는지 확인하기 위한 메서드

BLE에서의 잘못된 요청 2가지

  1. 전송 자체가 실패한 경우
    1. 이 경우 didWriteValueForCharacteristic에서 에러를 잡고 didUpdateValueFor에서는 응답하지 않음
    2. Ex) 연결이 끊김
  2. 전송은 됐지만 내용이 잘못된 경우
    1. didWriteValueFor은 성공하지만 didUpdateValueFor에서 에러 이벤트를 받음

15.didDisconnect(peripheral)

  • central manager가 peripheral와 연결이 끊어졌음을 알리는 메서드