Bluetooth Low Energy (BLE) es un estándar de comunicación inalámbrica optimizado para transmitir pequeños volúmenes de datos con un consumo mínimo de energía. Según Bluetooth SIG, 2025, la tecnología se utiliza en más de 5000 millones de dispositivos en todo el mundo. GATT (Generic Attribute Profile) organiza los datos en una jerarquía Service → Characteristic → Descriptor, que forma la base de todas las aplicaciones BLE para iOS y Android.
Puntos Clave
Bluetooth Low Energy (BLE) funciona con un modelo cliente-servidor con dos roles: Central (dispositivo móvil) y Peripheral (dispositivo). Central escanea el aire e inicia la conexión, mientras que Peripheral transmite datos. A diferencia del Bluetooth clásico, BLE no está diseñado para flujos de audio — su tarea es transmitir paquetes pequeños con un consumo mínimo de energía. Según Bluetooth SIG Core Specification 5.4 (2025), BLE admite velocidades de hasta 2 Mbps con un consumo de menos de 15 mA en modo activo.
GATT (Generic Attribute Profile) define la estructura de datos de Bluetooth Low Energy. Service es un grupo lógico de características (por ejemplo, Heart Rate Service 0x180D). Characteristic es un punto de datos con un valor específico. Descriptor son metadatos de la característica, incluido CCCD para la gestión de notificaciones. Cada elemento tiene un UUID — de 16 bits para perfiles estándar de Bluetooth SIG o de 128 bits para personalizados.
Bluetooth Low Energy en aplicaciones móviles utiliza esta jerarquía para organizar el intercambio de datos entre un teléfono inteligente y los periféricos. Una comprensión adecuada de GATT es la base para desarrollar aplicaciones BLE en ambas plataformas. El desarrollador debe conocer los UUID de los servicios y características del dispositivo, así como las propiedades de cada característica (read, write, notify, indicate).
Los dispositivos BLE transmiten paquetes publicitarios (advertising packets) para su detección. Advertising Data contiene el nombre del dispositivo, UUID de servicios, RSSI y Manufacturer Specific Data. El tamaño del paquete publicitario está limitado a 31 bytes. Para transmitir datos adicionales se utiliza Scan Response — un segundo paquete que el dispositivo central solicita tras la detección.
En iOS, el framework Core Bluetooth gestiona Bluetooth Low Energy. CBCentralManager administra el escaneo y la conexión, CBPeripheral representa un dispositivo BLE remoto. El proceso es estándar: inicializar CBCentralManager, verificar el estado poweredOn, iniciar scanForPeripherals, conectar y descubrir servicios. Core Bluetooth gestiona automáticamente la alimentación del módulo de radio — si BLE no está en uso, se apaga.
BLE en el desarrollo móvil en iOS requiere considerar los modos de fondo. El modo fondo de Core Bluetooth se activa mediante las Capabilities del proyecto (Uses Bluetooth LE accessories). En segundo plano, la aplicación puede recibir notificaciones de características, pero el escaneo es limitado — el sistema lo reinicia solo cuando el dispositivo se mueve. Para iBeacon, el escaneo en segundo plano funciona más activamente a través de CLLocationManager.
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("Encontrado: \(peripheral.name ?? "unknown")")
}
}
En este ejemplo, CBCentralManagerDelegate maneja todos los eventos de la conexión BLE. El método centralManagerDidUpdateState verifica si Bluetooth está activado en el dispositivo móvil. Tras la inicialización exitosa, se inicia el escaneo. El callback didDiscover se invoca por cada dispositivo encontrado.
Después de descubrir un dispositivo, hay que llamar a connect y discoverServices. CBPeripheralDelegate proporciona métodos para manejar cada paso: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor. Cada método es asíncrono — los datos llegan a través de callbacks delegados. RSSI (Received Signal Strength Indicator) muestra el nivel de señal: cuanto más cerca está el valor de 0, más fuerte es la señal.
En Android, Bluetooth Low Energy se implementa mediante el paquete android.bluetooth. BluetoothAdapter es el punto de entrada para todas las operaciones BLE. BluetoothLeScanner inicia el escaneo con callbacks ScanCallback. Tras descubrir un dispositivo, se crea BluetoothGatt — una conexión con el periférico. BluetoothGattCallback maneja eventos: conexión, descubrimiento de servicios, lectura de características, cambios de RSSI.
Bluetooth Low Energy en aplicaciones móviles en Android requiere permisos explícitos BLUETOOTH_SCAN, BLUETOOTH_CONNECT y ACCESS_FINE_LOCATION. Desde Android 12, los permisos están separados: BLUETOOTH_SCAN para escanear, BLUETOOTH_CONNECT para conectar. ACCESS_FINE_LOCATION solo se necesita para escanear ciertos tipos de dispositivos. Sin estos permisos, la aplicación no puede funcionar con BLE.
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "Dispositivo: ${device.name}, RSSI: $rssi")
}
}
}
ScanSettings permite configurar el modo de escaneo: LOW_POWER para ahorrar batería, BALANCED para tareas estándar, LOW_LATENCY para máxima velocidad de detección. ScanFilter reduce la búsqueda por UUID de servicio, nombre del dispositivo o dirección MAC. El filtrado reduce el consumo de energía y acelera la detección del dispositivo deseado.
Después de crear BluetoothGatt mediante connectGatt, la aplicación llama a discoverServices. BluetoothGattCallback contiene onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged. Para recibir notificaciones sobre cambios en las características, hay que llamar a setCharacteristicNotification. El proceso requiere atención: cada operación GATT es asíncrona y el resultado llega en un callback separado.
iBeacon es la tecnología de Apple para balizas BLE que transmiten UUID, Major y Minor. El dispositivo baliza transmite un paquete publicitario, y la aplicación móvil determina la ubicación y la distancia basándose en estos datos. En iOS, iBeacon tiene soporte nativo a través de CLLocationManager. En Android se requiere una biblioteca de terceros (por ejemplo, AltBeacon o Android iBeacon Library).
Bonding es el procedimiento para crear una conexión segura permanente entre dispositivos BLE. Después del Bonding, las claves de cifrado se guardan y los dispositivos se conectan automáticamente al volver a estar cerca. En iOS, el bonding lo gestiona el sistema automáticamente. En Android — mediante BluetoothDevice.createBond(). El bonding es importante para dispositivos portátiles y rastreadores de fitness que requieren reconexión rápida.
Advertising Data es un mecanismo clave de detección en Bluetooth Low Energy. Los fabricantes de dispositivos pueden añadir Manufacturer Specific Data al paquete publicitario para transmitir datos personalizados. El formato del paquete incluye un Company Identifier (2 bytes) y datos arbitrarios. En iOS, CBCentralManager acepta un array de UUID de servicios para filtrar — esto ahorra batería. En Android, ScanFilter funciona con el mismo principio.
| Parámetro | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| Gestor | CBCentralManager | BluetoothLeScanner |
| Conexión | connect(to:) | connectGatt() |
| Servicios | discoverServices() | discoverServices() |
| Lectura | readValue(for:) | readCharacteristic() |
| Notificaciones | setNotifyValue(_:for:) | setCharacteristicNotification() |
| Permisos | Automáticos | BLUETOOTH_SCAN, BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (nativo) | AltBeacon / bibliotecas |
MTU (Maximum Transmission Unit) es el tamaño máximo de un solo paquete de datos de Bluetooth Low Energy. Por defecto, MTU es de 23 bytes (3 bytes de cabecera + 20 bytes de datos). Aumentar el MTU a 512 bytes acelera significativamente la transmisión al intercambiar configuraciones o registros. En iOS, maximumWriteValueLength muestra el MTU disponible. En Android, se usa requestMtu() para aumentar el MTU.
Connection Interval es la frecuencia con la que el dispositivo central consulta al periférico. Cuanto más corto es el intervalo, mayor es la velocidad de transmisión, pero también el consumo de energía. Los valores típicos van de 7.5 ms a 4 segundos. Para rastreadores de fitness, 100 ms es suficiente; para audio — 7.5 ms. BLE en el desarrollo móvil requiere un equilibrio entre velocidad de transmisión y duración de la batería del dispositivo.
iOS admite BLE en segundo plano mediante Background Modes, pero con limitaciones. Una aplicación en segundo plano recibe notificaciones de características, pero no puede escanear activamente. El sistema reinicia el escaneo cuando cambia la ubicación del dispositivo. En Android, el escaneo en segundo plano requiere un Foreground Service con una notificación persistente. Sin ello, el sistema móvil eliminará el proceso al minimizar la aplicación.
Para un funcionamiento fiable de BLE en aplicaciones móviles, siga estas reglas. Use notify en lugar de polling — una característica con notificaciones envía datos cuando cambia, ahorrando batería. Establezca el MTU óptimo al inicio de la conexión. Filtre dispositivos por UUID de servicio al escanear. Verifique la compatibilidad de la pila BLE en diferentes modelos — los fabricantes (Xiaomi, Huawei, Samsung) hacen cambios que afectan el comportamiento de Bluetooth.
Preguntas Frecuentes
Bluetooth Low Energy (BLE) está optimizado para la transmisión periódica de paquetes pequeños con bajo consumo de energía. Bluetooth clásico está diseñado para flujos de audio y transmisión continua de grandes volúmenes de datos.
GATT (Generic Attribute Profile) es un protocolo de intercambio de datos en BLE que define la jerarquía Service → Characteristic → Descriptor. GATT se utiliza para leer, escribir y recibir notificaciones de dispositivos BLE.
Antes de Android 12, el escaneo BLE podía usarse para determinar la ubicación, por lo que Google combinó estos permisos. Desde Android 12, se introdujo un permiso separado BLUETOOTH_SCAN sin vinculación con la ubicación.
Aumente el MTU mediante requestMtu() en Android y maximumWriteValueLength en iOS. Connection Interval también afecta la velocidad — cuanto menor es, más rápida es la transferencia. La combinación óptima proporciona una mejora de hasta 10 veces.
Bonding es el procedimiento para crear una conexión segura permanente entre dispositivos BLE. Después del Bonding, las claves de cifrado se guardan y los dispositivos se conectan automáticamente sin necesidad de búsqueda repetida.
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.