Ich habe an einem Stück Code gearbeitet, um BLE-Geräte von einer Tabelle zu verbinden. Ich kann Geräte entdecken und in eine Tabelle laden. Bei der Zeilenauswahl innerhalb der Tabelle fordere ich das ausgewählte Gerät an, verbunden zu werden. Allerdings ist didConnectPeripheral nie genannt ...centralManager didConnectPeripheral wird nie aufgerufen
Irgendwelche Gedanken:
import UIKit
import CoreBluetooth
@objc protocol BLEDelegate: class {
func srgDiscoverServices(sender: BLEDiscovery, peripheral: CBPeripheral)
}
let bleDiscoverySharedInstance = BLEDiscovery()
//MARK: - UUIDS for StingRay Genessis M (SRG)
let StingRayGenesisMUUID = CBUUID (string: "346D0000-12A9-11CF-1279-81F2B7A91332") //Core UUID
//MARK: - Device and Characteristic Registers
var BLEDevices : [CBPeripheral] = [] //Device Array
var BLECharDictionary = [String: CBCharacteristic]() //Characteristic Dictionary
class BLEDiscovery: NSObject, CBCentralManagerDelegate {
private var centralManager : CBCentralManager?
weak var delegate: BLEDelegate?
override init() {
super.init()
let centralQueue = dispatch_queue_create("com.stingray", DISPATCH_QUEUE_SERIAL)
centralManager = CBCentralManager(delegate: self, queue: centralQueue)
}
// MARK: - CBCentralManager
func centralManagerDidUpdateState(central: CBCentralManager) {
switch (central.state) {
case CBCentralManagerState.PoweredOff:
print("CBCentralManagerState.PoweredOff")
case CBCentralManagerState.Unauthorized:
// Indicate to user that the iOS device does not support BLE.
print("CBCentralManagerState.Unauthorized")
break
case CBCentralManagerState.Unknown:
// Wait for another event
print("CBCentralManagerState.Unknown")
break
case CBCentralManagerState.PoweredOn:
print("CBCentralManagerState.PoweredOn")
self.startScanning()
case CBCentralManagerState.Resetting:
print("CBCentralManagerState.Resetting")
case CBCentralManagerState.Unsupported:
print("CBCentralManagerState.Unsupported")
break
}
}
// MARK: - Start scanning for StringRay devices with the appropriate UUID
func startScanning() {
if let central = centralManager {
central.scanForPeripheralsWithServices([StingRayGenesisMUUID], options: nil)
}
}
// MARK: - CB Central Manager - Did discover peripheral (follows : startScanning)
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
print("BLEDiscovery :: didDiscoverPeripheral :: ", peripheral.name)
//Check if new discovery and append to BLEDevices where required
if BLEDevices.contains(peripheral) {
}
else{
BLEDevices.append(peripheral)
}
//Change to BLEDevices - therefore update MianViewController, but check that the view is loaded
if MainViewController().deviceTableView != nil {
print("BLEDiscovery :: deviceTableView :: ")
MainViewController().relaodDeviceTable()
}
}
// MARK: - CB Central Manager - Connect and Disconnet BLE Devices
func connectBLEDevice (peripheral: CBPeripheral){
print("BLEDiscovery :: connectBLEDevice :: ", peripheral.name)
//Connect
let peripheralConnect : CBPeripheral = peripheral
self.centralManager!.connectPeripheral(peripheralConnect, options: nil)
}
func disconnectBLEDevice (peripheral: CBPeripheral){
print("BLEDiscovery :: disconnectBLEDevice :: ", peripheral.name)
//Disconnect
let peripheralDisconnect : CBPeripheral = peripheral
self.centralManager?.cancelPeripheralConnection(peripheralDisconnect)
}
// MARK: - CB Central Manager - Did Connect Device
func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
print("BLEDiscovery :: didConnectPeripheral :: ", peripheral.name)
delegate?.srgDiscoverServices(self, peripheral: peripheral)
}
func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) {
//error handling
if (error != nil) {
print("!!Error - BLE Discovery - didDisconnectPeripheral - Error :: \(error)")
return
}
//On disconnect remove device from register
if let index = BLEDevices.indexOf(peripheral) {
BLEDevices.removeAtIndex(index)
}
//Change to BLEDevices - therefore update MianViewController
MainViewController().relaodDeviceTable()
}
func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
//error handling
if (error != nil) {
print("!!Error - BLE Discovery - didFailToConnectPeripheral - Error :: \(error)")
return
}
//Change to BLEDevices - therefore update MianViewController
MainViewController().relaodDeviceTable()
}
}
ich den Code kennen, aus der Tabelle genannt zu werden, wie ich kann Beobachter "BLEDiscovery :: connectBLEDevice ::" peripheral.name“ . im Log-Fenster
Dies ist, wo ich von An- und Abkuppeln rufen:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("MainViewController :: didSelectRowAtIndexPath :: Row :: ", deviceTableView.indexPathForSelectedRow?.row)
let peripheral : CBPeripheral = BLEDevices[(deviceTableView.indexPathForSelectedRow?.row)!]
switch peripheral.state{
case .Connected:
//Disconnect as device is connected
BLEDiscovery().disconnectBLEDevice(peripheral)
case .Disconnected:
//Connect as device as disconnected
BLEDiscovery().connectBLEDevice(peripheral)
default: break
}
}
Dies ist nicht Ihr Problem, aber ist Ihre Hauptansicht Controller ein Singleton? Wenn nicht, wird Ihnen MainViewController() nicht die benötigte Instanz geben. Kannst du zeigen, wo du 'connectBLEDevice' nennst? In 'didSelectRowAtIndexPath'? Ihr 'BLEDiscovery'-Objekt sollte ein Singleton sein und Ihr Peripherie-Array sollte eher eine Eigenschaft dieser Klasse sein als eine globale – Paulw11