2016-08-07 42 views
2

Zunächst einmal, ich weiß, dass diese Frage viel auf SO gestellt wurde. Und ich ging durch alle und versuchte es zu lösen, aber ohne Erfolg.Bluetooth erkennt keine Geräte

Ich habe eine einfache App, die nach Bluetooth-fähigen Geräten sucht. Hier ist mein Code.

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

} 

Ich lief es in meinem iPhone 5 (iOS 9.3.4). Ich hatte einen Laptop mit Windows, ein Android-Handy, ein iPad Air 2 und mein Mac alle Bluetooth eingeschaltet. Aber keines dieser Geräte wurde entdeckt. centralManagerDidUpdateState Methode wird aufgerufen und das Scannen beginnt, aber das ist es. didDiscoverPeripheral Delegate-Methode wird nie aufgerufen.

Ich wiederholte den Vorgang, diesmal lief es in der iPad Air 2 aber dasselbe Ergebnis.

Wenn ich auf dem Gerät in das Bluetooth-Menü gehe, sehe ich, dass andere Geräte entdeckt werden.

In einigen SO-Antworten sah ich, dass es in der Hauptwarteschlange laufen würde. So, manager = CBCentralManager(delegate: self, queue: dispatch_get_main_queue()). Aber das hat auch nicht für mich funktioniert.

Ich würde wirklich jede Hilfe zu diesem Thema schätzen.

+4

Sind diese Geräte für einen BLE-Dienst werben? Probieren Sie die LightBlue App aus dem App Store aus und sehen Sie, ob sie etwas entdecken kann. – Paulw11

+0

Ich denke, der Standard ist die Hauptwarteschlange. Sie könnten versuchen, eine eigene Warteschlange mit 'let queue = dispatch_queue_create (" meme ", DISPATCH_QUEUE_SERIAL);' zu erstellen. Ansonsten könntest du versuchen, [LightBlue] (https://itunes.apple.com/us/app/lightblue/id639944780?mt=12) auf deinen Mac zu bekommen und zu sehen, ob er etwas sehen kann. Das Dokument sagt, dass die Suche nach Peripheriegeräten ohne Angabe von Dienstkennungen "nicht empfohlen" ist, aber es sollte trotzdem funktionieren. –

+0

Ich werde +1 @ Paulw11. Bieten Ihre Geräte BLE an? Es ist nicht, weil BLE Werbung für sie macht. Mit anderen Worten, um ein Gerät zu finden, muss ein Gerät sagen, dass es hier ist (werben). Versuchen Sie es mit LightBlue. – Larme

Antwort

1

Ihre anderen Geräte melden wahrscheinlich keinen BLE-Dienst (wie Paulw11 in den Kommentaren erwähnt). Alle von Ihnen erwähnten Geräte werden nur dann als sichtbar angezeigt, wenn sie sich auf der Seite Bluetooth-Einstellungen befinden.

Es gibt Apps für iOS, Android und Windows, die sie über LE werben lassen. Am einfachsten zu verwenden ist LightBlue for iOS. Führen Sie Ihre App auf dem iPhone aus, während das andere iOS-Gerät Werbung macht, und Sie sollten die Werbung sehen. Es kann nützlich sein, einen LE-Anzeigescanner unter Windows oder Android zu installieren, um zu überprüfen, ob LightBlue Werbung macht.

Hinweis Windows-Unterstützung noch nicht Peripheral Rolle für Bluetooth LE, so, obwohl Sie die Anzeige sehen können Sie nicht Lage sein wird, um eine Verbindung herzustellen.

+0

Im Anschluss an die gleiche Frage .... Wie macht LightBlue es? Wenn ich die Dokumentation lese, sollte ich in der Lage sein, beim Starten des Scans "Null" -Parameter zu liefern und alles zu sehen? ... Wie kann LightBlue die Peripherie sehen, aber nicht meinen Code? –