【发布时间】:2017-09-05 23:37:26
【问题描述】:
我只想获取我周围所有蓝牙设备的列表,但 CoreBluetooth 仅显示低功耗蓝牙 (4.0.
我不想连接到设备,只是显示其名称。
有解决办法吗?
【问题讨论】:
我只想获取我周围所有蓝牙设备的列表,但 CoreBluetooth 仅显示低功耗蓝牙 (4.0.
我不想连接到设备,只是显示其名称。
有解决办法吗?
【问题讨论】:
您要做的是扫描您所在地区的所有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(s) 的名称即可。您可以通过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, 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)
}
}
【讨论】: