如何获得swift中配对的蓝牙设备列表?

时间:2016-01-04 13:23:02

标签: ios bluetooth-lowenergy core-bluetooth external-accessory ios-bluetooth

我需要将配对的蓝牙设备(iOS设备)列表与iOS设置中“蓝牙”部分的列表相同,如下图所示。

enter image description here

有可能吗?
您是否看过任何使用此类功能的应用程序?

我尝试过以下方法: link1link2link3link4link5link6

但没有什么能帮我清楚地得到确切的清单。我希望应该有办法实现这一目标。请分享您的经验,帮助我。 谢谢。

4 个答案:

答案 0 :(得分:5)

无法从iOS检索配对的外围设备列表。都无法检查特定的外围设备是否配对。

检索已配对的外围设备

您需要考虑两种情况:

  1. 外围设备可能已在系统中连接(iOS会自动与某些外围设备连接,以便例如显示电池电量)。在这种情况下,外围设备将无法广播,并且无法使用scanForPeripherals进行检测。

  2. 外围设备已配对,但已断开连接。在这种情况下,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,例如LightBluenRFConnect

答案 2 :(得分:0)

如果您在MFi设备中使用经典蓝牙,则可以使用ShowBluetoothAccessoryPicker

https://developer.apple.com/documentation/externalaccessory/eaaccessorymanager/1613913-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]];
    }
}