如何在Swift中获取已配对的蓝牙设备列表?

19

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

enter image description here

这是否可能?
您是否见过任何能够实现此功能的应用程序?

我尝试了以下内容: 链接1链接2链接3链接4链接5链接6

但是没有帮助我清楚地获取准确的列表。我希望应该有一种方法可以实现此目标。请通过分享您的经验来帮助我。 谢谢。


1
您可以检索已配对/连接的BLE设备的详细信息,但无法检索传统设备(如耳机/免提设备)的详细信息。 - Paulw11
好的,谢谢。 你能为我提供工作解决方案的指导,以制作已配对/连接的BLE设备列表吗? - Ashok
@Paulw11 我也很感兴趣,因为我不知道有没有列出断开设备的API。对于已连接的设备,可以使用 - retrieveConnectedPeripheralsWithServices: API。 - allprog
@allprog。关于成对(但目前没有连接)的设备,有什么想法吗? - Ashok
我在iOS设备上遇到了一个关于蓝牙的不同情况,发布在http://apple.stackexchange.com/q/222238/61860。有什么想法吗? - Ashok
显示剩余6条评论
3个回答

20

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

检索已配对的外围设备

有两种情况需要考虑:

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

  2. 外围设备已配对,但未连接。在这种情况下,retrieveConnectedPeripherals(withServices:)将无法工作。

因此,要检索您的外围设备,您需要结合这两个方面。首先,您需要检查它是否在从retrieveConnectedPeripherals(withServices:)返回的外围设备中。如果没有,您应该使用scanForPeripherals

如果您想检索超出范围的外围设备,则可以尝试使用retrievePeripherals(withIdentifiers:),但它也可能返回未配对的设备,并且依赖于外围设备的UUID,您必须在配对后保存。

检测外围设备是否已配对

有一种方法可以检测特定外围设备是否已配对。您需要尝试从受保护的特征(需要加密 - 绑定)中读取数据。如果收到预期的数据,则表示用户接受了配对请求。否则,您将收到空响应或无响应。

参考资料

您可以在我的文章中阅读更多关于蓝牙的信息:


0

如果您正在将经典蓝牙连接到MFi设备上,可以使用ShowBluetoothAccessoryPicker

https://developer.apple.com/documentation/externalaccessory/eaaccessorymanager/1613913-showbluetoothaccessorypicker

下面的代码是C#语言编写的,但你可以很容易地将其转换为IOS(Objective-C或Swift)语言。
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));
                }
            }));

-2

你需要找到你感兴趣的服务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]];
    }
}

我只需要成对的列表,仅名称对我来说就足够了。我需要使用哪个UUID? - Ashok
请注意,您不能仅通过UUID来区分设备。 - Zimano
你不能简单地获取设备,你需要拥有你感兴趣的服务UUID。 - manish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接