BLEでデバイスをスキャンする

自分をセントラルにする

まずはじめにiPhoneをセントラルにする必要があります。そのためにCBCentralManagerを作成します。

class ViewController: UIViewController {
    var myCentralManager: CBCentralManager!
    
    override func viewDidAppear(_ animated: Bool) {
        
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        myCentralManager = CBCentralManager(delegate: self, queue: nil)
    }
}

セントラルの状態取得

BLE通信はiPhone(セントラル)がBluetooth接続可能であるかを確認する必要があります。

今回は、bluetoothに接続ができる状態の.powordOnを設定しています。

    //セントラルマネージャーの状態取得
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            //ペリフェラルの検出デリゲートを呼ぶ
            central.scanForPeripherals(withServices: nil, options: nil)
        }
    }

ペリフェラルを検出

    //ペリフェラル検出時に呼ばれる
    func centralManager(_ central: CBCentralManager,
                        didDiscover peripheral: CBPeripheral,
                        advertisementData: [String : Any],
                        rssi RSSI: NSNumber) {
          print("検出したよ!")
    }

これで検出することができます。

注意点としては、周りにBluetoothを飛ばしている機器がたくさんある場合名前がないものでも検知してしまうので、検知したいデバイスの名前がわかるのであれば、名前を絞ったほうがいいかなと思います。

スキャンのコード全部

import UIKit
import CoreBluetooth

class ViewController: UIViewController {
    var myCentralManager: CBCentralManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        myCentralManager = CBCentralManager(delegate: self, queue: nil)
    }
}

extension ViewController: CBCentralManagerDelegate{
    //セントラルマネージャーの状態取得
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            //ペリフェラルの検出デリゲートを呼ぶ
            central.scanForPeripherals(withServices: nil, options: nil)
        }
    }
    //ペリフェラル検出時に呼ばれる
    func centralManager(_ central: CBCentralManager,
                        didDiscover peripheral: CBPeripheral,
                        advertisementData: [String : Any],
                        rssi RSSI: NSNumber) {
                        	
         print("検出したよ!")
      }
}