Módulo 3.3

Conexiones BLE

Establecimiento, parámetros y gestión de enlaces Bluetooth

Santi Scagliusi, PhD

Comenzar arrow_downward
link
Conexión
Establecimiento
tune
Parámetros
Interval, latency
speed
PHY
1M, 2M, Coded
data_array
MTU y DLE
Tamaño de datos

Proceso de Conexión

Cómo se establece una conexión BLE entre un central y un periférico.

checklist Pasos de la Conexión

  1. 1
    Periférico hace advertising

    Transmite en canales 37, 38, 39

  2. 2
    Central envía CONNECT_REQ

    Connection request con parámetros

  3. 3
    Periférico acepta

    A menos que use accept list filter

  4. 4
    Cambio de canales

    Advertising (37-39) → Datos (0-36)

timeline Eventos de Conexión

CE
Evento 1
Sleep
CE
Evento 2
Sleep
CE
Evento 3
t=0 Connection Interval Connection Interval
info
Connection Event (CE): Momento en que ambos dispositivos se despiertan, sincronizan y pueden intercambiar datos. Entre eventos, entran en modo sleep para ahorrar energía.

Channel Hopping y Retransmisión

Mecanismos de robustez en la conexión BLE.

shuffle Channel Hopping

Durante la conexión, los dispositivos saltan entre los 37 canales de datos usando un algoritmo pseudoaleatorio para evitar interferencia.

Canales de datos 0-36 (los resaltados son ejemplos de saltos)

replay Retransmisión Fiable

BLE utiliza retransmisión infinita hasta recibir ACK o alcanzar el supervision timeout.

DATA
arrow_forward
ACK
o
NACK → Retry
warning
Importante: El channel hopping ayuda a evitar interferencia de WiFi (que usa canales superpuestos), pero no garantiza conexión en ambientes muy ruidosos.

Tipos de Desconexión

Formas en que puede terminar una conexión BLE.

logout

Desconexión por Aplicación

La aplicación decide terminar la conexión enviando un termination packet con el motivo de desconexión.

0x13 Remote User Terminated
0x16 Connection Terminated by Local Host
timer_off

Supervision Timeout

No se reciben paquetes válidos durante el tiempo de supervisión. Indica pérdida de conexión por distancia o interferencia.

0x08 Connection Timeout
0x22 LMP Response Timeout

error_outline Códigos de Error Comunes

Código Nombre Descripción
0x13 Remote User Terminated El usuario remoto terminó la conexión
0x08 Connection Timeout Supervision timeout alcanzado
0x3E Connection Failed to Establish Fallo al establecer conexión
0x16 Local Host Terminated Host local terminó la conexión

Parámetros de Conexión

Configuración que afecta latencia, throughput y consumo energético.

schedule Connection Interval

7.5 ms - 4 s

Tiempo entre eventos de conexión. Unidades de 1.25 ms.

7.5 ms
Baja latencia
Alto consumo
~100 ms
Balance típico
4 s
Alta latencia
Bajo consumo

timer Supervision Timeout

100 ms - 32 s

Tiempo maximo sin paquetes validos antes de desconectar. Unidades de 10 ms.

warning Restricción

supervision_timeout debe ser mayor que:

(1 + peripheral_latency) × connection_interval × 2

Peripheral Latency

Ahorro de energía para dispositivos que no envían datos continuamente.

skip_next Peripheral Latency (Slave Latency)

0 - 499 eventos

Número de eventos de conexión que el periférico puede ignorar si no tiene datos que enviar. Muy útil para dispositivos HID como teclados o ratones.

Ejemplo con latency = 3:
CE
skip
skip
skip
CE
skip
skip
skip
CE
...

El periférico solo necesita responder cada 4 eventos si no tiene datos, ahorrando energía.

Parámetro Rango Unidad Típico Efecto
Connection Interval 7.5 ms - 4 s 1.25 ms 30-100 ms Latencia vs consumo
Supervision Timeout 100 ms - 32 s 10 ms 4 s Tolerancia a pérdida
Peripheral Latency 0 - 499 eventos 0-4 Ahorro sin datos

Visualizador de Parámetros de Conexión

Ajusta los parámetros y observa cómo afectan al throughput, consumo energético y la línea temporal de eventos de conexión.

100 ms
7.5 ms 4000 ms
0 eventos
0 (sin skip) 10

timeline Línea Temporal de Eventos de Conexión Ventana: 500 ms

Central activo
Peripheral activo
Evento saltado (latency)
Sleep
event_repeat
10.0
Eventos / segundo
event_available
10.0
Eventos efectivos / s
speed
200
Bytes / segundo
timer
200
Supervision timeout min (ms)
battery_alert Consumo Energético Relativo Medio
50%
Bajo Alto
swap_vert Throughput de Datos Medio
50%
Bajo Alto
warning Supervision Timeout

Si no se recibe ningún paquete válido durante el supervision timeout, la conexión se pierde. El mínimo permitido por spec es: (1 + slave_latency) × conn_interval × 2

Fórmula: (1 + 0) × 100 ms × 2 = 200 ms

Con estos parámetros, se recomienda un supervision timeout de al menos 200 ms. Un valor típico sería 4000 ms para tolerar interferencias temporales.

lightbulb
Tradeoff fundamental: Un connection interval corto ofrece alta velocidad de datos y baja latencia, pero consume más energía. Un interval largo ahorra batería pero reduce el throughput. El slave latency permite al periférico ahorrar energía sin cambiar el interval del central.

Modos de Radio (PHY)

BLE 5.0 introdujo nuevos modos de capa física para diferentes casos de uso.

speed

1M PHY

  • check 1 Mbps de throughput
  • check Compatibilidad universal
  • check Balance alcance/velocidad
1 Mbps

Todos los dispositivos BLE

bolt

2M PHY

  • check 2 Mbps de throughput
  • check Menor tiempo en aire
  • warning Menor alcance
2 Mbps

BLE 5.0+ requerido

cell_tower

Coded PHY

  • check Hasta 4x mas alcance
  • check Forward Error Correction
  • warning 125 kbps o 500 kbps
S=2/S=8

500/125 kbps efectivos

lightbulb
Elección de PHY: Usa 2M PHY para transferencias rápidas en distancias cortas. Usa Coded PHY para IoT industrial o exteriores donde se necesita alcance. 1M PHY es el balance para la mayoría de aplicaciones.

Data Length y MTU

Tamaño de paquetes y operaciones GATT.

straighten Data Length (DLE)

Bytes de payload por paquete BLE en capa Link Layer.

Default (BLE 4.0) 27 bytes
DLE (BLE 4.2+) 251 bytes

Data Length Extension (DLE) desde Bluetooth 4.2 permite hasta 251 bytes por paquete.

data_object MTU (Maximum Transmission Unit)

Bytes de datos ATT por operacion GATT.

Default 23 bytes

20 bytes de payload ATT util

Negociado hasta 517 bytes

Requiere MTU exchange

layers Estructura del Paquete de Datos

LL Header 2 bytes
L2CAP 4 bytes
ATT 3 bytes
ATT Payload (datos utiles) hasta 244 bytes con DLE
calculate Cálculo de MTU útil máximo
Data Length max: 251 bytes
- L2CAP header: 4 bytes
- ATT header: 3 bytes
= 244 bytes de payload ATT útil
sync_alt
Relación DLE y MTU: DLE opera en Link Layer (paquetes BLE). MTU opera en capa ATT (operaciones GATT). Ambos deben negociarse para máximo throughput. Un MTU alto sin DLE fragmentará en múltiples paquetes.

Actualización de Parámetros

Cómo se negocian y actualizan los parámetros de conexión.

admin_panel_settings

Control del Central

  • check_circle El central tiene control final sobre parámetros de conexión
  • check_circle Define interval, latency y timeout iniciales
  • check_circle Puede rechazar solicitudes del periférico
request_quote

Solicitud del Periférico

  • check_circle Puede solicitar cambios de parámetros
  • check_circle Envía Connection Parameter Request
  • warning Central puede aceptar o rechazar

handshake Negociación Bilateral

Algunos parámetros se negocian entre ambos dispositivos:

speed
PHY

Ambos deben soportar el modo

straighten
Data Length

Se usa el menor soportado

data_object
MTU

Se usa el menor negociado

APIs de Zephyr: Callbacks

Estructura y registro de callbacks para eventos de conexión.

Estructura bt_conn_cb
struct bt_conn_cb { // Conexión establecida void (*connected)( struct bt_conn *conn, uint8_t err); // Conexión terminada void (*disconnected)( struct bt_conn *conn, uint8_t reason); // Parámetros actualizados void (*le_param_updated)( struct bt_conn *conn, uint16_t interval, uint16_t latency, uint16_t timeout); };
Registro de callbacks
// Opción 1: Registro dinámico static struct bt_conn_cb conn_callbacks = { .connected = on_connected, .disconnected = on_disconnected, }; bt_conn_cb_register(&conn_callbacks); // Opción 2: Macro estática (preferida) BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = on_connected, .disconnected = on_disconnected, };
info
BT_CONN_CB_DEFINE() registra los callbacks en tiempo de compilación, evitando llamadas en runtime.

Implementación Completa

Ejemplo funcional de gestión de conexiones BLE.

main.c - Implementacion completa
#include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/conn.h> static struct bt_conn *current_conn; static void on_connected(struct bt_conn *conn, uint8_t err) { if (err) { printk("Connection failed: 0x%02x\n", err); return; } current_conn = bt_conn_ref(conn); printk("Connected!\n"); } static void on_disconnected(struct bt_conn *conn, uint8_t reason) { printk("Disconnected: 0x%02x\n", reason); if (current_conn) { bt_conn_unref(current_conn); current_conn = NULL; } } BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = on_connected, .disconnected = on_disconnected, };

Funciones de Conexión

APIs principales para gestionar y modificar conexiones BLE.

bt_conn_get_info()

Obtiene información actual de la conexión (interval, PHY, etc).

bt_conn_le_param_update()

Solicita cambio de parámetros de conexión.

bt_conn_le_phy_update()

Solicita cambio de PHY (1M, 2M, Coded).

bt_conn_le_data_len_update()

Solicita cambio de Data Length (DLE).

bt_gatt_exchange_mtu()

Inicia negociación de MTU con el peer.

bt_conn_disconnect()

Termina la conexión con un código de razón.

tips_and_updates
Consejo: Usa bt_conn_ref() y bt_conn_unref() para gestionar correctamente el ciclo de vida de las conexiones y evitar memory leaks.

Kconfig para Conexiones

Opciones de configuración para parámetros preferidos.

prj.conf
# ======================================== # Parámetros de conexión preferidos # ======================================== # Connection interval (unidades de 1.25 ms) CONFIG_BT_PERIPHERAL_PREF_MIN_INT=24 # 30 ms CONFIG_BT_PERIPHERAL_PREF_MAX_INT=40 # 50 ms # Peripheral latency CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 # Supervision timeout (unidades de 10 ms) CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 # 4 s # ======================================== # Data Length Extension (DLE) # ======================================== CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 CONFIG_BT_USER_DATA_LEN_UPDATE=y # ======================================== # PHY Update # ======================================== CONFIG_BT_USER_PHY_UPDATE=y CONFIG_BT_CTLR_PHY_2M=y # Habilitar 2M PHY CONFIG_BT_CTLR_PHY_CODED=y # Habilitar Coded PHY # ======================================== # MTU # ======================================== CONFIG_BT_L2CAP_TX_MTU=247 CONFIG_BT_BUF_ACL_RX_SIZE=251
tips_and_updates
Consejo: Los parámetros PREF_* se envían al central durante la conexión. El central puede aceptarlos o usar sus propios valores. Para forzar un cambio, usa bt_conn_le_param_update().

Resumen del Módulo

Conceptos clave de conexiones BLE.

link

Conexión

Central envía CONNECT_REQ. Cambio a canales de datos 0-36 con channel hopping.

tune

Parámetros

Connection interval, supervision timeout y peripheral latency controlan consumo y latencia.

speed

PHY y MTU

1M/2M/Coded PHY y DLE/MTU para optimizar throughput y alcance.

API Función Uso
bt_conn_cb_register() Registrar callbacks connected, disconnected, param_updated
bt_conn_get_info() Leer info de conexión Interval, PHY, MTU actual
bt_conn_le_param_update() Solicitar cambio Interval, latency, timeout
bt_gatt_exchange_mtu() Negociar MTU Tras conexión establecida
bt_conn_disconnect() Terminar conexión Con código de razón
arrow_forward Siguiente módulo

3.4 GATT: Servicios y Características

Perfil de atributos genéricos, servicios, características y descriptores.