2017-04-12 1 views
2

J'essaie d'accéder à un capteur de mouvement (capteur IMU) via BLE. La structure consiste à connecter/coupler le capteur dans un contrôleur de vue et à modifier ses paramètres, puis à accéder et analyser ses données de sortie dans un autre contrôleur de vue (ils ne sont pas connectés). Comment puis-je continuer à accéder aux données du capteur qui a été connecté dans un autre contrôleur de vue?Comment accéder aux données Bluetooth sur les contrôleurs de vue? dans xcode

Comment puis-je continuer à accéder aux données du capteur qui a été connecté dans un autre contrôleur de vue? Coredata ne sera pas idéal car il s'agit d'une présentation en temps réel et les données brutes ne sont pas nécessaires pour enregistrer. Je ne peux pas transmettre les données par segment, car elles ne sont pas connectées (elles sont accessibles via différents contrôleurs de vue de la barre d'onglets).

J'ai trouvé un lien disant qu'il est possible de mettre CBCentralManager etc dans AppDelegate et ensuite il devient une propriété de gestionnaire central (How to continue BLE activities onto next view controller). Est-ce la bonne façon de le faire? Si oui, quelle partie du gestionnaire central doit être mise dans AppDelegate?

Voici mon code incluant la recherche et la construction d'une connexion bluetooth.

var cManager = CBCentralManager() 
var peripheralManager = CBPeripheralManager() 

func centralManagerDidUpdateState(central: CBCentralManager!) { 

    var message: String = "" 
    switch cManager.state { 

    case .PoweredOff: 
     println("CoreBluetooth BLE hardware is powered off") 

     let alertView = UIAlertController(title: "", message: "Please enable Bluetooth to start the measurement", preferredStyle: .Alert) 
     alertView.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) 
     presentViewController(alertView, animated: true, completion: nil) 

     break 
    case .PoweredOn: 
     println("CoreBluetooth BLE hardware is powered on and ready") 

     self.scanForWAX9(self) 
     break 
    case .Resetting: 
     println("CoreBluetooth BLE hardware is resetting") 
     break 
    case .Unauthorized: 
     println("CoreBluetooth BLE state is unauthorized") 
     break 
    case .Unknown: 
     println("CoreBluetooth BLE state is unknown") 
     break 
    case .Unsupported: 
     println("CoreBluetooth BLE hardware is unsupported on this platform") 
     break 
    default: 
     break 
    } 

} 

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) { 

    println(peripheral.name); 


    //************************************************************************************ 
    // Add some specification for bluetooth device 
    //************************************************************************************ 

    if (peripheral.name != nil) && (peripheral.name.rangeOfString("WAX9") != nil) { 

     central.connectPeripheral(peripheral, options: nil) 

     self.connectedPeripheral = peripheral 

     println("PERIPHERAL NAME: \(peripheral.name)\n AdvertisementData: \(advertisementData)\n RSSI: \(RSSI)\n") 

     println("UUID DESCRIPTION: \(peripheral.identifier.UUIDString)\n") 

     println("IDENTIFIER: \(peripheral.identifier)\n") 

     cManager.stopScan() 
    } 
} 

@IBOutlet var connectNotice: UILabel! 



func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) { 

    peripheral.delegate = self 
    peripheral.discoverServices(nil) 

    // self.connectedPeripheral = peripheral 

    connectNotice.text = "\(peripheral.name) connected." 
    connectNotice.textColor = UIColor.whiteColor() 
    connectNotice.backgroundColor = UIColor(red:0.03, green:0.37, blue:0.5, alpha:0.5) 

    cManager.stopScan() 
    println("Scanning stopped") 
    println("Connected to peripheral") 
} 



// Alert message when fail to connect, e.g. when sensor goes out of range 
func centralManager(central: CBCentralManager!, didFailToConnectPeripheral peripheral: CBPeripheral!, error: NSError!) { 
    println("FAILED TO CONNECT \(error)") 

    let alertView = UIAlertController(title: "", message: "Failed to connect.", preferredStyle: .Alert) 
    alertView.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) 
    presentViewController(alertView, animated: true, completion: nil) 

    self.disconnect() 
} 

// Start to scan for sensor when disconnected 
func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) { 


    println("Disconnected from peropheral") 
    let alertView = UIAlertController(title: "", message: "The connection is stopped.", preferredStyle: .Alert) 
    alertView.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) 
    presentViewController(alertView, animated: true, completion: nil) 

    self.connectedPeripheral = nil 
    if scanAfterDisconnecting { 
     scanForWAX9(self) 
    } 

} 


func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager!) { 

    switch peripheralManager.state { 

    case .PoweredOff: 
     println("Peripheral - CoreBluetooth BLE hardware is powered off") 
     break 

    case .PoweredOn: 
     println("Peripheral - CoreBluetooth BLE hardware is powered on and ready") 
     break 

    case .Resetting: 
     println("Peripheral - CoreBluetooth BLE hardware is resetting") 
     break 

    case .Unauthorized: 
     println("Peripheral - CoreBluetooth BLE state is unauthorized") 
     break 

    case .Unknown: 
     println("Peripheral - CoreBluetooth BLE state is unknown") 
     break 

    case .Unsupported: 
     println("Peripheral - CoreBluetooth BLE hardware is unsupported on this platform") 
     break 
    default: 
     break 
    } 

} 

func peripheral(peripheral: CBPeripheral!, didDiscoverServices error: NSError!) { 

    if (error != nil) { 
     println("ERROR: \(error)") 
     disconnect() 
     return 
    } 

    for service in peripheral.services 
    { 
     NSLog("Discovered service: \(service.UUID)") 

     peripheral.discoverCharacteristics(nil, forService: service as CBService) 

    } 
} 
+0

L'idée derrière mettre la CBCentralManager en tant que propriété accessible dans AppDelegate, doit utiliser le fait que AppDelegate est un sharedInstance (modèle singleton). Mais cela donne trop de travail sans rapport avec AppDelegate. Laissez AppDelegate faire ses tâches de "AppDelegating". Créez vous-même un Singleton (regardez sur "Singleton + Swift") qui gérera tous vos trucs BLE. – Larme

+0

Merci beaucoup! – Mushroomcloud

Répondre

1

Vous pourriez peut-être créer une classe mondiale qui peut devenir la propriété du gestionnaire central ?

Voir cette réponse comment faire: https://stackoverflow.com/a/6067515/1331332

Vous pouvez ensuite utiliser NSNotificationCenter pour envoyer les données tout au long de votre application, vient de mettre en place les observateurs dans chaque ViewController