practical core bluetooth in iot & wearable projects @ altconf 2016

Post on 05-Apr-2017

1.222 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Practical Core Bluetooth

in IoT & Wearable projects

Shuichi Tsutsumi @shu223 AltConf 2016 - San Francisco

iOS-10-Sampler

https://github.com/shu223

Overview

•Basics of Core Bluetooth

•Practical Core Bluetooth

Based on my experience!

Bluetooth Low Energy?

Bluetooth Low Energy (BLE)

Bluetooth Low Energy (BLE)• Wireless technology

Bluetooth Low Energy (BLE)• Wireless technology

- no network infrastructure required

Bluetooth Low Energy (BLE)• Wireless technology

- no network infrastructure required

Wi-Fi

Bluetooth Low Energy (BLE)• Wireless technology

- no network infrastructure required

BLE

• Low energy

• Low energy

• NOT compatible with Classic BT

• Low energy

• NOT compatible with Classic BT

• Uses 2.4 GHz radio frequencies

• Low energy

• NOT compatible with Classic BT

• Uses 2.4 GHz radio frequencies

• Marketed by the Bluetooth SIG

• Low energy

• NOT compatible with Classic BT

• Uses 2.4 GHz radio frequencies

• Marketed by the Bluetooth SIG

• etc…

• Low energy

• NOT compatible with Classic BT

• Uses 2.4 GHz radio frequencies

• Marketed by the Bluetooth SIG

• etc…

The most important thing for

iOS developers

The API ‘Core Bluetooth’ is open for developers

The API ‘Core Bluetooth’ is open for developers

• API for Classic BT is NOT open.

- Requires MFi certification.

BLE is almost the ONLY way to enable iOS apps to communicate with external hardware without infrastructure or MFi.

Basics of Core Bluetooth

Moff Band Moff App

Moff Band Moff App

BLE Connection

Moff Band Moff App

BLE Connection

Sensors - Gyroscope - Accelerometer

Moff Band Moff App

Sensor Data

BLE Connection

Sensors - Gyroscope - Accelerometer

Moff Band Moff App

Sensor Data

BLE Connection

Sensors - Gyroscope - Accelerometer

Analyze sensor data

Moff Band Moff App

Sensor Data

BLE Connection

Sensors - Gyroscope - Accelerometer

Analyze sensor data

Recognize - Gesture - Posture

Moff Band Moff App

Sensor Data

BLE Connection

Sensors - Gyroscope - Accelerometer

Analyze sensor data

Recognize - Gesture - Posture

Play sounds

Sensor Data

BLE Connection

How is sensor data sent with Core Bluetooth?

Step 1. Scan

Step 1. Scan: Search for nearby BLE devices

Step 1. Scan: Search for nearby BLE devices

Step 1. Scan

Advertise

: Search for nearby BLE devices

Scan

Step 1. Scan

Advertise

: Search for nearby BLE devices

Scan

Step 1. Scan

Advertise

: Search for nearby BLE devices

centralManager.scanForPeripheralsWithServices(nil, options: nil)

Scan

Step 1. Scan

Advertise

Discover

: Search for nearby BLE devices

Scan

Step 1. Scan

Advertise

Discover

: Search for nearby BLE devices

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(“Discovered a BLE device!”) }

Scan

Step 1. Scan

Advertise

Discover

: Search for nearby BLE devices

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(“Discovered a BLE device!”) }

Central

Scan

Step 1. Scan

Advertise

Discover

: Search for nearby BLE devices

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(“Discovered a BLE device!”) }

Peripheral Central

Step 2. Connect

Connect

Step 2. Connect

Connect

Step 2. Connect

centralManager.connectPeripheral(peripheral, options: nil)

Connect

Step 2. Connect

centralManager.connectPeripheral(peripheral, options: nil)

func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { print(“Connected!”) }

Step 3. Subscribe

Step 3. Subscribe : Ready to receive data

Step 3. Subscribe : Ready to receive data

GATT = Generic Attribute Profile

Moff Service

xx Service

Step 3. Subscribe : Ready to receive data

GATT = Generic Attribute Profile

Moff Service

xx Service

Button Characteristic

xx Characteristic

Sensor Characteristic

Step 3. Subscribe : Ready to receive data

GATT = Generic Attribute Profile

Moff Service

xx Service

Button Characteristic

xx Characteristic

Sensor Characteristic

Subscribe (Request to be notified)

Step 3. Subscribe : Ready to receive data

GATT = Generic Attribute Profile

Moff Service

xx Service

Button Characteristic

xx Characteristic

Sensor Characteristic

Subscribe (Request to be notified)

Step 3. Subscribe : Ready to receive data

GATT = Generic Attribute Profile

peripheral.setNotifyValue(true, forCharacteristic: c)

Step 4. Notify

Moff Service

Sensor Characteristic

xxxx Characteristic

Step 4. Notify

Moff Service

Sensor Characteristic

xxxx Characteristic

Update the value

Step 4. Notify

Notify subscribers

Moff Service

Sensor Characteristic

xxxx Characteristic

Update the value

Step 4. Notify

Notify subscribers

Moff Service

Sensor Characteristic

xxxx Characteristic

Update the value

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { print(“Received sensor data!”) }

Step 4. Notify

Notify subscribers

Moff Service

Sensor Characteristic

xxxx Characteristic

Update the value

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { print(“Received sensor data!”) }

Hardware Side?

Hardware Side?I’m sorry, I don’t know…

BLE

BLE

iOS Engineer

BLE

iOS Engineer

BLE

Firmware Engineer iOS Engineer

BLE

Firmware Engineer iOS Engineer

Hardware Projects I’ve worked on

as an iOS engineer

Wheelchair ‘WHILL’

Wheelchair ‘WHILL’

Wearable Walkie-Talkie ‘BONX’

Wearable Walkie-Talkie ‘BONX’

Wearable Walkie-Talkie ‘BONX’

Group conversation system with VoIP

Group conversation system with VoIP

- Detects the human voice

Group conversation system with VoIP

- Detects the human voice

- Cuts out all background noise

Group conversation system with VoIP

- Detects the human voice

- Cuts out all background noise

→ Can be used even in areas with poor coverage!

BLE for BONX

BLE for BONX

BLE for BONX

BLE for BONX

IoT for Cars ‘SmartDrive’

Music for the DeafDaito Manabe/Motoi Ishibashi/Teruoka Masaki/Shuichi Tsutsumi x SOUL FAMILY

Music for the DeafDaito Manabe/Motoi Ishibashi/Teruoka Masaki/Shuichi Tsutsumi x SOUL FAMILY

iPhone

Music for the DeafDaito Manabe/Motoi Ishibashi/Teruoka Masaki/Shuichi Tsutsumi x SOUL FAMILY

Electronic Stimulation DeviceiPhone

Music for the DeafDaito Manabe/Motoi Ishibashi/Teruoka Masaki/Shuichi Tsutsumi x SOUL FAMILY

Commands

Electronic Stimulation DeviceiPhone

Music for the DeafDaito Manabe/Motoi Ishibashi/Teruoka Masaki/Shuichi Tsutsumi x SOUL FAMILY

Practical Core Bluetooth

Defining GATT

GATT to send sensor data

Foo Service

Sensor Data Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Bar Service

xx Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: acc x, acc y, acc z, gyro x, gyro y, gyro z (2bytes for each)

xx Characteristic

GATT to send sensor data

Foo Service

Sensor Data Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Bar Service

xx Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: acc x, acc y, acc z, gyro x, gyro y, gyro z (2bytes for each)

xx Characteristic

GATT to send sensor data

Foo Service

Sensor Data Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Bar Service

xx Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: acc x, acc y, acc z, gyro x, gyro y, gyro z (2bytes for each)

xx Characteristic

GATT to send sensor data

Foo Service

Sensor Data Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Bar Service

xx Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: acc x, acc y, acc z, gyro x, gyro y, gyro z (2bytes for each)

xx Characteristic

GATT to send sensor data

Foo Service

Sensor Data Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Bar Service

xx Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: acc x, acc y, acc z, gyro x, gyro y, gyro z (2bytes for each)

xx Characteristic

GATT to send sensor data

Foo Service

Sensor Data Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Bar Service

xx Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: acc x, acc y, acc z, gyro x, gyro y, gyro z (2bytes for each)

xx Characteristic

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

Button interactions

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

Button interactions

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

Button interactions

GATT to send button interactions

Foo Service

Button Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Notify

Value: 0x01 or 0x00

Button interactions

0x01: Pushed 0x00: Released

GATT for remote control

Foo Service

Remote Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: Horizontal (-100 ~ 100), Vertical (-100 ~ 100)

GATT for remote control

Foo Service

Remote Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: Horizontal (-100 ~ 100), Vertical (-100 ~ 100)

GATT for remote control

Foo Service

Remote Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: Horizontal (-100 ~ 100), Vertical (-100 ~ 100)

values

GATT for remote control

Foo Service

Remote Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: Horizontal (-100 ~ 100), Vertical (-100 ~ 100)

values

GATT for remote control

Foo Service

Remote Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: Horizontal (-100 ~ 100), Vertical (-100 ~ 100)

values

GATT for generic commands

GATT for generic commands

Electronic Stimulation Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: 1 byte

GATT for generic commands

Electronic Stimulation Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: 1 byte

GATT for generic commands

Electronic Stimulation Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: 1 byte

4 Commands: - Change the pulse frequency - Change the electric current - Right channels on/off - Left channels on/off

GATT for generic commands

Electronic Stimulation Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: 1 byte

4 Commands: - Change the pulse frequency - Change the electric current - Right channels on/off - Left channels on/off

GATT for generic commands

Electronic Stimulation Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: 1 byte

High-order 2 bits - 00: Change the pulse frequency - 01: Change the electric current - 10: Left channels on/off - 11: Right channels on/off

GATT for generic commands

Electronic Stimulation Control Characteristic

UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Properties: Write

Value: 1 byte

High-order 2 bits - 00: Change the pulse frequency - 01: Change the electric current - 10: Left channels on/off - 11: Right channels on/off

How to define GATT

How to define GATT1. Create UUID for the service & characteristic

How to define GATT1. Create UUID for the service & characteristic

$ uuidgen CEEA31BC-BEAC-4A78-B7ED-FC96B6254D4C

How to define GATT1. Create UUID for the service & characteristic

2. Define the properties (Read, Notify, Write, etc.)

$ uuidgen CEEA31BC-BEAC-4A78-B7ED-FC96B6254D4C

How to define GATT1. Create UUID for the service & characteristic

2. Define the properties (Read, Notify, Write, etc.)

Peripheral → Central: Notify Central → Peripheral: Write

$ uuidgen CEEA31BC-BEAC-4A78-B7ED-FC96B6254D4C

How to define GATT1. Create UUID for the service & characteristic

2. Define the properties (Read, Notify, Write, etc.)

Peripheral → Central: Notify Central → Peripheral: Write

3. Define the value format

$ uuidgen CEEA31BC-BEAC-4A78-B7ED-FC96B6254D4C

How to define GATT1. Create UUID for the service & characteristic

2. Define the properties (Read, Notify, Write, etc.)

Peripheral → Central: Notify Central → Peripheral: Write

3. Define the value format

Usually limited to 20 bytes

$ uuidgen CEEA31BC-BEAC-4A78-B7ED-FC96B6254D4C

Reference: GATT profiles by Bluetooth SIG

Defining background behaviors

Background behaviors on iOS• Very limited

- Listening to music

- Getting location data

- Downloading data

Imagine

If BLE didn’t work in the background…

You would have to always keep the app in the foreground, while snowboarding!

You would have to launch the app whenever you go driving!

What functions can be used in the background?

What functions can be used in the background?

• Scanning peripherals

What functions can be used in the background?

• Scanning peripherals

• Connecting with peripherals

What functions can be used in the background?

• Scanning peripherals

• Connecting with peripherals

• Reading characteristics’ value

What functions can be used in the background?

• Scanning peripherals

• Connecting with peripherals

• Reading characteristics’ value

• Writing characteristics’ value

What functions can be used in the background?

• Scanning peripherals

• Connecting with peripherals

• Reading characteristics’ value

• Writing characteristics’ value

• Receiving notifications

What functions can be used in the background?

• Scanning peripherals

• Connecting with peripherals

• Reading characteristics’ value

• Writing characteristics’ value

• Receiving notifications

Almost all functions can be used even in the background!

How to support background mode

Just check this box!

Limitations

Limitations• Longer intervals for scanning

Limitations• Longer intervals for scanning

• Must explicitly specify one or more services to scan

Limitations• Longer intervals for scanning

• Must explicitly specify one or more services to scan

• CBCentralManagerOptionShowPowerAlertKey option is ignored

Limitations• Longer intervals for scanning

• Must explicitly specify one or more services to scan

• CBCentralManagerOptionShowPowerAlertKey option is ignored

Resources

- Core Bluetooth Programming Guide

- Core Bluetooth Framework Reference (also in headers)

If the app in the background is killed by the system…

State Preservation and Restoration

State Preservation and Restoration

The system takes over the BLE tasks even after the app is killed.

State Preservation and Restoration

The system takes over the BLE tasks even after the app is killed.

- Preserves the state of the app’s central managers and continues the BLE tasks on their behalf.

State Preservation and Restoration

The system takes over the BLE tasks even after the app is killed.

- Preserves the state of the app’s central managers and continues the BLE tasks on their behalf.

- Relaunches the app into the background and calls the corresponding delegate method.

State Preservation and Restoration

The system takes over the BLE tasks even after the app is killed.

- Preserves the state of the app’s central managers and continues the BLE tasks on their behalf.

- Relaunches the app into the background and calls the corresponding delegate method.

→ The app can handle BLE events!

• The app is killed by the system

• The app is killed by the system

• The user pushes the button on the peripheral device

• The app is killed by the system

• The user pushes the button on the peripheral device

• The system receives the notification

• The app is killed by the system

• The user pushes the button on the peripheral device

• The system receives the notification

• The app is relaunched in the BG and the delegate method is called.

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { print(“Received the characteristic data!”) }

• The app is killed by the system

• The user pushes the button on the peripheral device

• The system receives the notification

• The app is relaunched in the BG and the delegate method is called.

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { print(“Received the characteristic data!”) }

• The app is killed by the system

• The user pushes the button on the peripheral device

• The system receives the notification

• The app is relaunched in the BG and the delegate method is called.

The app can process the button interaction!

Implementation

Implementation• Add an option when initializing the

CBCentralManager object.

let options = [ CBCentralManagerOptionRestoreIdentifierKey: "somekey" ] centralManager = CBCentralManager( delegate: self, queue: queue, options: options)

Implementation• Implement the delegate method which is called when

the app is restored.

func centralManager(central: CBCentralManager, willRestoreState dict: [String : AnyObject]) { print("Restored") }

Testing the restoration

Testing the restoration• Kill the app as if it was killed by the iOS

kill(getpid(), SIGKILL);

How to test without HW prototypes

Did the HW prototypes exist when develop the apps?

Projects HW prototypes existed?

Moff YES

WHILL NOBONX NOSmartDrive YES

PLEN2 NOMusic for the Deaf NO

Development Kit

Development KitBLE Module

Development KitBLE Module

Display

Development KitBLE Module

Display

USB interface

Development KitBLE Module

Display

USB interface

Battery box

Development Kit

Can start development without creating a circuit ourselves

BLE ModuleDisplay

USB interface

Battery box

Development Kit

Development Kit App

Development Kit AppBLE

Horizontal (-100~100) / Vertical (-100~100)

Development Kit AppBLE

Emulator App

Emulator App

• Develop another iOS app as the alternative to the peripheral device

Emulator App

• Develop another iOS app as the alternative to the peripheral device

• Use CBPeripheralManager

Emulator App

• Develop another iOS app as the alternative to the peripheral device

• Use CBPeripheralManager

• Easier for iOS engineers

=

Multi-Function Control • Single Tap • Double Tap • Long Press • Very Long Press

=

Troubleshooting

Can’t find the peripheral

Scan

?

Can’t connect

Find

Can’t connect

Connect

×

• Connection dropped

• Connection dropped

• Can’t discover services or characteristics

• Connection dropped

• Can’t discover services or characteristics• Fail to write

• Connection dropped

• Can’t discover services or characteristics• Fail to write• Incorrect characteristic values

• Connection dropped

• Can’t discover services or characteristics• Fail to write• Incorrect characteristic values

• Incorrect behaviors in the background

• Connection dropped

• Can’t discover services or characteristics• Fail to write• Incorrect characteristic values

• Incorrect behaviors in the background• etc…

Identify which side the problem is on

Is the problem on the central side or on the peripheral side?

→ Compare with another iOS app like ‘LightBlue’

Can’t find the peripheral

• Scanning, but can’t find the peripheral device

Can’t find the peripheral

• Scanning, but can’t find the peripheral device

Scan

Can’t find the peripheral

• Scanning, but can’t find the peripheral device

Scan

but ‘didDiscover’ method isn’t called

Can’t find the peripheral• Scan with another iOS app

Scan

Can’t find the peripheral• Scan with another iOS app

Scan

Discovered peripherals

Can’t connect, etc.

Connect

Can’t connect, etc.

Connect

Services & Characteristics

Other debugging tools

Bluetooth ExplorermacOS app made by Apple

Low Energy Devices

Low Energy DevicesScan, Connect

Low Energy DevicesScan, Connect

Details of services and characteristics

Low Energy DevicesScan, Connect

Details of services and characteristics

Write, Read, Subscribe

func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(advertisementData) }

func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(advertisementData) }

Filtered by iOS!

func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(advertisementData) }

Filtered by iOS!→ Can’t see all of the advertisement data

func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber!) { print(advertisementData) }

Filtered by iOS!→ Can’t see all of the advertisement data

e.g. Can’t see the ‘Manufacture Data’ field of iBeacon

Not filtered →Can see the ‘Manufacture Data’ field of iBeacon

Packet Logger

macOS app made by Apple

How to get

How to get

Download ‘Hardware IO Tools for Xcode’

How to get

Download ‘Hardware IO Tools for Xcode’

How to get

Download ‘Hardware IO Tools for Xcode’

How to get

Download ‘Hardware IO Tools for Xcode’

App Review

MSRP $13,995

Costing too much

Not enough devices when submitting

Videos for review

Videos for review

• Show how the app works with the peripheral device

Videos for review

• Show how the app works with the peripheral device• Not need to be cool!

• Shoot with iPhone

• Shoot with iPhone • Edit with iMovie

Recap

Recap• What is Bluetooth Low Energy?

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

• Practical Core Bluetooth with specific examples

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

• Practical Core Bluetooth with specific examples

- Defining GATT

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

• Practical Core Bluetooth with specific examples

- Defining GATT

- Defining background behaviors

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

• Practical Core Bluetooth with specific examples

- Defining GATT

- Defining background behaviors

- Testing without HW prototypes

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

• Practical Core Bluetooth with specific examples

- Defining GATT

- Defining background behaviors

- Testing without HW prototypes

- Troubleshooting

Recap• What is Bluetooth Low Energy?

• Basics of Core Bluetooth with an actual product

• Practical Core Bluetooth with specific examples

- Defining GATT

- Defining background behaviors

- Testing without HW prototypes

- Troubleshooting

- App Review

Core Bluetooth in iOS 10

Nothing special

CBManager

func centralManagerDidUpdateState(_ central: CBCentralManager) { print("state: \(central.state)") }

Initializer without arguments

private var centralManager: CBCentralManager! override func viewDidLoad() { super.viewDidLoad() centralManager = CBCentralManager(delegate: self, queue: nil) }

From

private let centralManager = CBCentralManager() override func viewDidLoad() { super.viewDidLoad() centralManager.delegate = self }

private var centralManager: CBCentralManager! override func viewDidLoad() { super.viewDidLoad() centralManager = CBCentralManager(delegate: self, queue: nil) }

From

To

Thank you!Shuichi Tsutsumi - iOS Freelancer

• Twitter: @shu223

• GitHub: shu223

• Blog: https://medium.com/@shu223/

• Email: shuichi0526@gmail.com

top related