2016-08-07 6 views
2

Во-первых, я знаю, что этот вопрос был задан очень много. И я прошел через все из них, пытаясь разрешить это, но безрезультатно.Bluetooth не обнаруживает устройства

У меня есть простое приложение, которое сканирует устройства с поддержкой Bluetooth. Вот мой код.

import CoreBluetooth 
import UIKit 

class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { 

    var manager: CBCentralManager! 
    var peripheral: CBPeripheral! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     manager = CBCentralManager(delegate: self, queue: nil) 
    } 

    // MARK: - CBCentralManagerDelegate 
    func centralManagerDidUpdateState(central: CBCentralManager) { 
     print(#function) 

     switch central.state { 
     case .Unsupported: 
      print("Unsupported") 
     case .Unauthorized: 
      print("Unauthorized") 
     case .PoweredOn: 
      print("Powered On") 
      central.scanForPeripheralsWithServices(nil, options: nil) 
     case .Resetting: 
      print("Resetting") 
     case .PoweredOff: 
      print("Powered Off") 
     case .Unknown: 
      print("Unknown") 
     } 
    } 

    func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { 
     print(#function) 

     print("Discovered \(peripheral.name) at \(RSSI)") 

     if peripheral.name!.containsString(name) { 
      manager.stopScan() 

      self.peripheral = peripheral 
      self.peripheral.delegate = self 

      manager.connectPeripheral(peripheral, options: nil) 
     } 
    } 

    func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { 
     print(#function) 
    } 

    func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) { 
     central.scanForPeripheralsWithServices(nil, options: nil) 
    } 


    // MARK: - CBPeripheralDelegate 
    func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) { 
     print(#function) 

     guard let services = peripheral.services else { 
      return 
     } 

     for service in services { 
      print(service.UUID) 
      if service.UUID == serviceUUID { 
       peripheral.discoverCharacteristics(nil, forService: service) 
      } 
     } 
    } 

    func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) { 
     print(#function) 

     guard let characteristics = service.characteristics else { 
      return 
     } 

     for characteristic in characteristics { 
      print(characteristic.UUID) 
      if characteristic.UUID == scratchUUID { 
       peripheral.setNotifyValue(true, forCharacteristic: characteristic) 
      } 
     } 
    } 

    func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { 
     print(#function) 

     var count: UInt32 = 0 
     if characteristic.UUID == scratchUUID { 
      characteristic.value!.getBytes(&count, length: sizeof(UInt32)) 
      print(String(format: "%llu", count)) 
     } 
    } 

} 

Я запустил его в своем iPhone 5 (iOS 9.3.4). У меня был ноутбук под управлением Windows, телефон Android, iPad Air 2 и мой Mac, все Bluetooth включен. Но ни одно из этих устройств не было обнаружено. centralManagerDidUpdateState метод вызывается и начинается сканирование, но это все. didDiscoverPeripheral Метод делегата никогда не вызывается.

Я повторил этот процесс, на этот раз запустил его в iPad Air 2, но тот же результат.

Если я перехожу в меню Bluetooth на устройстве, я вижу, что другие обнаруженные устройства.

В некоторых ответах SO я видел, что выполнение его в главной очереди будет работать. Вроде так, manager = CBCentralManager(delegate: self, queue: dispatch_get_main_queue()). Но это тоже не сработало.

Я бы очень признателен за любую помощь по этому вопросу.

+4

Есть ли какие-либо из этих устройств, рекламирующих услугу BLE? Попробуйте приложение LightBlue из App Store и посмотрите, может ли он что-нибудь обнаружить. – Paulw11

+0

Я думаю, что по умолчанию основная очередь. Вы можете попробовать создать свою собственную очередь с 'let queue = dispatch_queue_create (" meme ", DISPATCH_QUEUE_SERIAL);'. Кроме этого, вы можете попробовать получить [LightBlue] (https://itunes.apple.com/us/app/lightblue/id639944780?mt=12) на своем Mac и посмотреть, не видит ли он что-либо. Док говорит, что поиск периферийных устройств без указания идентификаторов службы «не рекомендуется», но он все равно должен работать. –

+0

Я буду +1 @ Paulw11. Ваши устройства рекламируют BLE? Это не потому, что BLE - это то, что они рекламируют. Другими словами, чтобы найти устройство, устройство должно сказать, что оно здесь (рекламировать). Поэтому попробуйте LightBlue. – Larme

ответ

1

Ваши другие устройства, вероятно, не рекламируют услугу BLE (например, Paulw11, упомянутую в комментариях). Все упомянутые вами устройства не будут отображаться как обнаруженные, если они не находятся на странице настроек Bluetooth.

Есть приложения для iOS, Android и Windows, которые позволяют им размещать рекламу через LE. Самый простой в использовании - LightBlue for iOS. Запустите приложение на iPhone, пока другое устройство iOS рекламируется, и вы должны увидеть рекламу. Возможно, было бы полезно получить рекламный сканер LE на Windows или Android, чтобы дважды проверить, что LightBlue рекламирует.

Примечание для Windows не поддерживает второстепенную роль для Bluetooth LE, так что даже если вы будете в состоянии видеть рекламу вы не сможете подключиться к нему.

+0

Вслед за тем же вопросом .... Как делает LightBlue? Чтение документации, я должен быть в состоянии предоставить параметры «nil» при запуске сканирования и увидеть все? ... Как LightBlue может видеть периферийные устройства, но не мой код? –