Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- rxswift
- Session
- error
- darkmode
- github
- 이미지
- Code
- Swift
- Realm
- appstore
- Xcode
- Git
- 한글
- FLUTTER
- 개발자
- Firebase
- UIButton
- window
- Notification
- JPA
- geofencing
- 웹뷰
- Archive
- Apple
- MacOS
- mac
- iOS16
- SwiftUI
- IOS
- view
Archives
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) Bluetooth 본문
반응형
Bluetooth의 정의
- 근거리 무선 통신 기술 규격
- 휴대폰, 노트북, 스마트워치 등의 기기 사이 데이터 통신
- 지속적으로 발전 (현재 v5.4까지 출시)
Bluetooth의 종류 2가지
- BLE (Bluetooth Low Energy)
- 4.0부터 지원 (아이폰6이 4.0/4.2 지원하므로 지원안될 걱정x)
- 낮은 전력 소비
- 낮은 데이터 전송 속도
- 적은 양의 데이터 전송에 적합 ( 스마트 워치, 비콘 등 IoT 기기들 )
- 비콘: 자신의 위치나 다양한 정보를 전송하는 소형 장치
- 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 통신 원리
- Peripheral의 Advertising
- Central의 스캔
- 연결
- 데이터 통신(GATT)
- 연결 해제

앱에서의 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 체크
- 동작 방식 (공식 문서에 적혀있음)
- BLE 이벤트를 받으면 Suspended던 앱이 Background로 복구되어 작업을 진행
- 주변 기기로부터 데이터를 수신할 때
- 연결이 설정되거나 해제될 때
- Background로 복구 된 후 작업시간은 10초 부여
- 너무 많은 시간을 소비할 경우 시스템에 의해 조절되거나 종료됨
- 목적과 관련 없는 작업을 수행해서는 안됨
- 진짜 10초인지 테스트 진행 → 10번 테스트 결과 평균 9.6초 (10~9.1 사이들)
- BLE 이벤트를 받으면 Suspended던 앱이 Background로 복구되어 작업을 진행
- 앱 스위처? 테스크 매니저? 로 인해 앱이 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. 보안
- 애플에서 잘 해놨다고 믿기
- 송/수신할 데이터 암호화하기 등
- 정보처리기사에 나오는 블루버그, 블루스나프, 블루프린팅, 블루재킹 등 보안이 중요한 서비스일 경우, 다양한 보안 솔루션을 따르거나 직접 구현하는 방법을 사용
9. 시간상 다루지못한 여담들
- 시스템에서 이미 연결되어, 주변 기기가 Advertisement를 중단하여 앱에서 스캔이 안될 경우
- 현재 시스템에서 연결된 주변기기 전체 목록을 획득할 수 없음 (Service로 조회는 가능)
- Bluetooth의 연결 불안정에 맞서는 다양한 시도들 (자동 재연결, 데이터 유실 관리)
- 디버깅 전략
- protocol로 추상화
- 데이터 추적(Live Capture)
- 공식 문서 부족
- 프레임워크 명세서 존재
- 아카이브 된 가이드 문서 ← 옵씨로 되어있음;
- 허성진님이 CoreBlueberry라는 프로젝트로 한글화 및 아카이빙 작업을 시도중Bluetooth의 정의
- 근거리 무선 통신 기술 규격
- 휴대폰, 노트북, 스마트워치 등의 기기 사이 데이터 통신
- 지속적으로 발전 (현재 v5.4까지 출시)
- 앱에서의 BLE 활용 사례
- 허성진님이 CoreBlueberry라는 프로젝트로 한글화 및 아카이빙 작업을 시도중Bluetooth의 정의
* ref
2023 Let’Swift 허성진님 CoreBluetooth로 BLE기기를 연동할 때 마주하는 문제들과 부딪혀보기