Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Shuichi Tsutsumi: Practical Core Bluetooth in IoT & Wearable projects

1fa9cb8c7997c8c4d3d251fb5e41f749?s=47 Realm
June 13, 2016

Shuichi Tsutsumi: Practical Core Bluetooth in IoT & Wearable projects

Presented at AltConf 2016

1fa9cb8c7997c8c4d3d251fb5e41f749?s=128

Realm

June 13, 2016
Tweet

Transcript

  1. Practical Core Bluetooth in IoT & Wearable projects Shuichi Tsutsumi

    @shu223 iOS Freelancer UIKonf 2016 - Berlin
  2. Overview • Basics of Core Bluetooth • Practical Core Bluetooth

  3. Bluetooth Low Energy?

  4. Bluetooth Low Energy (BLE) • Wireless technology - no network

    infrastructure required
  5. Bluetooth Low Energy (BLE) • Wireless technology - no network

    infrastructure required Wi-Fi
  6. Bluetooth Low Energy (BLE) • Wireless technology - no network

    infrastructure required BLE
  7. • Low energy

  8. • Low energy • NOT compatible with Classic BT

  9. • Low energy • NOT compatible with Classic BT •

    Uses 2.4 GHz radio frequencies
  10. • Low energy • NOT compatible with Classic BT •

    Uses 2.4 GHz radio frequencies • Marketed by the Bluetooth SIG
  11. • Low energy • NOT compatible with Classic BT •

    Uses 2.4 GHz radio frequencies • Marketed by the Bluetooth SIG • etc…
  12. • Low energy • NOT compatible with Classic BT •

    Uses 2.4 GHz radio frequencies • Marketed by the Bluetooth SIG • etc…
  13. The most important thing for iOS developers

  14. The API ‘Core Bluetooth’ is open for developers

  15. The API ‘Core Bluetooth’ is open for developers • API

    for Classic BT is NOT open. - Requires MFi certification.
  16. BLE is almost the ONLY way to enable iOS apps

    to communicate with external hardware without infrastructure or MFi.
  17. Basics of Core Bluetooth

  18. None
  19. Moff Band Moff App

  20. Moff Band Moff App BLE Connection

  21. Moff Band Moff App BLE Connection Sensors - Gyroscope -

    Accelerometer
  22. Moff Band Moff App Sensor Data BLE Connection Sensors -

    Gyroscope - Accelerometer
  23. Moff Band Moff App Sensor Data BLE Connection Sensors -

    Gyroscope - Accelerometer Analyze sensor data
  24. Moff Band Moff App Sensor Data BLE Connection Sensors -

    Gyroscope - Accelerometer Analyze sensor data Recognize - Gesture - Posture
  25. Moff Band Moff App Sensor Data BLE Connection Sensors -

    Gyroscope - Accelerometer Analyze sensor data Recognize - Gesture - Posture Play sounds
  26. Sensor Data How sensor data is sent with Core Bluetooth

    BLE Connection
  27. Step 1. Scan

  28. Step 1. Scan: Search for nearby BLE devices

  29. Step 1. Scan: Search for nearby BLE devices

  30. Step 1. Scan Advertise : Search for nearby BLE devices

  31. Scan Step 1. Scan Advertise : Search for nearby BLE

    devices
  32. Scan Step 1. Scan Advertise : Search for nearby BLE

    devices centralManager.scanForPeripheralsWithServices(nil, options: nil)
  33. Scan Step 1. Scan Advertise Discover : Search for nearby

    BLE devices
  34. 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!”) }
  35. 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
  36. 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
  37. Step 2. Connect

  38. Connect Step 2. Connect

  39. Connect Step 2. Connect centralManager.connectPeripheral(peripheral, options: nil)

  40. Connect Step 2. Connect centralManager.connectPeripheral(peripheral, options: nil) func centralManager(central: CBCentralManager,

    didConnectPeripheral peripheral: CBPeripheral) { print(“Connected!”) }
  41. Step 3. Subscribe

  42. Step 3. Subscribe: Ready to receive data

  43. Step 3. Subscribe: Ready to receive data GATT = Generic

    Attribute Profile
  44. Moff Service xx Service Step 3. Subscribe: Ready to receive

    data GATT = Generic Attribute Profile
  45. Moff Service xx Service Button Characteristic xx Characteristic Sensor Characteristic

    Step 3. Subscribe: Ready to receive data GATT = Generic Attribute Profile
  46. 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
  47. 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)
  48. Step 4. Notify Moff Service Sensor Characteristic xxxx Characteristic

  49. Step 4. Notify Moff Service Sensor Characteristic xxxx Characteristic Update

    the value
  50. Step 4. Notify Notify subscribers Moff Service Sensor Characteristic xxxx

    Characteristic Update the value
  51. 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!”) }
  52. 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!”) }
  53. Hardware Side?

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

  55. BLE

  56. BLE iOS Engineer

  57. BLE iOS Engineer

  58. BLE Firmware Engineer iOS Engineer

  59. BLE Firmware Engineer iOS Engineer

  60. HW Projects I’ve worked on as an iOS engineer

  61. Wheelchair ‘WHILL’

  62. Wheelchair ‘WHILL’

  63. Wearable Walkie-Talkie ‘BONX’

  64. Wearable Walkie-Talkie ‘BONX’

  65. Wearable Walkie-Talkie ‘BONX’

  66. Group conversation system with VoIP - Detects the human voice

    - Cuts out all background noise
  67. → Can be used even in areas with poor coverage!

    Group conversation system with VoIP - Detects the human voice - Cuts out all background noise
  68. BLE for BONX

  69. BLE for BONX

  70. BLE for BONX

  71. IoT for Cars ‘SmartDrive’

  72. Printable Open-Source Humanoid “PLEN2”

  73. Music for the Deaf %BJUP.BOBCF.PUPJ*TIJCBTIJ5FSVPLB.BTBLJ4IVJDIJ5TVUTVNJY406-'".*-:

  74. Music for the Deaf %BJUP.BOBCF.PUPJ*TIJCBTIJ5FSVPLB.BTBLJ4IVJDIJ5TVUTVNJY406-'".*-: iPhone

  75. Music for the Deaf %BJUP.BOBCF.PUPJ*TIJCBTIJ5FSVPLB.BTBLJ4IVJDIJ5TVUTVNJY406-'".*-: Electronic Stimulation Device iPhone

  76. Music for the Deaf %BJUP.BOBCF.PUPJ*TIJCBTIJ5FSVPLB.BTBLJ4IVJDIJ5TVUTVNJY406-'".*-: Commands Electronic Stimulation Device iPhone

  77. Music for the Deaf %BJUP.BOBCF.PUPJ*TIJCBTIJ5FSVPLB.BTBLJ4IVJDIJ5TVUTVNJY406-'".*-:

  78. Practical Core Bluetooth

  79. Defining GATT

  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. 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
  90. 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
  91. 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
  92. 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 Y1VTIFE Y3FMFBTFE
  93. 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)
  94. 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)
  95. 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
  96. 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
  97. 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
  98. How to define GATT 1. 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
  99. Reference: GATT profiles by Bluetooth SIG

  100. Defining background behaviors

  101. Background behaviors on iOS • Very limited - Listening to

    music - Getting location data - Downloading data
  102. Imagine

  103. If BLE didn’t work in the background…

  104. None
  105. You would have to always keep the app in the

    foreground, while snowboarding!
  106. None
  107. You would have to launch the app whenever you go

    driving!
  108. What functions can be used in the background?

  109. What functions can be used in the background? • Scanning

    peripherals
  110. What functions can be used in the background? • Scanning

    peripherals • Connecting with peripherals
  111. What functions can be used in the background? • Scanning

    peripherals • Connecting with peripherals • Reading characteristics’ value
  112. What functions can be used in the background? • Scanning

    peripherals • Connecting with peripherals • Reading characteristics’ value • Writing characteristics’ value
  113. What functions can be used in the background? • Scanning

    peripherals • Connecting with peripherals • Reading characteristics’ value • Writing characteristics’ value • Receiving notifications
  114. 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!
  115. How to support background mode

  116. None
  117. Just check this box!

  118. Limitations

  119. Limitations • Longer intervals for scanning

  120. Limitations • Longer intervals for scanning • Must explicitly specify

    one or more services to scan
  121. Limitations • Longer intervals for scanning • Must explicitly specify

    one or more services to scan • CBCentralManagerOptionShowPowerAlertKey option is ignored
  122. 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)
  123. If the app in the background is killed by the

    system…
  124. None
  125. State Preservation and Restoration

  126. State Preservation and Restoration The system takes over the BLE

    tasks even after the app is killed.
  127. 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.
  128. 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.
  129. 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!
  130. None
  131. • The app is killed by the system

  132. • The app is killed by the system • The

    user pushes the button on the peripheral device
  133. • The app is killed by the system • The

    user pushes the button on the peripheral device • The system receives the notification
  134. • 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.
  135. 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.
  136. 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!
  137. Implementation

  138. Implementation • Add an option when initializing the CBCentralManager object.

    let options = [ CBCentralManagerOptionRestoreIdentifierKey: "somekey" ] centralManager = CBCentralManager( delegate: self, queue: queue, options: options)
  139. Implementation • Implement the delegate method which is called when

    the app is restored. func centralManager(central: CBCentralManager, willRestoreState dict: [String : AnyObject]) { print("Restored") }
  140. Testing the restoration

  141. Testing the restoration • Kill the app as if it

    was killed by the iOS kill(getpid(), SIGKILL);
  142. How to test without HW prototypes

  143. Did the HW prototypes exist when develop the apps? Projects

    HW prototypes existed? Moff YES WHILL NO BONX NO SmartDrive YES PLEN2 NO Music for the Deaf NO
  144. Development Kit

  145. Development Kit BLE Module

  146. Development Kit BLE Module Display

  147. Development Kit BLE Module Display USB interface

  148. Development Kit BLE Module Display USB interface Battery box

  149. Development Kit Can start development without creating a circuit ourselves

    BLE Module Display USB interface Battery box
  150. None
  151. Development Kit

  152. Development Kit App

  153. Development Kit App BLE

  154. Horizontal (-100~100) / Vertical (-100~100) Development Kit App BLE

  155. None
  156. Emulator App

  157. Emulator App • Develop another iOS app as the alternative

    to the peripheral device
  158. Emulator App • Develop another iOS app as the alternative

    to the peripheral device • Use CBPeripheralManager
  159. Emulator App • Develop another iOS app as the alternative

    to the peripheral device • Use CBPeripheralManager • Easier for iOS engineers
  160. None
  161. None
  162. None
  163. =

  164. Multi-Function Control • Single Tap • Double Tap • Long

    Press • Very Long Press =
  165. Troubleshooting

  166. Can’t find the peripheral Scan ?

  167. Can’t connect Find

  168. Can’t connect Connect ×

  169. • Connection dropped

  170. • Connection dropped • Can’t discover services or characteristics

  171. • Connection dropped • Can’t discover services or characteristics •

    Fail to write
  172. • Connection dropped • Can’t discover services or characteristics •

    Fail to write • Incorrect characteristic values
  173. • Connection dropped • Can’t discover services or characteristics •

    Fail to write • Incorrect characteristic values • Incorrect behaviors in the background
  174. • Connection dropped • Can’t discover services or characteristics •

    Fail to write • Incorrect characteristic values • Incorrect behaviors in the background • etc…
  175. 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’
  176. Can’t find the peripheral • Scanning, but can’t find the

    peripheral device
  177. Can’t find the peripheral • Scanning, but can’t find the

    peripheral device Scan
  178. Can’t find the peripheral • Scanning, but can’t find the

    peripheral device Scan but ‘didDiscover’ method isn’t called
  179. Can’t find the peripheral • Scan with another iOS app

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

    Scan Discovered peripherals
  181. Can’t connect, etc. Connect

  182. Can’t connect, etc. Connect Services & Characteristics

  183. Other debugging tools

  184. Bluetooth Explorer

  185. Bluetooth Explorer An OS X app made by Apple

  186. None
  187. Low Energy Devices

  188. Low Energy Devices Scan, Connect

  189. Low Energy Devices Scan, Connect Details of services and characteristics

  190. Low Energy Devices Scan, Connect Details of services and characteristics

    Write, Read, Register Notify (Subscribe)
  191. func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String :

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

    AnyObject], RSSI: NSNumber!) { print(advertisementData) } Filtered by iOS!
  193. 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
  194. func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String :

    AnyObject], RSSI: NSNumber!) { print(advertisementData) } Filtered by iOS! e.g. Can’t see the ‘Manufacture Data’ field of iBeacon → Can’t see all of the advertisement data
  195. None
  196. Not filtered → Can see the ‘Manufacture Data’ field of

    iBeacon
  197. Packet Logger

  198. Packet Logger An OS X app made by Apple

  199. None
  200. None
  201. How to get

  202. How to get

  203. How to get Download ‘Hardware IO Tools for Xcode’

  204. How to get Download ‘Hardware IO Tools for Xcode’

  205. How to get Download ‘Hardware IO Tools for Xcode’

  206. How to get Download ‘Hardware IO Tools for Xcode’

  207. App Review

  208. None
  209. MSRP $13,995

  210. Costing too much

  211. Not enough devices when submitting

  212. Videos for review

  213. Videos for review • Show how the app works with

    the peripheral device
  214. Videos for review • Show how the app works with

    the peripheral device • Not need to be cool!
  215. None
  216. • Shoot with iPhone

  217. • Shoot with iPhone • Edit with iMovie

  218. 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
  219. ଋɿ31mm ද 4 ද 1 iOSʷBLE Core Bluetooth ϓϩάϥ ϛ

    ϯά iOSʷBLE Core Bluetooth ϓ ϩ ά ϥ ϛ ϯ ά అ म Ұ দ ଜ ྱ ԝ ử ஶ అमҰʷদଜྱԝ ʹ ஶ Shuichi TSUTSUMI ʷ Reo MATSUMURA iOSʷBLE Core Bluetooth Programming iOSʷBLE 定価:本体4,000円 (税別) Resources • 500 pages about iOS x BLE • Japanese only
  220. Resources • Getting Started with Bluetooth Low Energy - Covers

    large area of BLE • Core Bluetooth Programming Guide - Good to know the overview of Core Bluetooth • Core Bluetooth Framework Reference - Details of Core Bluetooth • Bluetooth Accessory Design Guidelines for Apple Products - For HW side, but helpful also for iOS engineers to know specs or limitations due to HW side such as connection intervals.
  221. Resources • WWDC 2012 - Session 703 - Core Bluetooth

    101 - Helpful to know about BLE • WWDC 2012 - Session 705 - Advanced Core Bluetooth - Connection interval, Caching, etc… • WWDC 2013 - Session 703 - Core Bluetooth - Retrieving peripherals, State preservation & restoration etc.. - Includes advanced and detailed information • Bluetooth Core Specification by Bluetooth SIG - The official specification / Total 2000 pages…
  222. Thank you! Shuichi Tsutsumi - iOS Freelancer • Twitter: @shu223

    • GitHub: shu223 • Blog: https://medium.com/@shu223/ • Email: shuichi0526@gmail.com