【Swift3】CoreBluetoothサンプル集


CoreBluetooth with Swift3の基本コード集です。
Swift2からちょっと変わってたので覚え書きも兼ねてまとめ。

## 参考にさせて頂いた書籍
[iOS×BLE Core Bluetoothプログラミング](https://www.amazon.co.jp/exec/obidos/ASIN/4883379736/22301-22/ref=nosim/)
Bluetooth、iOSといえばもはや鉄板のこの書籍を参考にさせて頂きました。

そしてこちらも。
[Core Bluetooth with Swift](http://qiita.com/shu223/items/78614325ce25bf7f4379)

## 今回作ったもの
今回はiOS端末×iOS端末のBLE接続を想定し、
セントラルにもペリフェラルにもなれるよう作りました。
アドバタイズ〜キャラクタリスティックの取得までです。

[完成品](https://github.com/chocoffee/CoreBluetoothSample)は一応GitHubにあげてあります。
（サンプルコードなので色々雑ですがあしからず）

## サンプル集

### インポート
```ruby:
import UIKit
import CoreBluetooth
```

### セントラル側

##### 1.プロトコルとプロパティ定義
```swift:
class ViewController: UIViewController, CBCentralManagerDelegate{
    var centralManager: CBCentralManager!
```



##### 2.初期化
```swift
centralManager = CBCentralManager(delegate: self, queue: nil)
```



##### 3. 状態変化を取得する（必須）
```swift
func centralManagerDidUpdateState(_ central: CBCentralManager) {
        print ("state: \(central.state)")
}
```



##### 4.スキャン開始
```swift
centralManager.scanForPeripherals(withServices: nil, options: nil)
```


##### 5.スキャン結果取得
```swift
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
       print("peripheral: \(peripheral)")
}
```


##### 6.スキャン終了
```swift
centralManager.stopScan()
```


##### 7. 見つけたペリフェラルへの接続開始
```swift
self.centralManager.connect(self.peripheral, options: nil)
```

##### 8.ペリフェラルとの接続結果を取得
```swift
//  成功時
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        print("Connect success!")
}

//  失敗時
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
        print("Connect failed...")
}
```


### サービス検索とキャラクタリスティック検索


##### 1. プロトコルとプロパティ
```swift
class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate{
```

##### 2. サービス検索開始
```swift
peripheral.delegate = self
peripheral.discoverServices(nil)
```

##### 3. サービス検索結果の取得
```swift
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        guard let services = peripheral.services else{
            print("error")
            return
        }
        print("\(services.count)個のサービスを発見。\(services)")
}
```

##### 4. キャラクタリスティックの検索
```swift
peripheral.discoverCharacteristics(nil, for: obj)
```


##### 5. キャラクタリスティック検索結果の取得
```swift
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if let characteristics = service.characteristics {
            print("\(characteristics.count)個のキャラクタリスティックを発見。\(characteristics)")
        }
}
```




### ペリフェラル側

##### 1. プロトコルとプロパティ
```swift
class ViewController: UIViewController, CBPeripheralManagerDelegate{
        var peripheralManager: CBPeripheralManager!
```



##### 2. 初期化
```swift
peripheralManager = CBPeripheralManager(delegate: self, queue: nil)
```


##### 3. 状態変化を取得
```swift
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        print("periState\(peripheral.state)")
}
```


##### 4. アドバタイズ開始
```swift
let advertisementData = [CBAdvertisementDataLocalNameKey: "Test Device"]
peripheralManager.startAdvertising(advertisementData)
```



##### 5. アドバタイズ結果を取得
```swift
func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {
        if let error = error {
            print("***Advertising ERROR")
            return
        }
        print("Advertising success")    
}
```


##### 6. アドバタイズ終了
```swift
peripheralManager.stopAdvertising()
```


### サービス追加

##### 1. サービス作成
```swift
let serviceUUID = CBUUID(string: "0000")
let service = CBMutableService(type: serviceUUID, primary: true)
```



##### 2. キャラクタリスティック作成
```swift
let charactericUUID = CBUUID(string: "0001")
let characteristic = CBMutableCharacteristic(type: charactericUUID, properties: CBCharacteristicProperties.read, value: nil, permissions: CBAttributePermissions.readable)
```


##### 3. サービスにキャラクタリスティックを追加
```swift
service.characteristics = [characteristic]
```

##### 4. ペリフェラルにサービスを追加
```swift
self.peripheralManager.add(service)
```



##### 5. サービス追加結果を取得
```swift
func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?) {
        if error != nil {
            print("Service Add Failed...")
            return
        }
        print("Service Add Success!")
}
```