Получить IOBluetoothDevice * от CBPeripheral * (Mac OS X)

Мне интересно, есть ли способ, которым я могу получить IOBluetoothDevice * объект из CBPeripheral * объект, потому что я делаю продвинутый каркас контроллера Bluetooth (его будет основываться на IOBluetooth) и я использую его, так что сканируйте Bluetooth Classic а также Bluetooth Low Energy устройства. Вот некоторые из проблем:

  1. IOBluetooth позволяет искать обе сети, но по какой-то причине он не показывает все Bluetooth Low Energy Устройства, которые CoreBluetooth является.

  2. Если я использую 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
    }
}
Другие вопросы по тегам