2016-09-24 2 views
0

Ich implementiere einen CentralManager mit dem CoreBluetooth-Framework, um die von Peripheriegeräten bereitgestellten Werte zu extrahieren.CBPeripherie-Dienst scheint unsichtbar zu sein

Ich suche zuerst nach Peripheriegeräten, die einen Dienst mit einer bestimmten UUID haben ("52486FA8-FF0B-4A91-A344-D642D0E91AD0"). Der CentralManager findet das Peripheriegerät, aber wenn ich versuche, die Dienste dieses Peripheriegeräts zu drucken, erhalte ich ein leeres Array.

ist hier mein Code

// 
// ViewController.swift 
// centralLearn 
// 
// Created by Francesco Vanduynslager on 24/09/2016. 
// Copyright © 2016 Francesco Vanduynslager. All rights reserved. 
// 

import UIKit 
import CoreBluetooth 

class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { 
    var centralManager: CBCentralManager! 
    var discoveredPeripherals: [CBPeripheral]! 

    let serviceUUID = CBUUID(string:"52486FA8-FF0B-4A91-A344-D642D0E91AD0") 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     centralManager = CBCentralManager(delegate: self, queue: nil) 
     discoveredPeripherals = [] 
    } 

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

    func centralManagerDidUpdateState(_ central: CBCentralManager) { 
     if central.state == .poweredOn { 
      print("Central Started") 
      centralManager.scanForPeripherals(withServices: [serviceUUID], 
               options: nil) 
     } else if central.state == .poweredOff { 
      centralManager.stopScan() 
     } 
    } 

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
     print("Discovered Peripheral: \(peripheral.name)") 
     self.discoveredPeripherals.append(peripheral) 
     centralManager.connect(peripheral, options: nil) 
     centralManager.stopScan() 
    } 

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { 
     print("Connected to peripheral!! \(peripheral)") 
     print("count: \(peripheral.services?.count)") 
     peripheral.delegate = self 

     if (peripheral.services == nil) { 
      peripheral.discoverServices([serviceUUID]) 
     } 
    } 

    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { 
     if error != nil { 
      print("Discover service Error: \(error)") 
     } else { 
      print("Discovered Service") 
      for service in peripheral.services!{ 
       print("SERV: \(service)") 
       peripheral.discoverCharacteristics([CBUUID(string: "5A5E5393-4505-471C-BA90-7AD044FFFD9C")], for: service) 
      } 
      print(peripheral.services) 
      print("DONE") 
     } 
    } 

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { 
     let characteristic = service.characteristics?[0] 
     print("Discovered Characteristic") 
     peripheral.readValue(for: characteristic!) 
    } 


    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { 
     if error != nil { 
      print("Read value service Error: \(error)") 
     } else { 
      print("Value of Characteristic: \(characteristic.value)") 
     } 
    } 
} 

Und die erhaltenen Drucke sind wie folgt:

Central Started 
Discovered Peripheral: Optional("-ShEsKo-") 
Connected to peripheral!! <CBPeripheral: 0x1740f7d00, identifier = A9B3F888-99E1-C62B-DF93-87F1F99AE847, name = -ShEsKo-, state = connected> 
count: nil 
Discovered Service 
Optional([]) 
DONE 

EDIT

Hier ist mein peripheren Code:

// 
// ViewController.swift 
// peripheralLearn 
// 
// Created by Francesco Vanduynslager on 24/09/2016. 
// Copyright © 2016 Francesco Vanduynslager. All rights reserved. 
// 

import UIKit 
import CoreBluetooth 
import CoreLocation 

class ViewController: UIViewController, CBPeripheralManagerDelegate { 
    var localBeacon: CLBeaconRegion! 
    var beaconPeripheralData: NSDictionary! 
    var peripheralManager: CBPeripheralManager! 

    var services: [CBMutableService]! 

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

    func initLocalBeacon() { 
     if localBeacon != nil { 
      stopLocalBeacon() 
     } 

     let localBeaconUUID = "B65D79F6-74A2-482F-A669-FA5AB35CD3B8" 
     let localBeaconMajor: CLBeaconMajorValue = 123 
     let localBeaconMinor: CLBeaconMinorValue = 456 

     let uuid = UUID(uuidString: localBeaconUUID)! 
     localBeacon = CLBeaconRegion(proximityUUID: uuid, major: localBeaconMajor, minor: localBeaconMinor, identifier: "Your private identifer here") 

     beaconPeripheralData = localBeacon.peripheralData(withMeasuredPower: nil) 
     peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil) 



     /// FIRST SERVICE 
     let serviceUUID = CBUUID(string: "52486FA8-FF0B-4A91-A344-D642D0E91AD0") 
     let characteristicUUID = CBUUID(string: "5A5E5393-4505-471C-BA90-7AD044FFFD9C") 

     let characteristic = CBMutableCharacteristic(type: characteristicUUID, 
                properties: .read, 
                value: "hello".data(using: .utf8), 
                permissions: .readable) 

     let service = CBMutableService(type: serviceUUID, primary: true) 

     service.characteristics = [characteristic] 

     services=[service] 
     peripheralManager.add(service) 
    } 

    func stopLocalBeacon() { 
     peripheralManager.stopAdvertising() 
     peripheralManager = nil 
     beaconPeripheralData = nil 
     localBeacon = nil 
    } 

    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { 
     if peripheral.state == .poweredOn { 
      print("peripheral Started") 
//   peripheralManager.startAdvertising(beaconPeripheralData as! [String: AnyObject]!) 
      peripheralManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey: [services[0].uuid, services[1].uuid]]) 
     } else if peripheral.state == .poweredOff { 
      peripheralManager.stopAdvertising() 
     } 
    } 

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

    func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) { 
     if (error != nil){ 
      print("ERROR starting advertising") 
     }else{ 
      print("Did Start advertising") 
     } 
    } 

    func peripheralManager(_ peripheral: CBPeripheralManager, willRestoreState dict: [String : Any]) { 
     print("Restoring state") 
    } 

    func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?) { 
     if (error != nil) { 
      print("ERROR adding service: \(error)") 
     }else{ 
      print("Service added: \(service)") 
     } 
    } 
} 
+0

Was ist das Peripheriegerät? Bietet und bewirbt es den angegebenen Dienst? Hast du die Light Blue App ausprobiert, um zu sehen, ob sie den Service sehen kann? – Paulw11

+0

Wie wäre es mit dem Ausdruck der Service-UUID mit 'print (" SERV: \ (service.UUID.UUIDstring) ")'? – Enix

+0

@Enix Da es sich bei periphere.services um ein leeres Array handelt, ist es sinnlos, dass das Programm nicht in diese Schleife gelangt. – ShEsKo

Antwort

1

Ihr Problem ist in dir peripherer Code. Sie können den Dienst nicht zu CBMutablePeripheral hinzufügen, bis der CBPeripheralManager im eingeschalteten Zustand ist.

Ich schlage vor, dass Sie Ihren Dienst auf seine eigene Funktion verschieben und diese Funktion aufrufen, wenn Sie sich im eingeschalteten Zustand befinden.

func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { 
    if peripheral.state == .poweredOn { 
     print("peripheral Started") 
     //   peripheralManager.startAdvertising(beaconPeripheralData as! [String: AnyObject]!) 
     self.setupService() 
    } else if peripheral.state == .poweredOff { 
     peripheralManager.stopAdvertising() 
    } 
} 

func setupService() { 
    let serviceUUID = CBUUID(string: "52486FA8-FF0B-4A91-A344-D642D0E91AD0") 
    let characteristicUUID = CBUUID(string: "5A5E5393-4505-471C-BA90-7AD044FFFD9C") 

    let characteristic = CBMutableCharacteristic(type: characteristicUUID, 
               properties: .read, 
               value: "hello".data(using: .utf8), 
               permissions: .readable) 

    let service = CBMutableService(type: serviceUUID, primary: true) 

    service.characteristics = [characteristic] 

    services=[service] 
    peripheralManager.add(service) 
    peripheralManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey: [services[0].uuid]]) 

} 
+0

Paul du Chef !! – ShEsKo

+0

Ich habe gerade die Delegate-Funktion Peripherie hinzugefügt: DidRecieveReadRequest und es wird nicht aufgerufen, obwohl mein Gerät die Nachricht liest. Irgendeine Idee warum? – ShEsKo

+0

Sie haben einen Wert für Ihr Merkmal angegeben, als Sie es erstellt haben, also hat es einen festen Wert. Wenn Sie den Anfangswert auf "nil" setzen, wird die Delegate-Methode aufgerufen. – Paulw11

Verwandte Themen