从 CBPeripheral * (Mac OS X 获取 IOBluetoothDevice *
Get IOBluetoothDevice * from CBPeripheral * (Mac OS X)
我想知道是否有办法从 CBPeripheral *
对象中获取 IOBluetoothDevice *
对象,因为我正在制作一个高级蓝牙控制器框架(它将基于 IOBluetooth
) 并且我正在使用它,所以扫描 Bluetooth Classic
和 Bluetooth Low Energy
设备。以下是一些问题:
IOBluetooth
确实允许您搜索两个网络,但由于某种原因,它没有显示 CoreBluetooth
所在的所有 Bluetooth Low Energy
设备。
如果我使用 CoreBluetooth
搜索 Bluetooth Low Energy
设备,我将无法获得以后需要的地址。
那么有什么方法可以从 CBPeripheral
中获取 IOBluetoothDevice
对象吗?
谢谢 :D
我发现我可以通过 /Library/Preferences/com.apple.bluetooth.plist > CoreBluetoothCache
进行搜索,它恰好包含 UUID 并且在其字典中 DeviceAddress
= 地址 ;)。
所以我可以使用
方法获取 CBPeripheral
的 UUID
NSString *uuid = [[<*CBPeripheral*> identifier] UUIDString];
然后在 属性 列表中查找
NSDicionary *btdict = [NSDictionary dictionaryWithContentsOfFile:@"/Library/Preferences/com.apple.bluetooth.plist"];
NSDictionary *bleDevices = [btDict objectForKey:@"CoreBluetoothCache"];
NSString *address = [[bleDevices objectForKey:uuid] objectForKey:@"DeviceAddress"];
然后使用该地址创建一个新的 IOBluetoothDevice:
IOBluetoothDevice *device = [IOBluetoothDevice deviceWithAddressString:address];
就这么简单:D
Swift 5.3 解决方案:
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
}
用法:
if let deviceAddress = self.getDeviceAddress(for: peripheral)
{
if let bluetoothDevice = IOBluetoothDevice(addressString: deviceAddress)
{
// Do your stuff
}
}
我想知道是否有办法从 CBPeripheral *
对象中获取 IOBluetoothDevice *
对象,因为我正在制作一个高级蓝牙控制器框架(它将基于 IOBluetooth
) 并且我正在使用它,所以扫描 Bluetooth Classic
和 Bluetooth Low Energy
设备。以下是一些问题:
IOBluetooth
确实允许您搜索两个网络,但由于某种原因,它没有显示CoreBluetooth
所在的所有Bluetooth Low Energy
设备。如果我使用
CoreBluetooth
搜索Bluetooth Low Energy
设备,我将无法获得以后需要的地址。
那么有什么方法可以从 CBPeripheral
中获取 IOBluetoothDevice
对象吗?
谢谢 :D
我发现我可以通过 /Library/Preferences/com.apple.bluetooth.plist > CoreBluetoothCache
进行搜索,它恰好包含 UUID 并且在其字典中 DeviceAddress
= 地址 ;)。
所以我可以使用
方法获取CBPeripheral
的 UUID
NSString *uuid = [[<*CBPeripheral*> identifier] UUIDString];
然后在 属性 列表中查找
NSDicionary *btdict = [NSDictionary dictionaryWithContentsOfFile:@"/Library/Preferences/com.apple.bluetooth.plist"];
NSDictionary *bleDevices = [btDict objectForKey:@"CoreBluetoothCache"];
NSString *address = [[bleDevices objectForKey:uuid] objectForKey:@"DeviceAddress"];
然后使用该地址创建一个新的 IOBluetoothDevice:
IOBluetoothDevice *device = [IOBluetoothDevice deviceWithAddressString:address];
就这么简单:D
Swift 5.3 解决方案:
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
}
用法:
if let deviceAddress = self.getDeviceAddress(for: peripheral)
{
if let bluetoothDevice = IOBluetoothDevice(addressString: deviceAddress)
{
// Do your stuff
}
}