diff --git a/lib/src/models/ble_uuid.dart b/lib/src/models/ble_uuid.dart index 034f238..95a7ba0 100644 --- a/lib/src/models/ble_uuid.dart +++ b/lib/src/models/ble_uuid.dart @@ -1,31 +1,54 @@ -import 'package:bluez/bluez.dart'; - class BleUuid { /// Parse a String to valid UUID and convert a 16 bit UUID to 128 bit UUID /// Throws `FormatException` if the UUID is invalid static String parse(String uuid) { - if (uuid.length < 4) throw const FormatException("Invalid UUID"); + if (uuid.length < 4) { + throw const FormatException('Invalid UUID'); + } + if (uuid.length <= 8) { uuid = "${uuid.padLeft(8, '0')}-0000-1000-8000-00805f9b34fb"; - } else if (!uuid.contains("-")) { + } + + if (!uuid.contains("-")) { if (uuid.length != 32) throw const FormatException("Invalid UUID"); + uuid = "${uuid.substring(0, 8)}-${uuid.substring(8, 12)}" "-${uuid.substring(12, 16)}-${uuid.substring(16, 20)}-${uuid.substring(20, 32)}"; } - return BlueZUUID.fromString(uuid).toString(); + + var groups = uuid.split('-'); + + if (groups.length != 5 || + groups[0].length != 8 || + groups[1].length != 4 || + groups[2].length != 4 || + groups[3].length != 4 || + groups[4].length != 12) { + throw const FormatException('Invalid UUID'); + } + + try { + int.parse(groups[0], radix: 16); + int.parse(groups[1], radix: 16); + int.parse(groups[2], radix: 16); + int.parse(groups[3], radix: 16); + int.parse(groups[4], radix: 16); + } catch (e) { + throw const FormatException('Invalid UUID'); + } + + return uuid.toLowerCase(); } /// Parse 16/32 bit uuid like `0x1800` to 128 bit uuid like `00001800-0000-1000-8000-00805f9b34fb` - static String extend(int short) { - BlueZUUID blueZUUID = BlueZUUID.short(short); - return blueZUUID.toString(); - } + static String extend(int short) => + parse(short.toRadixString(16).padLeft(4, '0')); /// Compare two UUIDs to automatically convert both to 128 bit UUIDs /// Throws `FormatException` if the UUID is invalid - static bool equals(String uuid1, String uuid2) { - return parse(uuid1) == parse(uuid2); - } + static bool equals(String uuid1, String uuid2) => + parse(uuid1) == parse(uuid2); } /// Parse a list of strings to a list of UUIDs diff --git a/test/universal_ble_test.dart b/test/universal_ble_test.dart index 1c8b89e..57ace3f 100644 --- a/test/universal_ble_test.dart +++ b/test/universal_ble_test.dart @@ -20,6 +20,10 @@ void main() { BleUuid.parse('0000180a-0000-1000-8000-00805f9b34fb'), equals("0000180a-0000-1000-8000-00805f9b34fb"), ); + expect( + BleUuid.parse('8000dd00-dd00-ffff-ffff-ffffffffffff'), + equals("8000dd00-dd00-ffff-ffff-ffffffffffff"), + ); // Parse 128-bit uppercase uuid expect( BleUuid.parse('0000180A-0000-1000-8000-00805F9B34FB'),