¿Qué es un Sniffer BLE?
Herramienta para interceptar y analizar paquetes BLE "en el aire"
Ver lo Invisible
Permite ver EXACTAMENTE lo que se transmite entre dispositivos BLE, incluyendo datos de advertising, parámetros de conexión y comunicación GATT.
Debugging Esencial
Herramienta imprescindible para entender el protocolo y solucionar problemas de comunicación a bajo nivel.
nRF Sniffer
Solución de Nordic usando un DK o Dongle adicional con firmware especializado + Wireshark.
Incluso Encriptado
Con la LTK correcta, puedes descifrar la comunicación encriptada para análisis completo.
¿Por qué Usar un Sniffer?
Casos de uso donde el sniffer se vuelve imprescindible
Problemas de Conexión
Debugging de problemas difíciles: ¿por qué no conecta? ¿por qué se desconecta?
Entender el Protocolo
Ver cómo funciona BLE a bajo nivel, ideal para aprendizaje profundo.
Verificar Comportamiento
Confirmar que advertising y conexión funcionan según lo esperado.
Analizar Tiempos
Medir intervalos de advertising, latencia de conexión, tiempos de timeout.
Soporte Técnico
Capturar trazas para reportar problemas a Nordic o al equipo de desarrollo.
Análisis de Seguridad
Ver comunicación encriptada proporcionando la LTK al sniffer.
lightbulb Escenario Típico
Problema: "Mi dispositivo aparece en el escaneo pero no puedo conectarme"
Sin sniffer: Revisar logs, adivinar, probar cambios a ciegas...
Con sniffer: Ver el CONNECT_IND, confirmar que llega, ver si hay respuesta, identificar el punto exacto del fallo.
Cómo Funciona el nRF Sniffer
Firmware especializado que captura paquetes siguiendo el protocolo BLE
Firmware Bare-Metal
Firmware especial en nRF52 (sin Zephyr) optimizado para captura de paquetes.
Una Antena = Un Canal
Limitación física: solo puede escuchar UN canal a la vez, debe "saltar" entre canales.
Una Conexión a la Vez
Solo puede seguir UNA conexión simultáneamente. Si hay múltiples dispositivos, hay que elegir cuál seguir.
Comportamiento del Sniffer
Sigue el patrón 37 → 38 → 39
Sigue el channel hopping leyendo CONNECT_IND
Captura de una Conexión
Hardware Soportado
Dispositivos Nordic compatibles con el firmware del sniffer
| Hardware | Firmware | Notas |
|---|---|---|
|
developer_board
nRF52840 DK
|
sniffer_nrf52840dk_*.hex |
Máxima capacidad, soporta coded PHY |
|
usb
nRF52840 Dongle
|
sniffer_nrf52840dongle_*.hex |
Compacto, ideal como sniffer dedicado |
|
developer_board
nRF52833 DK
|
sniffer_nrf52833dk_*.hex |
Alternativa económica |
|
developer_board
nRF52 DK
|
sniffer_nrf52dk_*.hex |
Solo 1M PHY |
Nota para DK v3
En las versiones v3 del Development Kit, usar el puerto USB etiquetado como "nRF USB" en lugar del puerto "Interface IC" para el sniffer. El puerto Interface IC se usa para programar, pero la comunicación del sniffer debe ser directa con el chip nRF.
recommend Setup Recomendado
- check_circle Un nRF52840 Dongle como sniffer dedicado
- check_circle Tu nRF52840 DK para desarrollo normal
- check_circle Ambos conectados al mismo PC
inventory_2 Alternativa Económica
- info Usar un solo DK alternando entre desarrollo y sniffer
- warning Requiere re-flashear firmware cada vez
- warning No puedes sniffear tu propio dispositivo en desarrollo
Configuración del Sniffer (1/2)
Instalación del firmware y software necesario
Descargar Firmware
Descargar nRF Sniffer for Bluetooth LE v4.x desde nordicsemi.com
nrf_sniffer_for_bluetooth_le_4.x.x.zip
Flashear el Firmware
Usar nRF Connect Programmer para cargar el .hex correspondiente al hardware.
Instalar Wireshark
Descargar e instalar Wireshark (versión 3.x o superior recomendada).
Configuración del Sniffer (2/2)
Integración con Wireshark
Instalar Plugin de Captura
Desde la carpeta extcap del sniffer descargado:
Copiar Extcap a Wireshark
Copiar el contenido de extcap a la carpeta Personal Extcap de Wireshark:
%APPDATA%\Wireshark\extcap\macOS:
~/.config/wireshark/extcap/Linux:
~/.config/wireshark/extcap/
Habilitar Toolbar
En Wireshark: View → Interface Toolbars → nRF Sniffer for Bluetooth LE
verified Verificación
Si la instalación es correcta, al abrir Wireshark verás "nRF Sniffer for Bluetooth LE" en la lista de interfaces de captura. Al seleccionarla, aparecerá la toolbar con controles específicos.
La Interfaz de Wireshark (1/2)
Las tres ventanas principales para analizar capturas BLE
La Interfaz de Wireshark (2/2)
Columnas importantes en la lista de paquetes
Columnas Importantes en Packet List
| Columna | Descripción |
|---|---|
| No. | Número secuencial del paquete |
| Time | Timestamp relativo desde inicio de captura |
| Source | Dirección BLE origen (puede ser random) |
| Protocol | Capa del stack: LE LL, L2CAP, ATT, SMP |
| Channel Index | Canal de captura (37-39 adv, 0-36 datos) |
| Delta time | Tiempo desde el paquete anterior |
| Info | Resumen del contenido del paquete |
Analizando Advertising
Qué buscar en los paquetes de advertising
Puntos Clave a Observar
-
radio_button_checked
Tipo de advertising: ADV_IND, ADV_SCAN_IND, ADV_NONCONN_IND
-
radio_button_checked
Canales: 37, 38, 39 en secuencia
-
radio_button_checked
Intervalo: Delta time entre clusters (~N ms configurado)
-
radio_button_checked
Random delay: 0-10ms extra (evita colisiones)
-
radio_button_checked
SCAN_REQ/SCAN_RSP: Deben estar en el mismo canal
Contenido del Advertising Data
- Flags: Capacidades del dispositivo
- Complete Local Name: Nombre visible
- Service UUIDs: Servicios ofrecidos
- Manufacturer Specific: Datos propietarios
Estructura AD (Advertising Data)
Formato: Length + Type + Data
= Flags (0x01), valor BT_LE_AD_NO_BREDR
= Manufacturer (0xFF), Company ID 0x0059 (Nordic)
filter_alt Filtros Útiles en Wireshark
btle.advertising_address == aa:bb:cc:dd:ee:ff
Filtrar por dirección de advertising
btle.advertising_header.pdu_type == 0x00
Solo ADV_IND
Analizando Conexiones
Secuencia típica de establecimiento y comunicación
Secuencia de Conexión
Parámetros iniciales (interval, timeout, channel map)
Negociación de PHY (1M, 2M, Coded)
Keep-alive mientras no hay datos
Request/Response para ajustar parámetros
Nuevos parámetros con Instant (cuándo aplicar)
tips_and_updates Filtrar Empty PDUs
Los Empty PDU son paquetes de keep-alive sin datos. Para ocultarlos:
!(btle.data_header.length == 0)
Parámetros en CONNECT_IND
- schedule Interval: Tiempo entre eventos de conexión
- hourglass_empty Latency: Eventos que puede saltar el peripheral
- timer_off Timeout: Tiempo máximo sin comunicación
- grid_view Channel Map: Canales habilitados (37 bits)
info El Campo "Instant"
Cuando se actualiza la conexión, el Instant indica el número de evento de conexión en el que los nuevos parámetros entran en vigor. Ambos dispositivos cuentan los eventos y cambian simultáneamente.
Analizando Comunicación GATT
Operaciones GATT y proceso de pairing visibles en el sniffer
Operaciones GATT Comunes
Habilitar notificaciones (0x0001) o indicaciones (0x0002)
Datos enviados desde el peripheral (ej: valor de sensor)
Central solicita valor de una característica
Ej: "Insufficient Authentication" (requiere pairing)
Secuencia de Pairing
Error: Insufficient Authentication
Intercambio de IO capabilities
Generación de claves compartidas
Inicio de encriptación
Requieren LTK para descifrar
filter_alt Filtros para Análisis GATT
btatt
Solo paquetes ATT (operaciones GATT)
btatt.opcode == 0x12
Solo Write Request
btatt.opcode == 0x1b
Solo Notifications
btsmp
Solo paquetes SMP (pairing)
Descifrando Conexiones Encriptadas (1/2)
Cómo ver el contenido de comunicaciones cifradas con la LTK
El Problema
Después de LL_START_ENC_REQ, todos los paquetes
están encriptados. El sniffer los captura pero no puede interpretar el contenido.
Solo vemos datos aleatorios sin sentido.
Solución: Exportar la LTK
1. Habilitar Log de LTK en Zephyr
CONFIG_BT_LOG_SNIFFER_INFO=y
2. Observar el Log Serial
Este valor aparece cuando se completa el pairing
3. Configurar en Wireshark
- 1. Toolbar sniffer → dropdown "Key"
- 2. Seleccionar "SC LTK"
- 3. Pegar la LTK (sin 0x)
- 4. Clic en "Apply"
Descifrando Conexiones Encriptadas (2/2)
Verificación y ejercicio práctico
Verificación
check_circle Confirmar Descifrado Exitoso
En Packet Details, expandir nRF Sniffer → Flags:
Antes vs Después
warning Importante
- - La LTK cambia con cada nuevo pairing
- - Debes capturar DESDE el inicio del pairing
- - Si reconectas con bonding, necesitas la LTK original
- - Solo funciona en modo desarrollo
science Ejercicio Práctico
- 1 Configura el sniffer y captura
- 2 Conecta desde nRF Connect móvil
- 3 Identifica CONNECT_IND, Empty PDUs, ATT
- 4 Mide el intervalo de conexión (Delta time)
- 5 Habilita CONFIG_BT_LOG_SNIFFER_INFO y descifra