我需要将配对的蓝牙设备(iOS设备)列表与iOS设置中“蓝牙”部分的列表相同,如下图所示。
有可能吗?
您是否看过任何使用此类功能的应用程序?
我尝试过以下方法:
link1,link2,link3,link4,link5,link6
但没有什么能帮我清楚地得到确切的清单。我希望应该有办法实现这一目标。请分享您的经验,帮助我。 谢谢。
答案 0 :(得分:5)
无法从iOS检索配对的外围设备列表。都无法检查特定的外围设备是否配对。
您需要考虑两种情况:
外围设备可能已在系统中连接(iOS会自动与某些外围设备连接,以便例如显示电池电量)。在这种情况下,外围设备将无法广播,并且无法使用scanForPeripherals
进行检测。
外围设备已配对,但已断开连接。在这种情况下,retrieveConnectedPeripherals(withServices:)
不起作用。
因此,要检索外围设备,您需要将两者结合起来。首先,您需要检查它是否在retrieveConnectedPeripherals(withServices:)
返回的外围设备中。如果没有,您应该scanForPeripherals
。
如果要检索超出范围的外围设备,则可以尝试使用retrievePeripherals(withIdentifiers:)
,但是它也可能返回未配对的设备,并且它依赖于外围设备的UUID
,之后必须保存配对。
有一种检测特定外围设备是否配对的方法。您需要尝试读取受保护的特征(这需要加密-绑定)。如果收到预期的数据,则表示用户接受了配对请求。否则,您将收到空响应或无响应。
您可以在我的文章中阅读有关蓝牙的更多信息:
答案 1 :(得分:1)
如果只有广告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应用程序获取BLE设备广告UUID,例如LightBlue和nRFConnect
答案 2 :(得分:0)
如果您在MFi设备中使用经典蓝牙,则可以使用ShowBluetoothAccessoryPicker
。
下面的代码是C#,但您可以轻松地将其转换为IOS(快速对象c)
EAAccessoryManager.SharedAccessoryManager.ShowBluetoothAccessoryPicker(null, completion: ((Foundation.NSError error) => {
Console.WriteLine("My callback");
if (error != null && (uint)error.Code != (uint)EABluetoothAccessoryPickerError.AlreadyConnected)
{
Console.WriteLine(String.Format("Error code: {0} Desc: {1}", error.Code, error.DebugDescription));
Console.WriteLine("Failed? " + EABluetoothAccessoryPickerError.Failed.ToString());
Console.WriteLine("Failed? " + Convert.ToInt64(EABluetoothAccessoryPickerError.Failed));
}
}));
答案 3 :(得分:-1)
您需要找到您感兴趣的服务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]];
}
}