Получить IOBluetoothDevice * от CBPeripheral * (Mac OS X)
Мне интересно, есть ли способ, которым я могу получить IOBluetoothDevice *
объект из CBPeripheral *
объект, потому что я делаю продвинутый каркас контроллера Bluetooth (его будет основываться на IOBluetooth
) и я использую его, так что сканируйте Bluetooth Classic
а также Bluetooth Low Energy
устройства. Вот некоторые из проблем:
IOBluetooth
позволяет искать обе сети, но по какой-то причине он не показывает всеBluetooth Low Energy
Устройства, которыеCoreBluetooth
является.Если я использую
CoreBluetooth
искатьBluetooth Low Energy
Устройства Я не смогу получить адрес, который мне нужен для дальнейшего использования.
Так есть ли способ получить IOBluetoothDevice
объект из CBPeripheral
?
Спасибо
2 ответа
Я узнал, что могу искать через /Library/Preferences/com.apple.bluetooth.plist > CoreBluetoothCache
который просто содержит UUID и в своем словаре DeviceAddress
= адрес;).
так что я могу получить UUID CBPeripheral
используя метод
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
}
}