首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IOBluetoothDevice * (Mac )获取CBPeripheral *

从IOBluetoothDevice * (Mac )获取CBPeripheral *
EN

Stack Overflow用户
提问于 2018-03-07 04:33:21
回答 2查看 653关注 0票数 0

我想知道是否有一种方法可以从一个IOBluetoothDevice *对象中获得一个CBPeripheral *对象,因为我正在制作一个高级蓝牙控制器框架(它将基于IOBluetooth),并且我正在使用它来扫描Bluetooth ClassicBluetooth Low Energy设备。以下是一些问题:

  1. IOBluetooth确实允许您搜索这两个网络,但出于某种原因,它没有显示CoreBluetooth的所有Bluetooth Low Energy设备。
  2. 如果我使用CoreBluetooth搜索Bluetooth Low Energy设备,我将无法获得以后使用所需的地址。

那么,有什么方法可以从IOBluetoothDevice中获取CBPeripheral对象呢?

谢谢:D

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-20 06:27:44

我发现我可以通过/Library/Preferences/com.apple.bluetooth.plist > CoreBluetoothCache搜索,它恰好包含UUID及其字典DeviceAddress = address ;)。

因此,我可以使用该方法获得CBPeripheral的UUID。

代码语言:javascript
复制
NSString *uuid = [[<*CBPeripheral*> identifier] UUIDString]; 

然后在属性列表中查找

代码语言:javascript
复制
NSDicionary *btdict = [NSDictionary dictionaryWithContentsOfFile:@"/Library/Preferences/com.apple.bluetooth.plist"];
NSDictionary *bleDevices = [btDict objectForKey:@"CoreBluetoothCache"];
NSString *address = [[bleDevices objectForKey:uuid] objectForKey:@"DeviceAddress"];

然后使用该地址创建一个新的IOBluetoothDevice:

代码语言:javascript
复制
IOBluetoothDevice *device = [IOBluetoothDevice deviceWithAddressString:address];

就这么简单:D

票数 4
EN

Stack Overflow用户

发布于 2021-02-06 14:55:31

Swift 5.3解决方案:

代码语言:javascript
复制
fileprivate func getDeviceAddress(for cbPeripheral: CBPeripheral) -> String?
{
    if let userDefaults = UserDefaults(suiteName: "/Library/Preferences/com.apple.Bluetooth")
   {
        if  let coreBluetoothCache = userDefaults.object(forKey: "CoreBluetoothCache") as? [String : Any]
        {
            if let deviceData = coreBluetoothCache[cbPeripheral.identifier.uuidString] as? [String : Any]
            {
                return deviceData["DeviceAddress"] as? String
            }
        }
    }
        
    return nil
}

用法:

代码语言:javascript
复制
if let deviceAddress = self.getDeviceAddress(for: peripheral)
{
    if let bluetoothDevice = IOBluetoothDevice(addressString: deviceAddress)
    {
        // Do your stuff
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49144183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档