using Windows.Devices.Bluetooth.GenericAttributeProfile;
namespace BluetoothLENet.Classes
{
///
/// Represents the display of an attribute - both characteristics and services.
///
public class BluetoothLEAttributeDisplay
{
public GattCharacteristic characteristic;
public GattDescriptor descriptor;
public GattDeviceService service;
public BluetoothLEAttributeDisplay(GattDeviceService service)
{
this.service = service;
AttributeDisplayType = AttributeType.Service;
}
public BluetoothLEAttributeDisplay(GattCharacteristic characteristic)
{
this.characteristic = characteristic;
AttributeDisplayType = AttributeType.Characteristic;
}
public string Chars => (CanRead ? "R" : " ") + (CanWrite ? "W" : " ") + (CanNotify ? "N" : " ");
public bool CanRead
{
get
{
return characteristic != null ? characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Read) : false;
}
}
public bool CanWrite
{
get
{
return characteristic != null ?
characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Write) ||
characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.WriteWithoutResponse) ||
characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.ReliableWrites) ||
characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.WritableAuxiliaries)
: false;
}
}
public bool CanNotify
{
get
{
return characteristic != null ? characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Notify) : false;
}
}
public string Name
{
get
{
switch (AttributeDisplayType)
{
case AttributeType.Service:
if (IsSigDefinedUuid(service.Uuid))
{
if (Enum.TryParse(Utilities.ConvertUuidToShortId(service.Uuid).ToString(), out GattNativeServiceUuid serviceName))
{
return serviceName.ToString();
}
}
else
{
return "Custom Service: " + service.Uuid;
}
break;
case AttributeType.Characteristic:
if (IsSigDefinedUuid(characteristic.Uuid))
{
if (Enum.TryParse(Utilities.ConvertUuidToShortId(characteristic.Uuid).ToString(), out GattNativeCharacteristicUuid characteristicName))
{
return characteristicName.ToString();
}
}
else
{
if (!string.IsNullOrEmpty(characteristic.UserDescription))
{
return characteristic.UserDescription;
}
else
{
return "Custom Characteristic: " + characteristic.Uuid;
}
}
break;
default:
break;
}
return "Invalid";
}
}
public AttributeType AttributeDisplayType { get; }
///
/// The SIG has a standard base value for Assigned UUIDs. In order to determine if a UUID is SIG defined,
/// zero out the unique section and compare the base sections.
///
/// The UUID to determine if SIG assigned
///
private static bool IsSigDefinedUuid(Guid uuid)
{
var bluetoothBaseUuid = new Guid("00000000-0000-1000-8000-00805F9B34FB");
var bytes = uuid.ToByteArray();
// Zero out the first and second bytes
// Note how each byte gets flipped in a section - 1234 becomes 34 12
// Example Guid: 35918bc9-1234-40ea-9779-889d79b753f0
// ^^^^
// bytes output = C9 8B 91 35 34 12 EA 40 97 79 88 9D 79 B7 53 F0
// ^^ ^^
bytes[0] = 0;
bytes[1] = 0;
var baseUuid = new Guid(bytes);
return baseUuid == bluetoothBaseUuid;
}
}
}