diff --git a/src/Linux.Bluetooth/Constants/BluezConstants.cs b/src/Linux.Bluetooth/Constants/BluezConstants.cs new file mode 100644 index 0000000..3f42f31 --- /dev/null +++ b/src/Linux.Bluetooth/Constants/BluezConstants.cs @@ -0,0 +1,18 @@ +namespace Linux.Bluetooth +{ + public static class BluezConstants + { + public const string DbusService = "org.bluez"; + + public const string AdapterInterface = "org.bluez.Adapter1"; + public const string BatteryInterface = "org.bluez.Battery1"; + public const string DeviceInterface = "org.bluez.Device1"; + public const string GattServiceInterface = "org.bluez.GattService1"; + public const string GattManagerInterface = "org.bluez.GattManager1"; + public const string GattCharacteristicInterface = "org.bluez.GattCharacteristic1"; + public const string GattDescriptorInterface = "org.bluez.GattDescriptor1"; + public const string LeAdvertisementInterface = "org.bluez.LEAdvertisement1"; + public const string LeAdvertisingManagerInterface = "org.bluez.LEAdvertisingManager1"; + } + +} diff --git a/src/Linux.Bluetooth/Constants.cs b/src/Linux.Bluetooth/Constants/GattConstants.cs similarity index 63% rename from src/Linux.Bluetooth/Constants.cs rename to src/Linux.Bluetooth/Constants/GattConstants.cs index 3cf067c..bf343c0 100644 --- a/src/Linux.Bluetooth/Constants.cs +++ b/src/Linux.Bluetooth/Constants/GattConstants.cs @@ -1,45 +1,34 @@ -namespace Linux.Bluetooth -{ - public static class BluezConstants - { - public const string DbusService = "org.bluez"; - public const string AdapterInterface = "org.bluez.Adapter1"; - public const string DeviceInterface = "org.bluez.Device1"; - public const string GattServiceInterface = "org.bluez.GattService1"; - public const string GattManagerInterface = "org.bluez.GattManager1"; - public const string GattCharacteristicInterface = "org.bluez.GattCharacteristic1"; - public const string GattDescriptorInterface = "org.bluez.GattDescriptor1"; - public const string LeAdvertisementInterface = "org.bluez.LEAdvertisement1"; - public const string LeAdvertisingManagerInterface = "org.bluez.LEAdvertisingManager1"; - } - - // https://www.bluetooth.com/specifications/gatt/ - - public static class GattConstants - { - //// Device Information - - public const string DeviceInformationServiceUUID = "0000180a-0000-1000-8000-00805f9b34fb"; - public const string ModelNameCharacteristicUUID = "00002a24-0000-1000-8000-00805f9b34fb"; - public const string ManufacturerNameCharacteristicUUID = "00002a29-0000-1000-8000-00805f9b34fb"; - - //// Current Time - - public const string CurrentTimeServiceUUID = "00001805-0000-1000-8000-00805f9b34fb"; - public const string CurrentTimeCharacteristicUUID = "00002a2b-0000-1000-8000-00805f9b34fb"; - - // Battery Service - // BlueZ presents this service a separate interface, Battery1. - // public const string BatteryServiceUUID = "0000180f-0000-1000-8000-00805f9b34fb"; - // public const string BatteryLevelCharacteristicUUID = "00002a19-0000-1000-8000-00805f9b34fb"; - - // Apple Notification Center Service (ANCS) - // https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Introduction/Introduction.html - public const string ANCServiceUUID = "7905f431-b5ce-4e99-a40f-4b1e122d00d0"; - - // TODO: Lowercase these. - public const string ANCSNotificationSourceUUID = "9FBF120D-6301-42D9-8C58-25E699A21DBD"; - public const string ANCSControlPointUUID = "69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9"; - public const string ANCSDataSourceUUID = "22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB"; - } -} +namespace Linux.Bluetooth.Constants +{ + /// + /// GATT Constants based on, https://www.bluetooth.com/specifications/gatt/ + /// + public static class GattConstants + { + //// Device Information + + public const string DeviceInformationServiceUUID = "0000180a-0000-1000-8000-00805f9b34fb"; + public const string ModelNameCharacteristicUUID = "00002a24-0000-1000-8000-00805f9b34fb"; + public const string ManufacturerNameCharacteristicUUID = "00002a29-0000-1000-8000-00805f9b34fb"; + + //// Current Time + + public const string CurrentTimeServiceUUID = "00001805-0000-1000-8000-00805f9b34fb"; + public const string CurrentTimeCharacteristicUUID = "00002a2b-0000-1000-8000-00805f9b34fb"; + + // Battery Service + // BlueZ presents this service a separate interface, Battery1. + // public const string BatteryServiceUUID = "0000180f-0000-1000-8000-00805f9b34fb"; + // public const string BatteryLevelCharacteristicUUID = "00002a19-0000-1000-8000-00805f9b34fb"; + + // Apple Notification Center Service (ANCS) + // https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Introduction/Introduction.html + public const string ANCServiceUUID = "7905f431-b5ce-4e99-a40f-4b1e122d00d0"; + + // TODO: Lowercase these. + public const string ANCSNotificationSourceUUID = "9FBF120D-6301-42D9-8C58-25E699A21DBD"; + + public const string ANCSControlPointUUID = "69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9"; + public const string ANCSDataSourceUUID = "22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB"; + } +} diff --git a/src/Linux.Bluetooth/Extensions/DeviceExtensions.cs b/src/Linux.Bluetooth/Extensions/DeviceExtensions.cs index c23ddd5..24dec0b 100644 --- a/src/Linux.Bluetooth/Extensions/DeviceExtensions.cs +++ b/src/Linux.Bluetooth/Extensions/DeviceExtensions.cs @@ -8,6 +8,26 @@ namespace Linux.Bluetooth.Extensions { public static class DeviceExtensions { + /// Get battery information for the + /// Device object. + /// + /// var battery = await device.GetBatteryAsync(); + /// var percentage = await battery.GetPercentageAsync(); + /// + /// Battery or null if unavailable. + public static async Task GetBatteryAsync(this IDevice1 device) + { + try + { + // TODO: Create Battery class with OnPropertyChanges for event notification subscriptions + return await GetBatteryInternalAsync(BluezConstants.BatteryInterface, device); + } + catch + { + return null; + } + } + /// Get a GATT Service with the supplied Service UUID. /// Device object. /// UUID of the Service. @@ -33,7 +53,7 @@ public static async Task GetServiceAsync(this IDevice1 device, st /// Collection of Gatt Services. public static Task> GetServicesAsync(this IDevice1 device) { - return BlueZManager.GetProxiesAsync(BluezConstants.GattServiceInterface, device); + return BlueZManager.GetProxiesAsync(BluezConstants.GattServiceInterface, device); } /// Wait for Device's Property and specified value to resolve. @@ -104,5 +124,14 @@ private static (Task, IDisposable) WaitForPropertyValueInternal(IDevice1 obj, return (taskSource.Task, watcher); } + + private static async Task GetBatteryInternalAsync(string batteryInterface, IDevice1 device) + { + var battery = await Task.Run(() => + Connection.System.CreateProxy(BluezConstants.DbusService, device.ObjectPath) + ); + + return battery; + } } }