목표
iOS에서 블루투스의 전반적인 기능과 구현방식을 알아보고 이해하기.
Core Bluetooth & BLE(Bluetooth Low Energy)
iOS와 Mac App들은 Core Bluetooth framework를 사용하여 BLE 기능이 탑재된 기기와 통신한다.
Ex) 심박수 모니터, 디지털 온도 조절계 등등..
Mac및 iOS 기기들은 MacOS 10.9, iOS 6버전 이상이라면 기능을 지원하기 때문에, 거의 모든 기기들이 기능을 가지고 있다고 할 수 있다.
Core Bluetooth Framework는 저수준의 BLE protocol stack을 추상화 해주어 개발자로 하여금 쉽게 블루투스 기능을 개발하게 도와준다.
* BLE란, 기존 블루투스의 단점이었던 전력 소모의 단점을 보완한 기술이다. 자세히
유의점
- Core Bluetooth에서 제공되는 class의 SubClassing은 지원되지 않음 - 있는 그대로 써라?
- Info.plist에 키 추가 안하면 Crash 남 - 밑의 키들을 꼭 추가할 것.
- iOS 13이상 NSBluetoothAlwaysUsageDescription
- iOS 12이하 NSBluetoothPeripheralUsageDescription
- macOS에서 실행되는 iPad App들은 Background Mode 실행 지원하지 않음
Core Bluetooth의 Key Players (Centrals & Peripherals)
Core Bluetooth에는 두 가지 핵심 개념이 있다.
Centrals
- 원하는 데이터(Want data)를 받는 쪽이다.
- Peripherals에서 오는 패킷을 Scan하고 Listen할 수 있다.(이를 Discover & Connect한다고 표현함)
- Peripherals와 성공적으로 연결이 되면, Peripherals가 제공하는 Service의 Characteristic을 읽거나 수정할 수 있다.
- Service, Peripherals가 가지고 있는 기능 중 하나 (Ex 온도조절 기능)
- Characteristic, Service가 가지고 있는 실질적 데이터 (Ex 25도)
Peripherals
- 데이터를 가지고 있고(Has data), 보내는 쪽이다.
- Advertising 패킷 형태로 가지고 있는 데이터를 Centrals에게 brodcast한다.(이를 advertising한다고 표현함)
- 1개 이상의 Service로 이루어져 있고, Service는 1개 이상의 Characteristic을 가질 수 있다.
일반적인 작동 Flow
Centrals
1. Central manager Object 생성 및 실행
- Central 기능을 담당하는 객체를 생성하는 단계
2. Advertising하는 Periphreal 기기들을 Scan 하는단계.
- 객체가 주변 기기들을 Scan하는 단계
- 이 단계에서, 매개변수에 아무런 값을 넣지 않으면 모든 기기를 검색한다.
- → 에너지를 많이 소모함.
- 실제 앱에서는 주변 기기가 Advertising하는 서비스의 UUID를 나타내는 CBUUID배열을 지정하여 검색.
- → 원하는 서비스의 기기만 검색가능함.
3. 찾은 기기와 Connect
- Scan하여 찾은 기기에게 연결을 요청하는 단계
- 연결을 시작하기 전에 Delegate를 설정 할 수 있음.
4. Periphreal 기기의 Service를 Discover
- Periphreal 기기를 찾았으니 기기가 제공하는 여러 Service 중 어떤 것을 쓸지 Discover하는 단계
- → 이미 Advertise를 타고 들어왔는데 왜 Service를 또 찾나??
- Periphreal 기기가 advertise 할수 있는 크기는 제한이 되어있기 때문에, advertise된 Service말고도 다른 Service를 찾을 수도 있기 때문.
- → 이것도 실제 앱에서는 매개변수를 통해 특정 Service를 이미 알고 있는 상태로 찾아 들어온다.
4. Service의 Characteristic Discover
- Service까지 Discover했으니 이제 해당 Service에서 제공하는 모든 Characteristic을 Discover한다.
- → 이것도 실제 앱에서는, 모든 Characteristic을 받으면 비효율적이기 때문에 매개변수를 통해 한번 거른다.
5. Characteristic안의 값 읽기 및 수정
- Characteristic까지 찾았으니 그 안에 있는 Value값을 가져오거나 수정할 수 있는 단계
- 단, 모든 값들을 읽거나 쓸수있는 건 아님.
- 체크하는 작업 필요
6. Characteristic의 Value를 Subscribe하기
- 특정 Characteristic 값 구독(값이 업데이트 되면 Noti받기 위함)
- dynamic한 값에 유용함.
- 단, 모든 값들을 subscribe할 수 있는 건 아님.
- 체크하는 작업 필요
Peripherals
Central의 과정과 비슷한 부분이 많다.
1. Peripherals manager Object 생성 및 실행
- Peripherals 기능을 담당하는 객체를 생성하는 단계
2. 기기안의 Services와 Characteristics를 설정 한다.
- Services와 Characteristics는 128비트의 UUID로 식별된다
- → UUID를 넣어주어야 한다.
- 일반적인 서비스들은 Bluetooth SIG(Special Interest Group)에서 미리 정해놓았기 때문에 이를 따르면 된다.
- Ex) SIG는 심박수 서비스를 180D라는 16bit UUID로 지정해 뒀다.(이는 128bit UUID의 축약본임) 참고
- 물론, Custom도 가능하다.
3. Services와 Characteristics를 Publish함.
- '2'에서 설정한 것들을 기기의 Local DataBase에 Publish하는 단계
- 한번 Service가 Database에 Publish되고 나면 Cache가 되고 변경할 수 없음.
4. Service를 Advertising함.
- Database에 추가까지 됬다면, 기기의 Service를 Advertise한다.
- 이때부터 Central들은 Connect가 가능하다.
5. Central에서 온 읽기 혹은 수정 요청을 처리한다.
6. 만약 subscribe한 Central이 있다면 값이 업데이트 될때 알림을 처리한다
세부 구현시 유의사항
Apple에서 제공해주는 Best Practice를 참고하여 구현
더 알아보면 좋을 것들
- 블루투스 보안과 해킹 기법들 참고
- iOS의 경우 iOS 10이전 버전에서 심각한 취약점인 BlueBorne이 발견 됐었음. - 이후 버전에서 보완완료
- 블루투스 사용안할 때 끄기
- 업데이트 자주하기
참고
https://blog.naver.com/ycpiglet/222630970457
https://developer.apple.com/documentation/corebluetooth
https://staktree.github.io/ios/iOS-Bluetooth-02-search-peripheral/
'iOS' 카테고리의 다른 글
Multiple Window를 이용하여 Cover Window 만들기. (0) | 2023.02.05 |
---|---|
Method Swizzling in iOS (0) | 2022.07.10 |
iOS의 뷰가 그려지는 과정 (0) | 2022.06.19 |
서버없이 Networking Test하기 with URLProtocol (2) | 2022.05.15 |
iOS Cache (2) | 2022.04.24 |
댓글