我在El Capitan上有以下非常简单的代码片段,它基本上是扫描BLE外围设备并连接到我想要的那个。然而,didDiscoverPeripheral永远不会被调用!它开始扫描但从未找到任何外围设备。对未来澄清要求的一些答案:
我在附近有BLE设备做广告。例如,我可以通过电话看到它们。
代码检查BLE是否已通电。
下面有很多类似的问题,但是没有一个问题对我有帮助。
代码如下:
import Cocoa
import CoreBluetooth
class ViewController: NSViewController, CBPeripheralDelegate, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
var peripheral: CBPeripheral!
let DEVICE_NAME = "something"
var currentCharacteristic: CBCharacteristic! = nil
// Put CentralManager in the main queue
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.startManager()
}
override func viewDidLoad() {
super.viewDidLoad()
self.startManager()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func startManager(){
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch (central.state)
{
case CBCentralManagerState.unsupported:
print("BLE Unsupported")
break
case CBCentralManagerState.unauthorized:
print("BLE unauthorized")
break
case CBCentralManagerState.poweredOff:
print("BLE is not on.")
break
case CBCentralManagerState.poweredOn:
print("BLE is on.")
print("Scanning...")
self.centralManager?.scanForPeripherals(withServices: nil, options: nil)
break
case CBCentralManagerState.unknown:
print("BLE state unknown")
break
default:
print("BLE state default.")
}
}
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
// This is NEVER called!
print("Peripheral: \(peripheral)")
if (peripheral.name != nil && peripheral.name! == DEVICE_NAME){
self.peripheral = peripheral
self.centralManager.connect(self.peripheral, options: [CBConnectPeripheralOptionNotifyOnDisconnectionKey : true])
}
}
func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
peripheral.delegate = self
peripheral.discoverServices(nil)
print("Connected to \(peripheral)")
self.stopScan()
}
func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?){
print("connection failed", error)
}
func stopScan(){
self.centralManager.stopScan()
}
func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?){
if self.peripheral != nil {
self.peripheral.delegate = nil
self.peripheral = nil
}
print("Disconnected.", error)
self.startManager()
}
}
知道什么是错的吗?