CoreBluetooth with Swift3の基本コード集です。
Swift2からちょっと変わってたので覚え書きも兼ねてまとめ。
参考にさせて頂いた書籍
iOS×BLE Core Bluetoothプログラミング
Bluetooth、iOSといえばもはや鉄板のこの書籍を参考にさせて頂きました。
そしてこちらも。
Core Bluetooth with Swift
今回作ったもの
今回はiOS端末×iOS端末のBLE接続を想定し、
セントラルにもペリフェラルにもなれるよう作りました。
アドバタイズ〜キャラクタリスティックの取得までです。
完成品は一応GitHubにあげてあります。
(サンプルコードなので色々雑ですがあしからず)
サンプル集
インポート
import UIKit
import CoreBluetooth
セントラル側
1.プロトコルとプロパティ定義
class ViewController: UIViewController, CBCentralManagerDelegate{
var centralManager: CBCentralManager!
2.初期化
centralManager = CBCentralManager(delegate: self, queue: nil)
3. 状態変化を取得する(必須)
func centralManagerDidUpdateState(_ central: CBCentralManager) {
print ("state: \(central.state)")
}
4.スキャン開始
centralManager.scanForPeripherals(withServices: nil, options: nil)
5.スキャン結果取得
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print("peripheral: \(peripheral)")
}
6.スキャン終了
centralManager.stopScan()
7. 見つけたペリフェラルへの接続開始
self.centralManager.connect(self.peripheral, options: nil)
8.ペリフェラルとの接続結果を取得
// 成功時
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Connect success!")
}
// 失敗時
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
print("Connect failed...")
}
サービス検索とキャラクタリスティック検索
1. プロトコルとプロパティ
class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate{
2. サービス検索開始
peripheral.delegate = self
peripheral.discoverServices(nil)
3. サービス検索結果の取得
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
guard let services = peripheral.services else{
print("error")
return
}
print("\(services.count)個のサービスを発見。\(services)")
}
4. キャラクタリスティックの検索
peripheral.discoverCharacteristics(nil, for: obj)
5. キャラクタリスティック検索結果の取得
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
if let characteristics = service.characteristics {
print("\(characteristics.count)個のキャラクタリスティックを発見。\(characteristics)")
}
}
ペリフェラル側
1. プロトコルとプロパティ
class ViewController: UIViewController, CBPeripheralManagerDelegate{
var peripheralManager: CBPeripheralManager!
2. 初期化
peripheralManager = CBPeripheralManager(delegate: self, queue: nil)
3. 状態変化を取得
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
print("periState\(peripheral.state)")
}
4. アドバタイズ開始
let advertisementData = [CBAdvertisementDataLocalNameKey: "Test Device"]
peripheralManager.startAdvertising(advertisementData)
5. アドバタイズ結果を取得
func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {
if let error = error {
print("***Advertising ERROR")
return
}
print("Advertising success")
}
6. アドバタイズ終了
peripheralManager.stopAdvertising()
サービス追加
1. サービス作成
let serviceUUID = CBUUID(string: "0000")
let service = CBMutableService(type: serviceUUID, primary: true)
2. キャラクタリスティック作成
let charactericUUID = CBUUID(string: "0001")
let characteristic = CBMutableCharacteristic(type: charactericUUID, properties: CBCharacteristicProperties.read, value: nil, permissions: CBAttributePermissions.readable)
3. サービスにキャラクタリスティックを追加
service.characteristics = [characteristic]
4. ペリフェラルにサービスを追加
self.peripheralManager.add(service)
5. サービス追加結果を取得
func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?) {
if error != nil {
print("Service Add Failed...")
return
}
print("Service Add Success!")
}