扫描任何蓝牙设备在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)
}
}