core bluetooth on ios
DESCRIPTION
TRANSCRIPT
現實⽣生活中的經驗使⽤用 BLEDavid Chu
Monday, November 18, 13
WWDC 2013 開始 讀書 睡好
core bluetooth timeLINE
現在
Monday, November 18, 13
WWDC 2013 開始 讀書 睡好
core bluetooth timeLINE
現在
Monday, November 18, 13
3.02.01.0 4.0
BT4.0 Not Backwards Compatible
Monday, November 18, 13
Classic
4.0
Streaming @ Max 30 mA
Packets @ Max 15 mA
Monday, November 18, 13
Hardware
Monday, November 18, 13
BLE Specs
Range 50 m
Data 1 Mbps
Power 1 year
Proximity RSSI
Monday, November 18, 13
Power1 year?
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
CR2032
225 mAh / 15mA = 15 hours15 hours = 54,000,000 ms
54M ms / 3 ms = 18M transactions
1 transaction every second = ~7 months
Data Transaction Time 3s
Max Antenna Power 15 mA
225 mAh
Monday, November 18, 13
Data1 Mbps?
Monday, November 18, 13
BluetoothHW
1 Mbps Streaming Video720x486
BluetoothSW
270 kbps Streaming Music120 - 320 kps
Real Life Max 56 kbps ?
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
Range50 m?
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
Actual Range
50 m
30 m
Bluetooth Spec Range
Our Tested Range
Monday, November 18, 13
Still Need Testing
Monday, November 18, 13
ProximityRSSI Accuracy?
Monday, November 18, 13
Standing Still
Monday, November 18, 13
Software
Monday, November 18, 13
Core Bluetooth
State Preservation and RestorationApp States and Multitasking
Monday, November 18, 13
iOS as bluetooth-central
• Scan
• Connect
• Read
• Write
• Subscribe
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
Monday, November 18, 13
// CBCentralManagerDelegate- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
// peripheral.services is empty until you call [peripheral discoverServices:];NSArray *serviceUUIDs = [advertismentData objectForKey: CBAdvertisementDataServiceUUIDsKey];
}
[centralManager scanForPeripheralsWithServices:serviceUUIDs options:options];
peripheralBluetooth Device Address
00:22:D0:00:AC:92
(NSUUID *) peripheral.identifier =68753A44-4D6F-1226-9C60-0050E4C00067
BDA
Core Bluetooth
NSUUID
Your App
Monday, November 18, 13
(NSDictionary *)advertisementData
CBAdvertisementDataLocalNameKey Name of Device
CBAdvertisementDataManufacturerDataKey ID for Manufacturer
CBAdvertisementDataServiceDataKey Dictionary with serviceUUIDs and data
CBAdvertisementDataServiceUUIDsKey Array of serviceUUIDs
CBAdvertisementDataTxPowerLevelKey Power Level of Transmission (optional)
CBAdvertisementDataIsConnectable If Device data is connectable
Monday, November 18, 13
[centralManager connectPeripheral:peripheral options:options];
peripheralBluetooth Device Address
00:22:D0:00:AC:92
(NSUUID *) peripheral.identifier =68753A44-4D6F-1226-9C60-0050E4C00067
BDA
iOS Keychain
NSUUID
Your App
Monday, November 18, 13
-connectPeripheral:options:
// Check Peripherals That Your App Has Connected To Before- (NSArray *)retrievePeripheralsWithIdentifiers:(NSArray *)identifiers
// Scan For New Peripherals- (void)scanForPeripheralsWithServices:(NSArray *)serviceUUIDs options:(NSDictionary *)options
// Callback in CBCentralManagerDelegate- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
// Check Peripherals Already Connected To iPhone// Peripherals may be connected to other apps, but not yours- (NSArray *)retrieveConnectedPeripheralsWithServices:(NSArray *)serviceUUIDs
Monday, November 18, 13
Foreground
Background
CBCentralManager CBPeripheralManager
Scan for all peripherals
Can have multiple peripheral discoveries
Scan frequency normal
Service UUIDs are advertised
Device Name advertised
Advertising frequency highest
Can only scan for service UUID
Peripheral discovered only once
Scan frequency 55x less
ServiceUUIDs are hidden
Device Name is hidden
Advertising frequency decreased
Monday, November 18, 13
Reconnecting Peripheral
TerminatedNot in Memory
SuspendedInactive - In Memory
BackgroundActive - Not Visible
ForegroundActive - Visible
State Preservation and Restore
// CBCentralMangerDelegateProtocol- centralManager:central didDisconnectPeripheral:peripheral error:error{
if (error) {// User did not cancel connection. Reconnect.// Connection Requests DO NOT TIME OUT[central connectPeripheral:peripheral options:nil];
}}
// CBCentralMangerDelegateProtocol- centralManager:central didConnectPeripheral:peripheral{
// App will be brought back to background state}
Monday, November 18, 13
Scanning For Peripherals
TerminatedNot in Memory
SuspendedInactive - In Memory
BackgroundActive - Not Visible
ForegroundActive - Visible
Scanning is not possible
iOS cannot guarantee that you will not be suspended or that you will be brought back to background once suspended.
// CBCentralMangerDelegateProtocol- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
// Device can connect to BLE Peripheral and run task// In Background, you have 10s to complete task.// Background scanning also runs 55X slower or more.
}
Monday, November 18, 13
YourApp
If the user removes your app in the multi-tasking window, then all your background operations stop.
Monday, November 18, 13
Resources
Monday, November 18, 13
LightBlue
Monday, November 18, 13
https://github.com/ddaddy/BackgroundKill
Monday, November 18, 13
https://lists.apple.com/mailman/listinfo/bluetooth-dev
Monday, November 18, 13
Monday, November 18, 13