Core Bluetooth on iOS

Preview:

DESCRIPTION

 

Citation preview

現實⽣生活中的經驗使⽤用 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

Recommended