如何获得swift中配对的蓝牙设备列表?
我需要将配对的蓝牙设备(iOS设备)列表与iOS设置中“蓝牙”部分的列表相同,如下图所示。
可能吗?
您是否看过任何使用此类function的应用程序?
我尝试了以下内容: link1 , link2 , link3 , link4 , link5 , link6
但没有什么能帮我清楚地得到确切的清单。 我希望应该有办法实现这一目标。 请分享您的经验,帮助我。 谢谢。
只要您拥有广告UUID,就可以获得配对/连接设备的列表。
dispatch_queue_t centralQueu = dispatch_queue_create("A_NAME", NULL); _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueu options: @{CBCentralManagerOptionRestoreIdentifierKey:@"RESTORE_KEY", CBCentralManagerOptionShowPowerAlertKey: @YES}]; _ServiceUUIDs = @[[CBUUID UUIDWithString:@"THE_UUID"]] //the array of CBUUIDs which you are looking for [_centralManager retrieveConnectedPeripheralsWithServices:_ServiceUUIDs]
您可以使用一些iOS应用程序(例如LightBlue和nRFConnect)获取BLE设备广告UUID
无法从iOS检索配对的外围设备列表。 无论是否可以检查特定外设是否配对。
检索配对的外围设备
您需要考虑两种情况:
-
外围设备可能已连接到系统中(iOS会自动连接某些外围设备,以便显示电池电量)。 在这种情况下,外围设备将不会进行广播,并且使用
scanForPeripherals
检测将无法正常工作。 -
外围设备已配对,但已断开连接。 在这种情况下,
retrieveConnectedPeripherals(withServices:)
将不起作用。
因此,要检索外围设备,您需要将两者结合起来。 首先,您需要检查它是否位于从retrieveConnectedPeripherals(withServices:)
返回的外设中。 如果没有,你应该scanForPeripherals
。
如果要检索超出范围的外围设备,可以尝试使用retrievePeripherals(withIdentifiers:)
,但它也可能不返回配对设备,它依赖于配对后必须保存的外围设备UUID
。
检测外围设备是否已配对
有一种方法可以检测特定外设是否配对。 您需要尝试从受保护的特性(需要加密 – 绑定)中读取。 如果您收到预期数据,则表示用户接受了配对请求。 否则您将收到空响应或无响应。
参考
您可以在我的文章中阅读有关蓝牙的更多信息
- 原始答案
- Swift – 使用流量控制器的蓝牙低功耗通信
- 如何与iOS上的蓝牙低功耗设备进行通信
- 蓝牙低功耗 – iOS上的后台模式
您需要找到您感兴趣的服务UUID,在我的情况下它完美地工作,
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:SERVICE_UUID]] options:options];
当它找到任何宣传相同服务UUID的设备时,它将出现在你上面指出的屏幕上。
以这种方式处理didDiscoverperipherel:
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{ _discoveredPeripheral = peripheral; if(![self.mRemoteDevices containsObject:_discoveredPeripheral]) { NSArray *peripherels = [self.centralManager retrievePeripheralsWithIdentifiers:@[_discoveredPeripheral.identifier]]; [self.mRemoteDevices addObject:[peripherels objectAtIndex:0]]; } }