Service UUID es un identificador único de 16 o 128 bits de Bluetooth Low Energy (BLE) que define inequívocamente un servicio funcional en un dispositivo. Bluetooth SIG ha asignado UUID estándar de 16 bits para servicios comunes como Battery Service (0x180F), Device Information (0x180A) y Heart Rate (0x180D), simplificando la compatibilidad multiplataforma. Según la Bluetooth Core Specification 5.4 (2023), los servicios personalizados de desarrolladores externos deben usar UUID de 128 bits, cuyo formato garantiza la unicidad global sin un registro central. La declaración correcta de Service UUID es el primer paso para el funcionamiento correcto del servidor GATT en un dispositivo periférico.
Puntos clave
Service UUID es un identificador asignado a un servicio GATT de Bluetooth Low Energy para su reconocimiento inequívoco por otros dispositivos. En la arquitectura BLE, cada servicio representa un grupo lógico de características unidas por una función común. Por ejemplo, Battery Service contiene la característica Battery Level, que transmite la carga actual de la batería.
Bluetooth SIG (Special Interest Group) gestiona el registro de UUID de 16 bits estándar asignados a los servicios más comunes. Esto permite que dispositivos de diferentes fabricantes reconozcan los servicios entre sí sin configuración previa. Un rastreador de fitness de cualquier marca puede declarar Heart Rate Service con UUID 0x180D, y cualquier teléfono inteligente entenderá que es un servicio de frecuencia cardíaca.
Según Bluetooth Core Specification 5.4 (2023), el rango de UUID de 16 bits (0x0000–0xFFFF) se divide en dos partes: de 0x0001 a 0xFFFE son servicios estándar de Bluetooth SIG, y 0xFFFF está reservado. Si un desarrollador necesita un servicio único que no esté en el registro SIG, usa un UUID de 128 bits.
La diferencia entre UUID estándar y personalizado no solo está en la longitud: los UUID de 16 bits ahorran tiempo de transmisión en el paquete de publicidad, ya que se transmiten como 2 bytes en lugar de 16 bytes. Para dispositivos con restricciones estrictas de tamaño del paquete de publicidad (hasta 31 bytes), esto es crítico.
Los UUID estándar de 16 bits cubren las principales categorías de dispositivos BLE: sensores médicos, rastreadores de fitness, electrónica portátil y accesorios. Si un dispositivo implementa una función estándar, se recomienda al desarrollador usar el UUID correspondiente del registro Bluetooth SIG para la máxima compatibilidad.
Aquí hay algunos ejemplos de UUID de servicio estándar:
| UUID (hex) | Nombre del servicio | Propósito |
|---|---|---|
| 0x1800 | Generic Access | Control de acceso, nombre del dispositivo, apariencia |
| 0x180A | Device Information | Fabricante, modelo, número de serie, versión de firmware |
| 0x180D | Heart Rate | Medición de pulso, ubicación del sensor, energía de la batería |
| 0x180F | Battery Service | Nivel de carga de la batería en porcentaje |
| 0x181A | Environmental Sensing | Temperatura, humedad, presión, iluminancia |
| 0x181C | User Data | Edad, peso, altura, sexo, pulso en reposo |
Los UUID personalizados de 128 bits son necesarios cuando un dispositivo proporciona una funcionalidad única. Por ejemplo, un fabricante de cerraduras inteligentes crea su propio servicio Lock Control con un UUID como XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Dicho UUID no entrará en conflicto con otros servicios, ya que el espacio de valores de 128 bits es prácticamente inagotable.
Un UUID de 128 bits se escribe en el formato estándar UUID RFC 4122: ocho caracteres hexadecimales, guión, cuatro, guión, cuatro, guión, cuatro, guión, doce caracteres. Para BLE se usa una versión donde la parte base del UUID de Bluetooth SIG tiene bits fijos.
Bluetooth SIG define el UUID base: 0000XXXX-0000-1000-8000-00805F9B34FB. Para servicios estándar de 16 bits, el valor del UUID se sustituye en esta máscara: por ejemplo, 0x180F se convierte en 0000180F-0000-1000-8000-00805F9B34FB. Los servicios personalizados usan un UUID completamente independiente generado por el desarrollador.
Al crear un UUID personalizado, puede usar cualquier generador de UUID (UUID v4). Un UUID v4 aleatorio proporciona 122 bits de entropía, lo que hace que las colisiones sean prácticamente imposibles. No use una versión modificada del UUID base de Bluetooth SIG para servicios personalizados: esto viola la especificación.
Declarar un servicio con un UUID se realiza en el lado Peripheral al crear un servidor GATT. En iOS se usa Core Bluetooth, en Android android.bluetooth.le. Veamos ambos enfoques.
En Swift, un servicio se crea mediante CBMutableService especificando el UUID, después se le agregan características mediante CBMutableCharacteristic.
import CoreBluetooth
// Standard 16-bit UUID
let batteryServiceUUID = CBUUID("180F")
// Custom 128-bit UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Add characteristics
service.characteristics = [characteristic]
// Publish service via peripheralManager
peripheralManager.add(service)
En Android, el servicio se registra a través de BluetoothGattServer y BluetoothGattService. El UUID se pasa como cadena mediante java.util.UUID.fromString.
import android.bluetooth.*;
// Custom service UUID
private static final UUID CUSTOM_SERVICE_UUID =
UUID.fromString("E20A39F4-73F5-4BC4-A12F-17D1AD07A961");
BluetoothGattService service = new BluetoothGattService(
CUSTOM_SERVICE_UUID,
BluetoothGattService.SERVICE_TYPE_PRIMARY
);
// Add characteristics
service.addCharacteristic(characteristic);
// Register on GATT server
gattServer.addService(service);
El escaneo por Service UUID permite que el Central encuentre dispositivos que proporcionan el servicio necesario sin conectarse a todos los Peripherals descubiertos. Un paquete de publicidad BLE puede contener una lista de UUID de servicios, lo que permite al Central filtrar dispositivos en la etapa de escaneo.
En iOS, CBCentralManager escanea dispositivos con un filtro por UUID de servicio. Esto reduce el consumo de energía y acelera la detección de los dispositivos necesarios.
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegate receives only Heart Rate Service devices
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral has only devices with UUID 0x180D
}
En Android, el filtrado por UUID también se admite mediante ScanFilter.Builder. Esta es una forma eficiente de reducir la búsqueda sin conectarse a cada dispositivo.
import android.bluetooth.le.*;
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(
new ParcelUuid(
UUID.fromString("0000180D-0000-1000-8000-00805F9B34FB")
)
)
.build();
BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
scanner.startScan(
Collections.singletonList(filter),
scanSettings,
scanCallback
);
Un único dispositivo BLE puede declarar varios servicios simultáneamente. Por ejemplo, una pulsera de fitness puede contener Battery Service (0x180F), Heart Rate Service (0x180D) y un servicio personalizado para sincronizar datos con la nube. Cada servicio tiene su propio UUID y su propio conjunto de características.
Con múltiples servicios, es importante considerar la limitación del paquete de publicidad. Un paquete de publicidad BLE puede contener hasta 31 bytes de datos. Si los UUID de servicio ocupan demasiado espacio, algunos pueden no caber en el paquete de publicidad. En este caso, se usa scan response: un segundo paquete que se envía a solicitud del Central.
Según Bluetooth Core Specification 5.4 (2023), el número máximo de servicios primarios en un solo servidor GATT no está limitado por la especificación, pero en la práctica está limitado por la memoria del dispositivo y los requisitos de rendimiento. Para dispositivos integrados con 256 KB de memoria flash, se recomiendan no más de 5–10 servicios.
Preguntas frecuentes
Los UUID de 16 bits están reservados por Bluetooth SIG para servicios estándar y ocupan 2 bytes en el paquete de publicidad. Los UUID de 128 bits se usan para servicios personalizados y ocupan 16 bytes. La elección depende del tipo de servicio: la funcionalidad estándar usa un UUID de 16 bits, la funcionalidad única usa un UUID de 128 bits.
Use UUID v4: un UUID aleatorio que se genera con herramientas en línea, el comando de terminal uuidgen o la API de su lenguaje de programación. Ejemplo: UUID.fromString(UUID.randomUUID().toString()) en Java o UUID() en Swift.
No, no se requiere registro. Bluetooth SIG solo registra UUID de 16 bits. Los UUID personalizados de 128 bits los genera el desarrollador de forma independiente y garantizan la unicidad gracias al enorme espacio de direcciones (combinaciones de 2^128).
Sí, un servicio GATT estándar puede contener una cantidad ilimitada de características. Por ejemplo, Battery Service puede contener Battery Level (0x2A19) y Battery Power State (0x2A1A). Cada característica tiene su propio UUID y conjunto de propiedades.
Si los UUID coinciden, el Central no puede distinguir un servicio de otro sin información adicional. La probabilidad de colisión de UUID v4 aleatorios es insignificantemente pequeña: aproximadamente 5.3 × 10^−37. Use un generador de UUID aleatorio, no copie UUID de ejemplos.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también