๐ 2020.6.9 (TUE)
๐ WWDC2017 | Session : 712 | Category : System Frameworks
๐ https://developer.apple.com/videos/play/wwdc2017/712/
๐ Discover how watchOS 4 makes it possible for a watchOS app to communicate with Bluetooth Low Energy accessories. Learn about changes to Core Bluetooth that improve reliability and enable high performance streaming connections with Bluetooth Low Energy Accessories. Understand the best practices in Bluetooth Low Energy accessory design.
Bluetooth Low Energy has two roles
- Central : look for devices that are around your environment
- Peripherals : beacon to the world, send out data or just let their presence be known
Bluetooth Low Energy ์ ๋๊ฐ์ง ์ญํ
- Central :์ฃผ๋ณ์ ์๋ ๋๋ฐ์ด์ค ํ์
- Peripherals : ์ ํธ ๋ณด๋ด๊ธฐ, ๋ฐ์ดํฐ ์ ์ก, ์กด์ฌ ์๋ฆฌ๊ธฐ
After you find this device that's around you, you can connect to your device and then you have bidirectional communication through what's called the GATT Protocol(takes all of your data and expose them in a hierarchy called services and characteristics).
CGService : contain characteristics inside of it
์ฃผ๋ณ์ ์๋ ๋๋ฐ์ด์ค๋ฅผ ์ฐพ์ผ๋ฉด, ๋์ ๊ธฐ๊ธฐ์ ์ฐ๊ฒฐ ํ ์ ์๊ณ , GATT ํ๋กํ ์ฝ์ ํตํด ์๋ฐฉํฅ ์ํต์ด ๊ฐ๋ฅํ๋ค. GATT ํ๋กํ ์ฝ์ ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ services and characteristics ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ณ์ธต์ ๋ ธ์ถํ๋ค.
CBSerivce ๋ CBCharacteristic ์ ํฌํจํ๊ณ ์๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ๋์ ์ ํ ๋๋ฐ์ด์ค๋ ์ฐ๊ฒฐ์ ์ค๊ฐ ์ญํ ์ ํ ๊ฒ์ด๊ณ peripheral ์ ์ฐ๊ฒฐ ํ ๊ฒ์ด๋ค. ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ ์ ์๋ค.
retrieveConnectedPeripherals
: ์ฐ๊ฒฐ ๋์ด์๋ peripheral ๋ค์ ๊ฒ์ ํ ์ ์๋ค.
retrievePeripherals(withIdentifiers :)
: ํธ์ถ ํ ์ ์๋ ใ
ใ
์ identifier์ ๊ฐ์ง๊ณ ์์ผ๋ฉด peripheral ์ ๊ฐ์ ธ ์ฌ ์ ์๋ค.
๋๋ฐ์ด์ค๋ฅผ ํ๋ฃจ ์ข ์ผ ์ฐ๊ฒฐ์์ผ ๋๊ณ ์ถ์ดํ๋ค. ์ฐจ๊ณ ์๋ ๋์์ด๋ ์๋ ๋์์๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์ถ์ดํ๋ฉฐ ์ก์ธ์๋ฆฌ์์ ์ฐ๊ฒฐ์ด ์ ๋ขฐ๋์ด์ผ ํ๋ค.
- Central operation s can continue when your app is not running
- Scan for new devices with services
- Connect to an already known device
Central์ ์๋ก์ด ๊ธฐ๊ธฐ๋ฅผ ์ค์บ ํ ์ ์๊ณ , ๋์ ์ฑ์ด ๋ฉ๋ชจ๋ฆฌ ์ด์ ๋ฑ์ด ์์ ๋ Core Blutooth๊ฐ ๊ณ์ ๋ ์ํด ๋๋ฐ์ด์ค๋ฅผ ์ฐพ์ ์ค ๊ฒ์ด๋ค.
public let CBCentralManagerOptionRestoreIdentifierKey: String
optional public func centralManager(_ central: CBCentralManager,
willRestoreState dict: [String: Any])
CGCentralManager๋ฅผ ์ด๊ธฐํ ํ ๋ restoreIdentifier ๋ฅผ ์ ๋ฌํ๋ค. ์ก์ธ์๋ฆฌ์ ์ฐ๊ฒฐํ๋ ๋ฑ์ ์ก์ ์ด ๋๋๋ฉด, ์ฑ์ด ์คํ ๋๊ณ ์ค๋ ์ง๋ฌ๋๋ผ๋, ์ฐ๋ฆฌ๋ ์ฑ์ ์ฌ์คํ ํ๊ณ ์ฝ๋ฐฑ์ ๋ณด๋ด ์ค๋ค.
CentralManager๊ฐ state๋ฅผ ๋ณต์ ํ ๊ฒ์ด๋ค.
- Peripheral operations can continue when your app is not running
- Publish local services
- Advertise service UUID
Peripheral์ ์ฑ์ด ๋์ด์ ์๋ํ๊ณ ์์ง ์๋๋ผ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊ณ์ ํ ์ ์๊ณ ์ฑ์ด ํ์ ํ ๋ ์ฌ์คํ ํ ๊ฒ์ด๋ค.
public let CBPeripheralManagerOptionRestoreIdentifierKey: String
optional public func peripheralManager(_ peripheral: CGPeripheralManager,
willRestoreState dict: [String: Any])
์ฌ๊ธฐ์๋ ์์คํ
์ ์ ๋ํฌํ restoreIdentifier๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์์์ ๋ ํ์ฌ state๋ฅผ CBPeripheralManagerRestoredServiceKey:
๋ฅผ ํตํด ์๋ ค์ฃผ๊ณ , ์ด๋ค ์๋น์ค๊ฐ ์ฌ์ ํ publishํ๋์ง ์๋ ค์ค๋ค.
Works across device reboot or Bluetooth system events
- Try to ask for as few system resources as possible
- Background activities will be stopped if
- User force quits the app
- User disables Bluetooth
๋๋ฐ์ด์ค๊ฐ ์ฌ์๋ ๋์ด๋ ์ฐ๊ฒฐ์ ์ ์ง ์์ผ ์ค ๊ฒ์ด๋ค! scan ํ ์ ์๋ ์๋น์ค์ ๊ฐ์๋ฅผ ์ ํ ํ๋ค.
- Write Without Response would be dropped due to memory pressure
- New property will tell your app if more data can be sent
open class CBPeripheral: CGPeer {
open var canSendWriteWithoutResponse: Bool { get }
}
public protocol CBPeripheralDelegate: NSObjectProtocol {
optional public fund preipheralIsReady(toSendWriteWithoutReponse peripheral: CGPeripheral)
}
canSendWriteWithoutResponse
: write ํ๊ธฐ ์ ์ ํธ์ถ
yes ๋ฅผ ๋ฆฌํดํ๋ฉด, ๋์ data๋ฅผ remote peripheral๋ก ์ ์กํ ๊ธฐํ๊ฐ ์ค๊ธฐ ์ ๊น์ง๋ ์ํํธ์จ์ด๋ก drop๋์ง ์๋๋ค.
no ๋ฅผ ๋ฆฌํดํ๋ฉด, ready ์ํ์ผ ๋ delegate๋ก preipheralIsReady ์ฝ๋ฐฑ์ ๋ฐ๋๋ค
- Foreground and background apps
- Central and Peripheral
- 15 ms minimum connection interval
- State Preservation and Restoration on iOS
- Foreground app only
- Central role only
- Limited to 2 simultaneous connections
- 30 ms minimum connection interva
- Peripheral disconnected when app is moved to the backgroudn
- Access dictated by system runtime policies
- Central role only
- Limited to 2 simultaneous connections
- 30 ms minimum connection interval
- Peripherals disconnected when app is suspended
- Supported on Apple Watch Series 2
- Bluetooth SIG Protocol underlying all communication
- Logical Link Control and Adaptation Protocol
- Stream between two devices
- Introduced for LE in Bluetooth Core Spec 4.1
L2CAP์ ๊ฐ์ฅ ๋ฐ๋จ์ ๋ ๊ธฐ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ์ stream ์ด๊ณ , ์ด ๊ธฐ๊ธฐ๋ค ๊ฐ ์ํต์ ์ํด ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ GATT Database ์ ๋ฌ๋ฆฌ, L2CAP Channels ์ frame ์ ํ์ด๋ ํจํท ์ฌ์ด์ฆ ์ ํ ์์ด side channel์ ์ด์ด์ ์ง์ ์ฝ๊ณ ์ฐ๊ธฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
Open an L2CAP Channel on an existing CBPeripheral connection
open class CBPeripheral: CBPeer {
open func openL2CAPChannel(_ PSM: CBL2CAPPSM)
}
public protocol CBPeriphralDelegate: NSObjectProtocol {
optional public func periphral(_ peripheral: CGPeripheral,
didOpen channel: CGL2CAPChannel?, error: Error?)
์ด๋ฏธ peripheral์ ์ฐ๊ฒฐ ๋์๋ค๋ฉด, openL2CAPChannel
๋ง ํธ์ถ ํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฝ๋ฐฑ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ openL2CAPChannel
์ด channel์ ์ ๋ฌํ๋ค.
TCP ํฌํธ์ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ํฅ๋ฏธ๋ก์ด๊ฑด Bluใทใทtooth SIG์ ์ํด publish๋ profile ๋ค ๋ช๋ช์ PSM์ด ํ๋์ฝ๋ฉ ๋์ด ์๋ค.
๊ทธ๋์ Object Transfer Protocol ๊ฐ์ ๊ฒ์ ์๋ ํ๋ค๋ฉด, ๋๋ฐ์ด์ค์ ์ฐ๊ฒฐ ํ๊ธฐ ์ ์ PSM์ ์ด๋ฏธ ์๊ณ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง PSM์ ํต์ ํ๋ device์ ๋ํด uniqueํ ๊ฐ์ด๊ณ , ๊ทธ๊ฒ์ ๋ก์ปฌ์ ํ ๋น๋์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ณ ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ์ฑ์ ์ํด์ ์ฌ์ฌ์ฉ ๋ ์ ์๋ค.
CBUUIDL2CAPCharacteristicString
: CGSerivce์ ๊ด๋ จ๋ ์ด๋ค PSM ์ ์ด๊ฒ์ธ์ง์ ๋ํ ๊ตฌ๋ถ์ ํด์ค
publishL2CAPChannel
: ์์คํ
์ ์ํด ์ด๋ค PSM๊ฐ ํ ๋น๋์ด ์๋์ง ์ฝ๋ฐฑ
Peripheral
Peripheral ์ญํ ์ด๋ผ๋ฉด, ์์คํ ์๊ฒ L2CAP Channel์ publish ํ๋๋ก ์์ฒญ ํ ๊ฒ์ด๋ค.
์ฑ๊ณตํ๋ฉด, peripheralManager didPublishL2CAPChannel
์ฝ๋ฐฑ์ ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ก์ปฌ์์ ์ด๋ค PSM ์ด ๋์ ์๋น์ค์ ํ ๋น ๋์ด ์๋์ง ์๋ ค์ค๋ค.
์ด ๋, PSM ๋ค์ด์จ ์ฐ๊ฒฐ์ ๋ํด ์๊ฒ ํ๊ธฐ ์ํ ๊ธฐํ์ด๋ค. ๋์ ์๋น์ค์ ๊ด๋ จํด์ ์ด๋ค ์ฑ๋์ ์ด์ด์ผ ํ ์ง ๋ฐ๊ฒฌํ๋๋ก
Central
Central ์, PSM ์ ์ฝ์ ์ ์๊ณ , ๊ทธ๊ฒ์ด ์ฑ๋์ ์ด๊ธฐ ์ํ ๋ชจ๋ ์ ๋ณด์ด๋ค.
didOpenL2CAPChannel
์ฝ๋ฐฑ์ ๋ฐ์ ๊ฒ์ด๋ค
@available(macOS 10.13, iOS 11.0, *)
open class CBL2CAPChannel: NSObject {
open var peer: CBPeer! { get }
open var inputStream: InputStream! { get }
open var outputStream: OutputStream! { get }
open var psm: CBL2CAPPSM { get }
}
CBL2CAPChannel ์ ๋๊ฐ ๋๊ตฌ์ ํต์ ํ๊ณ ์๋์ง, ์ด๋ป๊ฒ ํต์ ํ ์ ์๋์ง ์๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์บก์ํ ํ๋ค
Channels may be closed due to
- Link loss
- Central close
- Peripheral unpublished
- Peripheral object is released
- Use GATT where it makes sense
- Lowest overhead
- Best performance
- Best for large data transfers
- Great for stream protocols
์ด๋ฏธ GATT ์ ์ฌ์ฉํ๊ณ ์๊ณ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด GATT ๊ณ ์ ๋ง๋๋ค๋ฉด ๊ณ์ ์ฌ์ฉํด๋ผ. GATT์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด ๊ต์ฅํ ๊ฐํธํ๊ณ , ๋น ๋ฅธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ค.
L2GAP Channel์ ์ก์ธ์๋ฆฌ ๊ฐ ์ํต ์, ์ต์์ ์ค๋ฒํค๋๋ก ์ต๊ณ ์ ์ฑ๋ฅ์ ๊ฐ๊ฒ ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ํฐ ๋ฐ์ดํฐ๋ค์ ์ ์กํ ๋ ๊ต์ฅํ ๋น ๋ฅด๋ค.
๋๊ฐ์ ๋๋ฐ์ด์ค๊ฐ ์ฐ๊ฒฐ๋๊ธฐ ์ ์, ๊ฐ๊ฐ ๊ทธ๋ค๋ง์ ํ์๋ผ์ธ์์ ์๋ํ๊ณ ์๋ค. Peripheral ์ advertise ํ๊ณ , ๋์ Central ์ฃผ๋ณ์ ๋๋ฐ์ด์ค๋ฅผ ์ฐพ์ ๊ฒ์ด๋ค.
ํ์ง๋ง ๊ฐ๊ฐ ์์ window๋ฅผ ์ฌ์ฉํด์, ๋๊ฐ์ ์ด๋ฒคํธ๊ฐ ๊ฐ์ ๋ผ์ธ์ ์ค๊ธฐ ์ ๊น์ง๋ ์ก์ธ์๋ฆฌ ์ฐพ์ ์ ์๋ค.
- Use the shortest advertising interval possible
- Optimize for when users are trying to use your accessory
- See the Bluetooth Accessory Design Guidelines for power-efficient advertising intervals
short advertising interval ์ ์ก์ธ์๋ฆฌ์ ์ถ๊ฐ์ ์ธ ๋ฒ ํฐ๋ฆฌ๋ฅผ ์๋ชจํ๊ธฐ ๋๋ฌธ์, ํญ์ ํ ์ ์๋ค.
์ ์ ๊ฐ ์ก์ธ์๋ฆฌ๋ฅผ ํฐ์นํ๊ฑฐ๋, ๋ค๊ฑฐ๋, accelerometer, ๋ฒํผ ๋ฑ์ aggressive advertising์ ์ํ ์งํ๋ก ์ฌ์ฉํ๋ฉด ๋ฒ ํฐ๋ฆฌ๋ฅผ ์ ์ฝ ํ ์ ์๋ค.
- No need to scan for a peripheral for reconnect
- Retrieve the peripheral and directly connect
let identifier = UUID()
let peripheral = central.retrievePeripheral(withIdentifiers: [identifier])
central.connect(peripheral[0])
Service Change Characteristic ๋ ๋๋ฐ์ด์ค์ service์ characteristic ๊ฐ ์ธ์ ๋ณํ๊ณ GATT Database์ ๋ง์ง๋ง ๋ฒ์ ์ ์ธ์ ์ฌ์ฌ์ฉ ํ๋๊ฒ ์์ ํ์ง ์๋๋ก ํด์ฃผ๋ Bluetooth Spec ์ ๋ถ๋ถ์ด๋ค.
- Use the newest chipset / Bluetooth standard avaliable
- 4.2 and 5.0 are backward compatible
- Follow these best practices
1MB = 3,240 seconds
2.5 kbps
Bluethooth Specification ๋ LE maximum application datalink๋ฅผ 27 ๋ฐ์ดํธ๋ก ์ ์ ํ์ง๋ง, ๋ฐ์ดํฐ๊ฐ GATT, ATT, L2CAP ์ ํต๊ณผํ์ฌ ์ฑ์ ๊ฐ๋ก์ง๋ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ 7์ ์๋๋ค. ํจํท์ 25% ์ ๋๋ฅผ ์๋ ๊ฒ์ด๊ณ ๋ง์ง๋ง์ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๊ฒจ์ฐ 20 ๋ฐ์ดํธ ์ผ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ๊ฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ง๋๋ฉด, ํ๋์จ์ด ํจํท์ ์ ์กํ๋๋ฐ ๋ ๋ง์ ์๊ฐ์ด ํ์ํ security ์ CRC ์ ๋ํ ๋ ์ด์ด๋ฅผ ์ฐ๊ฒฐ์ ์ถ๊ฐํ๋ค.
์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด์, ์ํํธ์จ์ด์ ํ๋์จ์ด ๋ชจ๋์ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ์ผ ํ๋ค.
์๋ฃ๋ฅผ ์ํด write, wait 2๊ฐ์ interval ์ ๊ฐ๋๋ค. write ๊ฐ ๋๋ฌด ๋ถ์กฑ.
์ฌ์ฉ๊ฐ๋ฅํ bandwidth๋ฅผ ์ถฉ๋ถํ ํ์ฉํ๊ณ ์์ง ์๋ค.
interval ๋ง๋ค ์ ์กํ๊ธฐ ์ํ ๊ธฐํ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋ชจ๋ connection event์ ๋ํด ๊ฐ๋ฅํ ๋ง์ด write๋ฅผ ๊ฐ์ธ๊ณ ์ถ์ด ํ๋ค.
- Reliable with Core Bluetooth flow control
- Use all available connection events to trasmit
- Takes advantage of larger Connection Event length
๋ชจ๋ interval ์ connection event ๋ฅผ ๋ชจ๋ ๊ฐ์ธ๋ฉด, ์ฒ๋ฆฌ๋์ด 2.5์์ 37 kbps ๋ก ํฅ์ ๋ ๊ฒ์ด๋ค.
MTU ์ ์ฒซ๋ฒ์งธ fragment์ ์ค๋ฒํค๋๋ง ์๊ณ ๋๋จธ์ง fragment๋ 27 bytes ์ผ ๊ฒ์ด๋ค, ๊ทธ๋ฌ๋ฉด ์ฒ๋ฆฌ๋์ด 48 kbps ๊น์ง ํฅ์ ๋ ๊ฒ์ด๋ค.
- Apple devices determine the optimal MTU
- Accessories should support a large MTU
- Use large attributes aligned to MTU
- New Feature in Bluetooth 4.2
- Much larger packets (251 vs 27 bytes)
- Transparent to the application
- 4x throughput with the same radio time
- Available on iPhone 7 and Apple Watch Series 2
์ด์ ์ GATT ๊ณผ ATT ์์ ์๋ ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ GATT ์ ์ต๋ 512 ์ฌ์ด์ฆ ์์ฑ ๊ฐ์ ์ ํ๊ณผ ์ ์ฝ์ ์ ๊ฑฐํด์ค๋ค. ๊ทธ๋์ ๋ ํฐ ๊ฐ๋ค์ write ํ ์ ์๊ณ ๋ ๋ง์ MTU ๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฒ๋ฆฌ๋์ ๊ฑฐ์ 200kbp ๊น์ง ์์นํ ๊ฒ์ด๋ค.
์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ ๋น ๋ฅธ connection interval๋ฅผ ์์ฒญ ํ๋ ๊ฒ์ด๋ค.
Core Bluetooth ์์ iOS ์ ๋ํด connection interval minimum ์ 15 ms ๋ก ์ค์๋ค.
์ด๋ฅผ ํตํด ์ฒ๋ฆฌ๋์ด 394 kpbs ๋ก ๊ฑฐ์ ๋๋ฐฐ๊ฐ ๋์๋ฐ.
Key Takeaways
- Check out State Restoration
- Expand your app to tvOS and watchOS
- Use L2CAP for stream protocols or large data tranfers
- Use the newest Bluetooth chipset available
- Follow the Bluetooth Accessory Design Guidelines