Во-первых, я знаю, что этот вопрос был задан очень много. И я прошел через все из них, пытаясь разрешить это, но безрезультатно.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())
. Но это тоже не сработало.
Я бы очень признателен за любую помощь по этому вопросу.
Есть ли какие-либо из этих устройств, рекламирующих услугу BLE? Попробуйте приложение LightBlue из App Store и посмотрите, может ли он что-нибудь обнаружить. – Paulw11
Я думаю, что по умолчанию основная очередь. Вы можете попробовать создать свою собственную очередь с 'let queue = dispatch_queue_create (" meme ", DISPATCH_QUEUE_SERIAL);'. Кроме этого, вы можете попробовать получить [LightBlue] (https://itunes.apple.com/us/app/lightblue/id639944780?mt=12) на своем Mac и посмотреть, не видит ли он что-либо. Док говорит, что поиск периферийных устройств без указания идентификаторов службы «не рекомендуется», но он все равно должен работать. –
Я буду +1 @ Paulw11. Ваши устройства рекламируют BLE? Это не потому, что BLE - это то, что они рекламируют. Другими словами, чтобы найти устройство, устройство должно сказать, что оно здесь (рекламировать). Поэтому попробуйте LightBlue. – Larme