扫描任何蓝牙设备在iOS

问题描述:

我只想得到周围的任何蓝牙设备列表,但CoreBluetooth只显示蓝牙低功耗(4.0。扫描任何蓝牙设备在iOS

我不想连接到设备,只是显示其名称。

是否有解决方案做到这一点?

你想要做的是为您扫描区域内所有CBPeripheral什么。CBPeripheral是确实的广播任何CBService的类(s)外设可能做广告。

要扫描这些外设,您需要一个CBCentralManager的实例。 CBCentralManager是您的外围设备扫描的类。

要做到这一点,你必须实例化CBCentralManager

centralManager = CBCentralManager(delegate: self, queue: .main) 

一个好主意是在扫描前外设告诉你CBCentralManager,你只需要寻找独特的外设只有一次。

let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey: 
           NSNumber(value: false)] 

当你告诉你的CBCentralManager扫描,不指定广告CBPeripheral(S)的任何服务。反而通过nil这个参数来表明你想发现所有的外设。

centralManager?.scanForPeripherals(withServices: nil, options: options) 

上述调用将开始实际扫描该区域的蓝牙设备。您将在扫描结果中收到CBCentralManagerDelegate方法中的回调。


为了让蓝牙设备,简单的看一下所发现的CBPeripheral(一个或多个)的名称的名称。您通过CBCentralManagerDelegate方法didDiscover peripheral: CBPeripheral来完成此操作。

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
    print("Discovered \(peripheral.name ?? "")") 
} 

if (!_centralManager) { 
     dispatch_queue_t queue = dispatch_get_main_queue(); 
     _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:queue options:@{CBCentralManagerOptionShowPowerAlertKey:@YES}]; 
     [_centralManager setDelegate:self]; 
    } 

//found BLE 
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
{ 
    //Array add peripheral 
} 

我使用这样的,连接按钮单击事件,并使用CBCentralManagerDelegate, CBPeripheralDelegate代表

func connectDevice(sender:UIButton){ 


       if peripheral != nil { 
        manager.cancelPeripheralConnection(peripheral) 
        manager = CBCentralManager(delegate: self, queue: nil) 
       } 
     } 



func centralManagerDidUpdateState(central: CBCentralManager) { 
     if central.state == CBCentralManagerState.PoweredOn { 
      central.scanForPeripheralsWithServices(nil, options: nil) 
     } else { 
      self.showAlert(Messages().alert , message: "Bluetooth is not on.") 
     } 
    } 



func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { 
     let device = (advertisementData as NSDictionary).objectForKey(CBAdvertisementDataLocalNameKey) as? NSString 
     print(device) 

     if device?.containsString(BEAN_NAME) == true { 
      self.manager.stopScan() 
      self.peripheral = peripheral 
      self.peripheral.delegate = self 
      manager.connectPeripheral(peripheral, options: nil) 
     } 
    }