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.
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
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. –
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