在iOS上生成已连接蓝牙设备列表是否可行?

14

我试图确定iOS中连接的蓝牙设备,但似乎无法找到。理想情况下,我想生成一个已连接蓝牙设备列表。

我尝试使用“retrieveConnectedPeripheralsWithServices”,但这需要指定要搜索的特定服务。我想生成所有已连接的蓝牙设备列表,而不仅仅是特定服务的蓝牙设备。有没有一种方法可以只搜索所有服务而不必循环遍历所有可能的服务?

有什么想法吗?


1
蓝牙还是低功耗蓝牙?ExternalAccessory.framework(用于经典蓝牙MFi兼容设备)可以提供已连接设备的列表。 - Larme
抱歉,我应该提到这是BLE。 - alan478
2个回答

6

iOS的解决方案:

(感谢Larme)

NSArray *connectedAccessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories]; 

文档:

https://developer.apple.com/library/prerelease/ios/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/index.html#//apple_ref/occ/instp/EAAccessoryManager/connectedAccessories

此外,如果有人需要,这是Mac的文档:

https://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/Bluetooth/BT_Intro/BT_Intro.html

和 Mac 相关的代码片段

NSArray *devices = [IOBluetoothDevice pairedDevices];

对于alan478的BLE问题:
核心蓝牙框架提供了所需的类,使您的iOS和Mac应用程序能够与配备有蓝牙低功耗无线技术的设备通信。您可以查看本教程:

http://www.raywenderlich.com/52080/introduction-core-bluetooth-building-heart-rate-monitor

BLE代码片段如下:

// In this case you need to tell UUID for serching specific device
CBUUID *hrate = [CBUUID UUIDWithString:@"180D"];

// Create a dictionary for passing down to the scan with service method
NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];

// Tell the central manager (cm) to scan for the heart rate service
[cm scanForPeripheralsWithServices:[NSArray arrayWithObject:hrate] options:scanOptions]

请在developer.apple.com上阅读此文档。

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/BestPracticesForInteractingWithARemotePeripheralDevice/BestPracticesForInteractingWithARemotePeripheralDevice.html

这里有一个有趣的段落:

明智地探索外围设备数据 当您开发一个满足特定用例的应用程序时,外围设备可能具有比您感兴趣的服务和特征更多。发现外围设备的所有服务和相关特征可能会对电池寿命和应用程序性能产生负面影响。因此,您应该仅查找和发现应用程序所需的服务和相关特征。

例如,假设您连接到一个可用服务众多的外围设备,但您的应用程序只需要访问其中两个服务。您可以通过将其服务UUID的数组(由CBUUID对象表示)传递给CBPeripheral类的discoverServices:方法,仅查找并发现这两个服务,如下所示:

[peripheral discoverServices:@[firstServiceUUID, secondServiceUUID]];

当你找到了两个感兴趣的服务后,同样可以查找并仅发现你感兴趣的这些服务的特征。再次,只需将标识你想要发现的特征的UUID数组(对于每个服务)传递给CBPeripheral类的discoverCharacteristics:forService:方法即可。
此外,还有这个评论:
“我认为苹果禁止这种事情。我们只能获取具有特定CBUUID的设备列表。因此,如果您想列出所有设备(与蓝牙设置本地执行的操作相同),则不可能。如果我错了,请纠正我。-Mrug Mar 11 at 13:24”
在这个问题下: 如何获取可用蓝牙设备列表? Swift 5.3
EAAccessoryManager.shared().connectedAccessories
let devices = IOBluetoothDevice.pairedDevices()
// In this case you need to tell UUID for serching specific device
let hrate = CBUUID(string: "180D"),
// Create a dictionary for passing down to the scan with service method
let scanOptions = [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(value: false)]
// Tell the central manager (cm) to scan for the heart rate service
cm.scanForPeripherals(withServices: [hrate] as? [CBUUID], options: scanOptions)
peripheral.discoverServices([firstServiceUUID, secondServiceUUID])

问题出现在iOS上,而不是Mac OSX。 - Larme
感谢您的帮助,gyer。我应该提到这是针对BLE的。是否有类似的方法来为BLE执行此操作?我的基本目标是重新创建iOS蓝牙菜单(在“设置>蓝牙”中找到),但仅针对已连接的设备。 - alan478
这解决了你的问题吗,alan478? - mgyky
2
Gyer,我非常感谢您的帮助和指导,但我仍然在这个问题上苦苦挣扎...... 这似乎是一种在特定应用程序中使用蓝牙的好方法(搜索、发现、连接等),但是否有任何方法可以生成一个设备列表,即查找通过“设置”>“蓝牙”连接到iOS设备的设备? 我感兴趣的设备可能已经连通了。 有没有办法通过我们自己的应用程序与那些系统连接的设备进行交互? - alan478
不客气,alan478。我刚刚更新了我的答案,请问你能检查一下我所提到的文档吗? - mgyky
显示剩余5条评论

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

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

因此,要检索外设,您需要同时考虑这两个方面。首先,您需要检查它是否在从retrieveConnectedPeripherals(withServices:)返回的外设中。如果没有,则应该使用scanForPeripherals进行扫描。
如果您想检索超出范围的外设,可以尝试使用retrievePeripherals(withIdentifiers:),但它也可能返回未配对的设备,并且依赖于外设的UUID,您必须在配对后保存它。 检测外设是否已配对 有一种方法可以检测特定外设是否已配对。您需要尝试从受保护的特征读取数据(需要加密-绑定)。如果收到预期的数据,这意味着用户接受了配对请求。否则,您将收到空响应或无响应。

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