可以为 iOS 生成连接的蓝牙设备列表吗?
Posted
技术标签:
【中文标题】可以为 iOS 生成连接的蓝牙设备列表吗?【英文标题】:Possible to generate a list of connected bluetooth devices for iOS? 【发布时间】:2015-08-18 15:20:57 【问题描述】:我正在尝试确定哪些设备通过 ios 中的蓝牙连接,但似乎无法弄清楚。理想情况下,我想生成一个连接的蓝牙设备列表。
我尝试过使用“retrieveConnectedPeripheralsWithServices”,但这需要搜索特定的服务。我想生成所有连接的蓝牙设备的列表,而不仅仅是特定服务的蓝牙设备。有没有办法只搜索所有服务而不遍历所有可能的服务?
有什么想法吗?
【问题讨论】:
蓝牙还是低功耗蓝牙? ExternalAccessory.framework(适用于经典蓝牙 MFi 兼容)可以为您提供已连接设备的列表。 对不起,应该提到它是 BLE 【参考方案1】:iOS 解决方案:
(谢谢拉尔姆)
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 的代码 sn-p
NSArray *devices = [IOBluetoothDevice pairedDevices];
对于alan478的BLE问题:
Core Bluetooth 框架提供了 iOS 和 Mac 应用程序与配备蓝牙低功耗无线技术的设备通信所需的类。你可以看看这个教程:
http://www.raywenderlich.com/52080/introduction-core-bluetooth-building-heart-rate-monitor
BLE 代码 sn-p 是:
// 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: 方法。
还有这条评论:
“认为 Apple 禁止这件事。我们只能获取具有特定 CBUUID 的设备列表。因此,如果您想列出所有设备(与本机蓝牙设置相同),那么这是不可能的。如果我请纠正我我错了。- Mrug 3 月 11 日 13:24"
在这个问题下:
How to get list of available Bluetooth devices?
斯威夫特 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。 感谢您的帮助。我应该提到它是针对 BLE 的。 BLE有类似的方法吗?我实际上想要做的是重新创建 iOS 蓝牙菜单(在设置 > 蓝牙中找到),但仅适用于连接的设备。 不客气 alan478,我只是为 BLE 添加了一个代码 sn-p 和详细的教程链接,希望它对您的情况有用。 alan478 解决了你的问题吗? Gyer,感谢您的所有帮助和指导,但仍在为此苦苦挣扎...这似乎是在特定应用程序中使用蓝牙的好方法(搜索、发现、连接等)。 ) 但有什么方法可以生成已经连接到 iOS 设备的设备列表,即查找通过设置 > 蓝牙连接的设备?我感兴趣的设备可能已经连接。有没有办法通过我们自己的应用程序与那些系统连接的设备进行交互?【参考方案2】:有两种情况需要考虑:
系统中可能已经连接了外围设备(iOS 会自动连接一些外围设备,例如显示 电池电量)。在这种情况下,外围设备不会广播并且 使用 scanForPeripherals 检测将不起作用。
外设已配对,但已断开连接。在这种情况下,retrieveConnectedPeripherals(withServices:) 将不起作用。
因此,要检索您的外围设备,您需要将两者结合起来。首先,您需要检查它是否在从retrieveConnectedPeripherals(withServices:) 返回的外围设备中。如果不是,您应该 scanForPeripherals。
如果您想检索超出范围的外围设备,您可以尝试使用retrievePeripherals(withIdentifiers:),但是它也可能返回未配对的设备,并且它依赖于您必须在配对后保存的外围设备的UUID。
检测外围设备是否配对 有一种方法可以检测特定外围设备是否已配对。您需要尝试从受保护的特征(需要加密 - 绑定)中读取。如果您收到预期的数据,则表示用户接受了配对请求。否则,您将收到空响应或没有响应。
【讨论】:
以上是关于可以为 iOS 生成连接的蓝牙设备列表吗?的主要内容,如果未能解决你的问题,请参考以下文章
IOS 蓝牙 LE 扫描设备未添加到 uitableview