Módulo 3.2

Advertising y Scanning

Descubrimiento de dispositivos en Bluetooth Low Energy

Santi Scagliusi, PhD

Comenzar arrow_downward
cell_tower
Advertising
Anunciar presencia
search
Scanning
Descubrir dispositivos
waves
Canales
37, 38, 39
code
APIs Zephyr
bt_le_adv_start()

¿Qué es el Advertising?

Paquetes enviados periódicamente para anunciar la presencia de un dispositivo BLE.

cell_tower

Periférico anunciando

Broadcast periódico
  • schedule
    Advertising Interval
    20 ms a 10.24 s (paso de 0.625 ms)
  • repeat
    Eventos repetidos
    Transmite en canales 37, 38, 39
  • data_object
    Payload hasta 31 bytes
    Nombre, servicios, datos custom

balance Trade-off: Intervalo de advertising

20 ms
Descubrimiento rápido
Mayor consumo
1 s
Balance
10.24 s
Descubrimiento más lento
Menor consumo

timeline Evento de Advertising

t=0
t=adv_interval
37
2402 MHz
arrow_forward
38
2426 MHz
arrow_forward
39
2480 MHz
more_horiz
37
Repite
info
Los 3 canales de advertising están separados en frecuencia para evitar interferencia con WiFi (canales 1, 6, 11).

Canales de Advertising

BLE utiliza 40 canales de 2 MHz en la banda ISM de 2.4 GHz.

waves Distribución de Canales BLE

2402 MHz 2426 MHz 2480 MHz
3 Canales Advertising
37, 38, 39 - Primarios
37 Canales de Datos
0-36 - Post-conexión
info
2 MHz por canal
Total: 80 MHz de banda
lightbulb
¿Por qué están separados los canales de advertising? Los canales 37, 38 y 39 están posicionados para evitar los canales WiFi más comunes (1, 6, 11), minimizando la interferencia en entornos con ambas tecnologías.

Simulador: Advertising y Scanning

Visualiza como el advertiser transmite en los 3 canales y como el scanner debe coincidir para descubrir el dispositivo.

Advertiser --
Scanner --
Intervalo: 0 ms
Descubrimientos: 0
link Dispositivo descubierto en canal --
Advertiser
Scanner
2402 MHz 2426 MHz 2480 MHz
500ms
school
Concepto clave: El scanner debe estar escuchando en el mismo canal al mismo tiempo que el advertiser transmite para poder descubrir el dispositivo. Por eso el scanning puede tardar: la probabilidad de coincidencia depende de los intervalos de advertising y scanning.

Scanning: Descubriendo Dispositivos

El proceso de escaneo permite a un dispositivo central descubrir periféricos cercanos.

search Parámetros de Scanning

Scan Interval 10 ms - 10.24 s

Período entre inicios de scan windows consecutivos.

Scan Window 10 ms - 10.24 s

Tiempo activo escaneando (siempre ≤ interval).

Duty Cycle window / interval

100% = escaneo continuo, mayor consumo.

timeline Diagrama de Scanning

CH 37
CH 38
CH 39
Scan Window (activo)
Scan Interval

swap_horiz Scan Request / Response

El scanner puede solicitar información adicional al advertiser:

SCAN_REQ
arrow_forward
SCAN_RSP
(+31 bytes extra)

Tipos de Advertising

BLE define varios tipos de paquetes de advertising según el caso de uso.

link

ADV_IND

Más común. Permite conexiones de cualquier dispositivo. Usado por sensores, wearables, periféricos generales.

person

ADV_DIRECT_IND

Reconexión rápida. Dirigido a un dispositivo específico (por dirección). Sin payload adicional.

search

ADV_SCAN_IND

No permite conexiones, pero responde a scan requests. Útil para broadcast con datos extendidos.

cell_tower

ADV_NONCONN_IND

Beacons. Solo broadcast unidireccional. iBeacon, Eddystone, sensores de temperatura ambiente.

Resumen de Tipos de Advertising

Comparativa de características entre los diferentes tipos de paquetes.

Tipo Connectable Scannable Dirigido Caso de uso
ADV_IND check_circle check_circle cancel Periférico general
ADV_DIRECT_IND check_circle cancel check_circle Reconexión rápida
ADV_SCAN_IND cancel check_circle cancel Broadcast extendido
ADV_NONCONN_IND cancel cancel cancel Beacons
tips_and_updates
Consejo: Para la mayoría de periféricos, usa ADV_IND. Para beacons de solo lectura usa ADV_NONCONN_IND.

Direcciones de Bluetooth

BLE soporta varios tipos de direcciones de 48 bits para identificar dispositivos.

verified

Public Address

  • check Registrada con IEEE (OUI)
  • check Única globalmente
  • check No cambia nunca
AA:BB:CC:DD:EE:FF
shuffle

Random Static

  • check Generada al arrancar dispositivo
  • check Puede persistir entre resets
  • check Bits superiores: 11
C0:XX:XX:XX:XX:XX

Direcciones Privadas

Tipos de direcciones que protegen la privacidad del dispositivo.

key

Random Private Resolvable

  • check Cambia periódicamente
  • check Resoluble con IRK (Identity Resolving Key)
  • check Bits superiores: 01
4X:XX:XX:XX:XX:XX
visibility_off

Random Private Non-Resolvable

  • check Cambia frecuentemente
  • check No se puede resolver
  • check Bits superiores: 00
0X:XX:XX:XX:XX:XX
privacy_tip
Privacidad BLE: Las direcciones privadas resolvables permiten que dispositivos emparejados (bonded) se reconozcan mutuamente, mientras previenen el tracking por terceros. El IRK se intercambia durante el proceso de bonding.

Estructura del Paquete de Advertising

Formato del PDU (Protocol Data Unit) de advertising en BLE.

data_array PDU de Advertising

Header
PDU Type, TxAdd, RxAdd, Length
2 bytes
AdvA
Dirección del Advertiser
6 bytes
AdvData
Datos de Advertising
0-31 bytes
Estructura AD (Advertising Data) - Puede haber múltiples
Length 1 byte
AD Type 1 byte
AD Data Length-1 bytes
Len
Type
Data...
...

Tipos de Datos de Advertising

Constantes Zephyr para los tipos de datos AD más utilizados.

list AD Types Comunes

Constante Zephyr Valor Descripción
BT_DATA_FLAGS 0x01 Flags de capacidades (LE General, sin BR/EDR)
BT_DATA_NAME_COMPLETE 0x09 Nombre completo del dispositivo
BT_DATA_NAME_SHORTENED 0x08 Nombre abreviado
BT_DATA_UUID16_ALL 0x03 Lista completa de UUIDs de 16 bits
BT_DATA_UUID128_ALL 0x07 Lista completa de UUIDs de 128 bits
BT_DATA_MANUFACTURER_DATA 0xFF Datos específicos del fabricante
info
Nota: El campo BT_DATA_FLAGS es obligatorio y siempre debe ser el primer AD structure. Usa BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR para periféricos BLE estándar.

APIs de Zephyr para Advertising

Configuración y estructuras de datos para advertising.

prj.conf
# Habilitar stack Bluetooth CONFIG_BT=y # Rol periférico (advertising) CONFIG_BT_PERIPHERAL=y # Nombre del dispositivo CONFIG_BT_DEVICE_NAME="Mi Sensor" # Opcional: Rol central (scanning) CONFIG_BT_CENTRAL=y
info
CONFIG_BT_PERIPHERAL habilita el rol de periférico permitiendo iniciar advertising. CONFIG_BT_CENTRAL habilita el rol de central para scanning y conexiones.
main.c - Estructuras
#include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/gap.h> // Datos de advertising static const struct bt_data ad[] = { BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR), BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN), }; // Scan response (opcional) static const struct bt_data sd[] = { BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0x0d, 0x18), // Heart Rate };

Iniciar Advertising

Código para inicializar el stack BT e iniciar el advertising.

main.c - Iniciar Advertising
int main(void) { int err; // 1. Inicializar stack BT err = bt_enable(NULL); if (err) { printk("Bluetooth init failed: %d\n", err); return err; } // 2. Iniciar advertising connectable err = bt_le_adv_start( BT_LE_ADV_CONN, // Connectable & scannable ad, ARRAY_SIZE(ad), // Advertising data sd, ARRAY_SIZE(sd) // Scan response data ); if (err) { printk("Advertising failed: %d\n", err); return err; } printk("Advertising started!\n"); return 0; }
BT_LE_ADV_CONN

Connectable y scannable. Para periféricos que aceptan conexiones.

BT_LE_ADV_NCONN

No connectable. Para beacons y broadcast puro.

bt_le_adv_update_data()

Actualizar datos de advertising dinamicamente.

Beacon de Temperatura: Estructuras

Definición de datos de fabricante para transmitir temperatura.

temperature_beacon.c - Estructuras
#include <zephyr/bluetooth/bluetooth.h> #define COMPANY_ID 0x0059 // Nordic Semiconductor static int16_t current_temp = 2350; // 23.50 C static uint8_t mfg_data[] = { COMPANY_ID & 0xFF, COMPANY_ID >> 8, 0x00, 0x00 // Temperatura (actualizado dinamicamente) }; static struct bt_data ad[] = { BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR), BT_DATA(BT_DATA_NAME_COMPLETE, "TempBeacon", 10), BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, sizeof(mfg_data)), };

Manufacturer Data

Formato: 2 bytes Company ID + datos custom. El Company ID 0x0059 pertenece a Nordic.

Temperatura

Codificada como int16 en centesimas de grado (2350 = 23.50 C).

Beacon de Temperatura: Implementación

Función de actualización y bucle principal del beacon.

temperature_beacon.c - Main
void update_temperature(int16_t temp) { mfg_data[2] = temp & 0xFF; mfg_data[3] = temp >> 8; // Actualizar advertising sin detenerlo bt_le_adv_update_data(ad, ARRAY_SIZE(ad), NULL, 0); } int main(void) { bt_enable(NULL); // Beacon no connectable bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad), NULL, 0); while (1) { // Simular lectura de sensor current_temp += 10; update_temperature(current_temp); k_sleep(K_SECONDS(5)); } }
tips_and_updates
Consejo: Usa bt_le_adv_update_data() para actualizar datos de advertising sin detener y reiniciar el proceso. Esto es más eficiente y mantiene la continuidad del advertising.

Conceptos Clave

Lo esencial de advertising y scanning en BLE.

cell_tower

Advertising

Broadcast periódico en canales 37, 38, 39. Intervalo configurable de 20 ms a 10.24 s.

search

Scanning

Scan interval y window definen el duty cycle. Puede solicitar scan response.

badge

Direcciones

Public, Random Static, y Random Private para diferentes niveles de privacidad.

API Funcion Uso
bt_enable() Inicializar stack BT Llamar antes de cualquier operación BT
bt_le_adv_start() Iniciar advertising BT_LE_ADV_CONN o BT_LE_ADV_NCONN
bt_le_adv_stop() Detener advertising Antes de cambiar parámetros
bt_le_adv_update_data() Actualizar datos Sin detener advertising

Continuar Aprendiendo

En el siguiente módulo aprenderemos sobre conexiones BLE.

arrow_forward Siguiente módulo

3.3 Conexiones BLE

Establecimiento de conexiones, parámetros de conexión y gestión de enlaces.