Bluetooth Low Energy (BLE) en el Desarrollo Móvil: Qué Es, Protocolos y Cómo Funciona

Autor: IT Sectr Publicado: 2026-07-25 Tiempo de lectura: 11 min

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

  • GATT — protocolo de intercambio de datos en Bluetooth Low Energy con jerarquía Service → Characteristic → Descriptor
  • Core Bluetooth — framework de Apple para trabajar con BLE en iOS, basado en CBCentralManager y CBPeripheral
  • BluetoothGatt — API principal para conexiones BLE en Android mediante BluetoothLeScanner
  • iBeacon — protocolo de balizas BLE de Apple con soporte nativo a través de CLLocationManager en iOS
  • Bonding — conexión cifrada permanente que elimina el escaneo y emparejamiento repetidos

¿Qué es Bluetooth Low Energy (BLE) y cómo funciona?

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.

Jerarquía GATT: Service, Characteristic, Descriptor

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).

Advertising Data y Scan Response

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.

BLE en iOS: Core Bluetooth, CBCentralManager, CBPeripheral

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.

Ejemplo de escaneo BLE en Swift

swift
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.

Conexión y lectura de características en Core Bluetooth

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.

BLE en Android: BluetoothAdapter, BluetoothGatt, BluetoothLeScanner

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.

Ejemplo de escaneo BLE en Kotlin

kotlin
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.

BluetoothGatt: lectura y notificaciones en Android

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, Bonding y Advertising Data en el ecosistema BLE

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.

Paquetes publicitarios y Manufacturer Specific Data

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.

Comparación de iOS y Android para desarrollo BLE

ParámetroiOS (Core Bluetooth)Android (BluetoothGatt)
GestorCBCentralManagerBluetoothLeScanner
Conexiónconnect(to:)connectGatt()
ServiciosdiscoverServices()discoverServices()
LecturareadValue(for:)readCharacteristic()
NotificacionessetNotifyValue(_:for:)setCharacteristicNotification()
PermisosAutomáticosBLUETOOTH_SCAN, BLUETOOTH_CONNECT
iBeaconCLLocationManager (nativo)AltBeacon / bibliotecas

Optimización BLE: MTU, Connection Interval y modo fondo

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.

Modo fondo en iOS y Android

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.

Recomendaciones prácticas de optimizació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

¿En qué se diferencia BLE del Bluetooth clásico?

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.

¿Qué es GATT en Bluetooth Low Energy?

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.

¿Por qué Android requiere el permiso ACCESS_FINE_LOCATION para 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.

¿Cómo aumentar la velocidad de transferencia de datos por BLE?

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.

¿Qué es Bonding en BLE?

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

  • Bluetooth Low Energy — estándar de comunicación inalámbrica para IoT con consumo mínimo de energía y velocidad de hasta 2 Mbps
  • GATT organiza los datos en una jerarquía Service → Characteristic → Descriptor con UUID para cada elemento
  • Core Bluetooth — framework de Apple para BLE en iOS con CBCentralManager, CBPeripheral y modos de fondo
  • BluetoothGatt — API principal de Android con BluetoothAdapter, BluetoothLeScanner y permisos explícitos BLUETOOTH_SCAN
  • iBeacon — tecnología de balizas BLE con soporte nativo en iOS mediante CLLocationManager
  • Bonding permite la reconexión automática tras guardar las claves de cifrado
  • Bluetooth Low Energy en aplicaciones móviles requiere considerar MTU, Connection Interval y las limitaciones de fondo de cada plataforma

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.

Discutir el proyecto