EEYatHo 앱 깎는 이야기

Swift ) Bluetooth 본문

iOS, Swift/Bluetooth

Swift ) Bluetooth

EEYatHo 2024. 10. 15. 16:19
반응형

 

Bluetooth의 정의


  • 근거리 무선 통신 기술 규격
  • 휴대폰, 노트북, 스마트워치 등의 기기 사이 데이터 통신
  • 지속적으로 발전 (현재 v5.4까지 출시)

 

 

Bluetooth의 종류 2가지


  1. BLE (Bluetooth Low Energy)
    • 4.0부터 지원 (아이폰6이 4.0/4.2 지원하므로 지원안될 걱정x)
    • 낮은 전력 소비
    • 낮은 데이터 전송 속도
    • 적은 양의 데이터 전송에 적합 ( 스마트 워치, 비콘 등 IoT 기기들 )
      • 비콘: 자신의 위치나 다양한 정보를 전송하는 소형 장치
  2. Bluetooth Classic (BR/EDR)
    • 2.0/2.1 기반
    • 높은 전력 소비
    • 높은 데이터 전송 속도
    • 대용량의 데이터 전송에 적합 (통화, 음악 스트리밍 등 )
  • Dual Mode : BLE와 Bluetooth Classic를 모두 지원함을 의미
    • 스마트폰, 태블릿 등이 존재

 

 

BLE 용어


  • Central, Peripheral (중앙 장치, 주변 장치)
    • Central : 중앙 장치. 주변 장치와 연결한 후 데이터를 요청 및 수신 (like client)
    • Peripheral : 주변 장치. 중앙 장치에게 데이터 제공 (like server)
  • Advertisement
    • Peripheral이 나의 위치나 이름, 식별자를 계속 방출하는 것
    • Central은 이를 수신하여 연결하게 됨
    • 특정 Central을 대상으로 광고하는 것이 아닌, 주변에 신호를 흩뿌림
  • 그 외 GATT, Characteristic, Descriptor, Service, UUID 등

 

 

BLE 통신 원리


  1. Peripheral의 Advertising
  2. Central의 스캔
  3. 연결
  4. 데이터 통신(GATT)
  5. 연결 해제

 

 

앱에서의 BLE 활용 사례


  • 방문 매장 식별 : 스타벅스
  • 이동수단 대여 : 쏘카, 킥고잉, 따릉이
  • 센서 데이터 획득 : 핏데이, 오므론 커넥트
  • 그 외 : 내 주변 송금(카카오페이), 함께 켜기(토스),
  • 허성진님이 만든 채팅. 블루베리톡 → 리젝당함..

 

 

CoreBluetooth 소개


  • BLE 통신을 위해 사용되는 프레임워크
  • iOS 5.0부터 제공하는 근본있는 라이브러리
  • iOS 13.0 부터 Bluetooth Classic도 지원함
  • 크게 2가지 모드를 지원 ( Central Mode, Peripheral Mode )
    • 아이폰은 중앙장치, 주변장치, 동시에 지원이 가능함
    • Central Mode
      • CBCentralManager를 활용하여 CBPeripheral 들을 스캔, 연결, 관리할 수 있음
    • Peripheral Mode
      • CBPeripheralManager를 활용하여 나를 스캔한 CBCentral에 대해 어떻게 할지 구현

 

 

마주하는 문제들


1. 연결과 페어링의 차이

  • 페어링
    • 블루투스 기기 간의 안전한 통신을 위한 절차
    • Like 핸드쉐이킹, 핀 교환 등
  • 연결
    • 블루투스를 통해 두 장치간의 직접적인 통신을 수행하는 것
    • BLE는 페어링 없이도 “연결”이 가능

 

2. Byte 연산

  • Byte ↔ Data 변환이 필요한데 익숙치 않음
  • Swift에서는 UInt8 ↔ Data 로 하게됨
  • 간단한 생성자를 사용하면 됨. 다만 처음하실 때 몰라서 헤맸다고함
// UInt8 → Data
let bytes: [UInt8]
Data(bytes: bytes, count: bytes.count)

// Data → UInt8
let bytes: [UInt8] = .init(data)
  • Big-Endian, Little-Endian 둘 중에 어떤걸로 할지 펌웨어 개발자와 잘 맞추어서 해야함

 

3. 원하는 기기만 스캔되게 해주세요.

  • 특정 주변 장치만 인식하는 것이 목적
  • LocalName, ServiceUUID, ManufacturerData 활용
  • LocalName
    • 스캔 된 주변 기기의 advertisementData에 들어있는 LocalName을 가지고 코드에서 필터링
  • ServiceUUID
    • ServiceUUID는 BLE가 제공해주는 서비스의 ID
    • 하나의 기기가 여러 ServiceUUID를 가질 수 있음
    • 스캔하기전에 ServiceUUID를 필터링해서 스캔할 수 있고, 스캔 후 advertisementData에 들어있는 ServiceUUID를 활용해도 됨
  • ManufacturerData
    • 하드웨어가 advertisementData에 추가 정보를 담아서 전달
    • 펌웨어에서 이미 처리되어 있어야함
    • 상호 합의된 정보를 담아서, 스캔 후 advertisementData에 들어있는 ManufacturerData를 활용

4. 과거에 연결한 기기를 다시 연결시켜주세요. 

  • CBperipheral.identifier (UUID)를 이용하여 과거에 연결한 기기인지 확인 가능
    • 다만, 두 기기사이의 id이므로 다른 디바이스에서는 유효하지 않음
  • 그럼 다른 디바이스에서도 식별하고 싶다면?
    • Name : 이름은 중복될 수 있어서 조금 위험
    • ManufacturerData : 마찬가지로 상호 협의된 정보를 활용

 

5. 백그라운드에서도 동작하게 해주세요

  • 가장 핫하고 중요한 부분..
  • Central 모드로 사용할 것이라면, Capabilities의 Background Modes에서 Uses Bluetooth LE accessories를 체크
  • Peripheral 모드로 사용할 것이라면, Acts as a Bluetooth LE accessory 체크
  • 동작 방식 (공식 문서에 적혀있음)
    1. BLE 이벤트를 받으면 Suspended던 앱이 Background로 복구되어 작업을 진행
      • 주변 기기로부터 데이터를 수신할 때
      • 연결이 설정되거나 해제될 때
    2. Background로 복구 된 후 작업시간은 10초 부여
      • 너무 많은 시간을 소비할 경우 시스템에 의해 조절되거나 종료됨
      • 목적과 관련 없는 작업을 수행해서는 안됨
      • 진짜 10초인지 테스트 진행 → 10번 테스트 결과 평균 9.6초 (10~9.1 사이들)
  • 앱 스위처? 테스크 매니저? 로 인해 앱이 Inactive되면 별도의 작업이 없다면 Suspend로 가게 됨
    • 이후 BLE 이벤트를 수신하고 10초 동안 DB에 저장하던 API를 쏘던 하는 것

 

  • Suspended에서 얼마나 오래 있어도 되는가?
    • 실험하신바로는 2시간 뒤에도 잘 되고
    • 상용 앱에서 찍은 로그는 12시간 뒤에도 백그라운드로 복구가 되었다고함

  • 핵심은 주변 기기에게 의존하여 백그라운드로 살아난다는 것
    • 비지니스나 운영에서 잘 알고있어야 하는 부분.

 

6. 종료된 앱을 다시 실행할 수 는 없을까? (Not Running 상태)

  • iBeacon을 활용하여 접근하는 방법
    • iBeacon : Apple에서 발표한, Beacon의 표준 프로토콜. BLE를 이용해 지역 공간 기반 서비스와 정보를 제공하는 기술
    • iOS에서 iBeacon은 위치 서비스로도 분류됨
    • 사용자가 강제종료한 앱을 깨우는 백그라운드 모드 서비스는 거의 없는데, 그 중 하나가 CoreLocation의 Region Monitoring (모드: Location updates)
    • 이론상 iBeacon을 이용하여 종료된 앱을 다시 깨울 수 있다.
    • iBeacon을 앱 실행 후 수동으로 한 번 연결하면, RegionMonitoring이 가능하다.
    • iBeacon의 RegionMonitoring은 필요에 따라 종료된 앱을 다시 실행하며, 필요한 작업을 수행할 수 있는 10초의 시간을 제공한다.
    • 이 때 BLE 재연결을 시도한다.

 

7. 배터리 사용량이 크다는 점. 비지니스나 운영에서 인지하고 있어야함

 

8. 보안

  1. 애플에서 잘 해놨다고 믿기
  2. 송/수신할 데이터 암호화하기 등
  • 정보처리기사에 나오는 블루버그, 블루스나프, 블루프린팅, 블루재킹 등 보안이 중요한 서비스일 경우, 다양한 보안 솔루션을 따르거나 직접 구현하는 방법을 사용

 

9. 시간상 다루지못한 여담들

  1. 시스템에서 이미 연결되어, 주변 기기가 Advertisement를 중단하여 앱에서 스캔이 안될 경우
  2. 현재 시스템에서 연결된 주변기기 전체 목록을 획득할 수 없음 (Service로 조회는 가능)
  3. Bluetooth의 연결 불안정에 맞서는 다양한 시도들 (자동 재연결, 데이터 유실 관리)
  4. 디버깅 전략
    1. protocol로 추상화
    2. 데이터 추적(Live Capture)
  5. 공식 문서 부족
    1. 프레임워크 명세서 존재
    2. 아카이브 된 가이드 문서 ← 옵씨로 되어있음;
      1. 허성진님이 CoreBlueberry라는 프로젝트로 한글화 및 아카이빙 작업을 시도중Bluetooth의 정의
        • 근거리 무선 통신 기술 규격
        • 휴대폰, 노트북, 스마트워치 등의 기기 사이 데이터 통신
        • 지속적으로 발전 (현재 v5.4까지 출시)
      2. 앱에서의 BLE 활용 사례

 

* ref

2023 Let’Swift 허성진님 CoreBluetooth로 BLE기기를 연동할 때 마주하는 문제들과 부딪혀보기

Comments