【问题标题】:Scan any Bluetooth Devices on iOS扫描 iOS 上的任何蓝牙设备
【发布时间】:2017-09-05 23:37:26
【问题描述】:

我只想获取我周围所有蓝牙设备的列表,但 CoreBluetooth 仅显示低功耗蓝牙 (4.0.

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

有解决办法吗?

【问题讨论】:

    标签: ios swift bluetooth


    【解决方案1】:

    您要做的是扫描您所在地区的所有CBPeripheralCBPeripheral 是对外围设备可能通告的任何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(s) 的名称即可。您可以通过CBCentralManagerDelegate 方法didDiscover peripheral: CBPeripheral 来做到这一点。

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

    【讨论】:

    • 基本上可以工作,只是它一遍又一遍地发现相同的设备。
    • 应用在后台时也能扫描所有蓝牙设备吗?对于我的用例,我想在特定时间间隔后扫描所有可用的
    【解决方案2】:
    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
    }
    

    【讨论】:

      【解决方案3】:

      我是这样使用的,连接按钮点击事件并使用CBCentralManagerDelegate, CBPeripheralDelegateDelegate

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

      【讨论】:

      • 这里的 BEAN_NAME 是任何默认名称或设备名称
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多