2016-09-24 2 views
0

Я реализую CentralManager с каркасом CoreBluetooth, чтобы извлечь значения, предоставляемые периферийными устройствами.CBPeripheral Service кажется невидимым

Сначала я ищу периферийные устройства, которые имеют сервис с определенным UUID («52486FA8-88-FF0B-4A91-A344-D642D0E91AD0»). CentralManager находит периферийное устройство, но когда я пытаюсь распечатать службы этого периферийного устройства, я получаю пустой массив.

Вот мой код

// 
// 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)") 
     } 
    } 
} 

И полученные отпечатки являются следующим:

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

Вот мой периферийный код:

// 
// 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

Что такое периферийное устройство? Является ли это предложение и реклама указанной услуги? Пробовали ли вы приложение Light Blue, чтобы увидеть, сможет ли он увидеть эту услугу. – Paulw11

+0

как насчет печати UUID службы с 'print (" SERV: \ (service.UUID.UUIDString) ")'? – Enix

+0

@Enix Не было бы никакого смысла, поскольку периферийные службы являются пустым массивом, что означает, что программа не попадет внутрь этого цикла. – ShEsKo

ответ

1

Ваша проблема находится в вашем периферийный код. Вы не можете добавить услугу в CBMutablePeripheral, пока CBPeripheralManager не будет включен.

Предлагаю вам перевести свой сервис на свою функцию и вызвать эту функцию, когда вы находитесь в состоянии включения.

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 you boss !! – ShEsKo

+0

Я просто добавил функцию функции делегата: DidRecieveReadRequest, и она не вызывается, даже если мое устройство читает сообщение. Любая идея почему? – ShEsKo

+0

Вы указали значение для своего признака при его создании, поэтому оно имеет фиксированное значение. Если вы установите его начальное значение на «nil», тогда вызывается метод делегата. – Paulw11

Смежные вопросы