Core Bluetooth 四歩目

引き続き・・・

実機繋げるケーブルが手元にないので、まだテストできないけど。

Peripheral をスキャンするコードは電源が入った状態で開始するように書く場所を移動。

import UIKit
import CoreBluetooth

class ViewController: UIViewController {
    var blue: Bluetooth = Bluetooth()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

class Bluetooth: NSObject, CBCentralManagerDelegate {
    var centralMagaer: CBCentralManager!
    override init() {
        super.init()
        centralMagaer = CBCentralManager(delegate: self, queue: nil)
    }

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch(central.state){
        case .poweredOff:
            print("Central State: Powered Off.")
            break
        case .poweredOn:
            print("Central State: Powered On.")
            self.centralMagaer.scanForPeripherals(withServices: nil, options: nil)
            break
        case .resetting:
            print("Central State: Resetting.")
            break
        case .unauthorized:
            print("Central State: Unauthorized.")
            break
        case .unknown:
            print("Central State: Unknown.")
            break
        case .unsupported:
            print("Central State: Unsupported.")
            break
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        //print("Delegate: didDiscover.")
        print("Discovered Peripheral: \(peripheral)")
        for ad in advertisementData {
            print("Advertisemented Data: \(ad)")
        }
    }
    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
        print("Delegate: didDisconnectPeripheral.")
        print("Peripheral: \(peripheral)")
    }
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        print("Delegate: didConnect.")
        print("Peripheral: \(peripheral)")
        if let service = peripheral.services {
            for src in service {
                print("Service: \(srv)")
            }
        }
    }
    /*
    func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
        print("Delegate: willRestoreState.")
    }
    */
    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
        print("Delegate: didFailToConnect.")
        print("Peripheral: \(peripheral)")
    }
}

Delegate 系を継承しているので、とりあえずめぼしいものを定義してみる。

xcode のヘルプから Documentation and API Reference を開いて

ショートカット:  +  + 

目的の Delegate 名を検索すると定義できるシンボルの一覧がわかる。キーワードさえわかれば Code Editor 上で自動で補完してくれるけど。

が、「willRestoreState」だけはそのままでは怒られるのでコメントアウト。

2017-07-28 10:15:40.102566+0900 BluetoothSample [13427:2444511] [CoreBluetooth] API MISUSE: <CBCentralManager: 0x608000079ac0> has no restore identifier but the delegate implements the centralManager:willRestoreState: method. Restoring will not be supported
Central State: Unsupported.

動くかどうかは不明・・・。

追記:

動いたけどログの出方が汚いので少し修正。

ひたすら Discovered な Peripheral がログに出てくる。出している奴は MacBook 側。もちろん MacBook の Bluetooth の設定は有効な状態。

Discovered Peripheral: <CBPeripheral: 0x1700fff00, identifier = /* 省略(32桁のID) */, name = MacBook Pro, state = disconnected>
Advertisemented Data: (key: "kCBAdvDataIsConnectable", value: 1)

フォローする