Un BLE tag de salto unico alcanza 10-30 metros de alcance en interiores. En un almacen de 20,000 m2, eso significa decenas de gateways para cobertura total. Las redes mesh inverten el modelo: los tags retransmiten paquetes entre si, extendiendo el alcance salto a salto hasta que los datos llegan a un gateway. BLE Mesh 1.0 (2017) introdujo relay por flood gestionado; Mesh 1.1 (2023) anadio directed forwarding. Para seguimiento de activos, mesh resuelve tres problemas: extension de cobertura sin costo proporcional de gateways, tolerancia a fallos mediante rutas redundantes y degradacion gradual cuando tags individuales se desconectan.

Este artículo disecciona las redes mesh desde la perspectiva de tags de activos alimentados por bateria. Cubrimos internals del protocolo, seleccion de nodos relay, calculos de presupuesto de energia, latencia y throughput, limites de escalabilidad de 100 a 5000+ nodos, aprovisionamiento a escala, arquitectura de seguridad y comparacion de stacks de fabricantes.

1. Pila de Protocolo BLE Mesh

BLE Mesh opera enteramente en canales de advertising (37/38/39 a 2402/2426/2480 MHz) usando PDUs sin conexion. La pila tiene cinco capas:

Capa Funcion Parametros Clave
Bearer Transporte sobre ADV o GATT ADV: PDU 31 bytes, 3 canales; GATT: proxy, MTU 20 bytes
Red Direccionamiento, relay, TTL PDU 29 bytes, TTL 7-bit, SEQ 24-bit, unicast 15-bit
Transporte Inferior Segmentacion, reensamblaje Segmento 12 bytes, ack 20s
Transporte Superior Cifrado app key Cifrado payload acceso, transMIC 4 bytes
Acceso Mensajes de modelo, opcodes Vendor 3 bytes, SIG 2 bytes

La PDU de red es compacta: 1 byte TTL, 3 bytes SEQ (secuencia 24-bit para proteccion contra replay), 2 bytes SRC, 2 bytes DST y hasta 12 bytes de payload de transporte. La PDU completa se cifra con la network key de 128 bits. Los nodos relay reenvian paquetes sin descifrar el payload de aplicacion.

Para tags de activos, el bearer ADV es la unica opcion practica. Las conexiones GATT consumen 3-5 mA durante eventos de conexion, insostenible para tags de celda de moneda. El mecanismo relay opera exclusivamente sobre el bearer ADV.

2. Flood Gestionado: Como Funciona el Relay

BLE Mesh usa relay por flood gestionado, no tablas de enrutamiento. Cada nodo con relay habilitado retransmite mensajes recibidos, sujeto a tres controles:

  • TTL (Time To Live): Contador 7-bit, decrementado en cada salto. Cuando llega a 0, el mensaje se detiene. TTL por defecto: 5-7 para almacenes, 10+ para campus.
  • Cache de Mensajes: Cada nodo almacena mensajes recientes vistos, identificados por (SRC, SEQ). Minimo 2 entradas; implementaciones practicas usan 32-256. Mensajes duplicados se descartan silenciosamente, previniendo bucles.
  • Coincidencia de Network Key: Solo se retransmiten mensajes cifrados con una network key conocida.

Temporizacion de retransmision relay: tras recibir un mensaje, el relay espera 3.5 ms (backoff fijo) mas 0-10 ms aleatorio, luego retransmite en los tres canales de advertising. Latencia por salto: aproximadamente 4-15 ms.

Por que flood gestionado en lugar de enrutamiento? Los protocolos mesh tradicionales (Zigbee, Thread) usan tablas de enrutamiento que requieren memoria (8-16 bytes por entrada), actualizaciones periodicas de ruta (consumiendo energia) y tiempo de convergencia cuando la topologia cambia (segundos a minutos). Para tags de activos moviles, la convergencia de tablas de enrutamiento es impractica. El flood gestionado evita los tres: sin estado de enrutamiento, sin actualizaciones de ruta, adaptacion instantanea de ruta. El costo es mayor duplicacion de mensajes y utilizacion de canal.

3. Seleccion de Nodos Relay para Tags de Activos

No todos los tags deben ser relay. La funcionalidad relay anade 200-500 uA al consumo promedio, catastrofico para tags de celda de moneda. La estrategia: designar nodos de infraestructura como relays, mientras los tags de activos operan como publicadores no-relay.

Criterio Relay Elegible No-Relay
Fuente de energia Red electrica o bateria grande CR2032, CR2477
Movilidad Infraestructura fija Tags moviles
Ubicacion Techos, pasillos, entradas Aleatoria en activos
Entorno de radio RSSI estable (> -70 dBm) Variable por movimiento

Los despliegues de produccion usan 20-30 nodos relay alimentados por red electrica para cobertura de backbone mesh, mientras 500-2000 tags de activos publican datos como nodos no-relay. La razon relay-to-tag depende de la escala:

Escala Relays Tags Ratio
Pequeno (2,000 m2) 5-8 50-100 ~10%
Medio (10,000 m2) 15-25 300-500 ~5%
Grande (30,000 m2) 40-60 1000-2000 ~3%
Campus 80-150 3000-5000 ~2-3%

4. Presupuesto de Energia: Relay vs No-Relay

Tag No-Relay (nRF52840)

Estado Corriente Intervalo Promedio
Sleep (retencion RAM) 1.5 uA 1.5 uA
RC32K + RTC 0.2 uA 0.2 uA
Advertiser TX (+4 dBm) 4.6 mA 100 ms 24.3 uA
Advertiser RX 5.2 mA 100 ms 23.4 uA
Lectura sensor (SHT40) 0.9 mA 10 s 0.18 uA
Total ~49.6 uA

CR2032 (175 mAh util), intervalo 100 ms:

Vida = 175,000 uAh / 49.6 uA = 3,528 h = 147 dias

Intervalo 1 segundo (modo bajo consumo):

Total promedio = 6.5 uA
Vida = 175,000 / 6.5 = 26,923 h = 3.1 anos

Tag Relay (nRF52840, escaneo continuo)

Estado Corriente Duty Promedio
Sleep 1.5 uA 1.5 uA
Scanner RX (3 canales) 5.2 mA 30% 1,560 uA
Relay TX 4.6 mA 0.5% 23 uA
Propio advertise 4.6 mA 0.05% 2.3 uA
Total ~1,592 uA = 1.59 mA

CR2032: 175,000 / 1,592 = 110 horas = 4.6 dias (impractico)

4x AA (2,500 mAh): 2,500,000 / 1,592 = 1,571 h = 65 dias

Red electrica: ilimitado

Conclusion: los nodos relay requieren energia externa. Los tags de celda de moneda nunca deben habilitar relay. Los despliegues de produccion usan infraestructura relay dedicada alimentada por red electrica.

5. Latencia y Throughput de Mensajes

Latencia por Salto

Cada salto relay anade: procesamiento del receptor (1-3 ms) + backoff relay (3.5 + 0-10 ms) + evento advertising (1.1 ms) = 5-16 ms tipico, 20 ms peor caso.

5 saltos: 25-80 ms tipico, 100-150 ms peor caso
10 saltos: 50-160 ms tipico, 200-300 ms peor caso

Congestion de Canal

Carga (msgs/s) Utilizacion Tasa de Perdida Notas
50 ~1% <0.1% Limpio
200 ~4% 0.5-1% Normal 500 nodos
500 ~10% 2-5% Cerca del limite
1000 ~21% 8-15% Congestion
2000 ~42% 25-40% No confiable

Para mesh de 500 nodos, 5% relays, TTL=7, 1 msg/10s:

Original: 500 x 0.1 = 50 msgs/s
Amplificacion relay: x3.3
Total: 165 msgs/s, utilizacion 3.4%, perdida <0.5%

A 1 msg/s (seguimiento en tiempo real):

Total: 1,650 msgs/s, utilizacion 34%, perdida 15-25% (requiere subnetting)

6. Analisis de Escalabilidad

Nodos Relays TTL Carga Perdida P95 Veredicto
100 5 5 33/s <0.1% 40 ms Excelente
500 25 7 165/s 0.5% 80 ms Bueno
1000 50 7 330/s 2-3% 120 ms Aceptable
2000 100 10 660/s 5-8% 200 ms Marginal
5000 250 10 1650/s 15-25% 500 ms Subnet requerido
5000 (5 subnets) 250 7 330/sub 2-3% 120 ms Bueno

Estrategia de Subnetting

  • Geografico: Un subnet por piso/edificio. Nodos puente en entradas.
  • Funcional: Un subnet por aplicacion. Reduce trafico cruzado.
  • Jerarquico: Subnet backbone (solo relay, red electrica) conectando subnets de tags. Mas escalable.

Cada subnet soporta 32,767 direcciones unicast. La constraint real es utilizacion de canal, no espacio de direcciones.

7. Directed Forwarding (Mesh 1.1)

Mesh 1.1 (2023) introdujo directed forwarding: rutas pre-calculadas para mensajes unicast en lugar de flood gestionado. Solo los nodos en la ruta reenvian el mensaje.

Beneficios: 60-80% menos utilizacion de canal para trafico unicast, 5000+ nodos por subnet sin subnetting, 20-30% menos latencia.

Compromisos: memoria de tabla de enrutamiento (0.4-3.2 KB RAM), convergencia de ruta (2-10s en cambio topologico), requiere stack Mesh 1.1.

Recomendado: habilitar directed forwarding en nodos relay de infraestructura fija, mantener flood gestionado para tags moviles.

8. Aprovisionamiento a Escala

El aprovisionamiento asigna direccion unicast, network key, app key e IV index. Usa PB-ADV (3-8s por dispositivo) o PB-GATT (10-20s).

Aprovisionamiento por lotes con sesiones paralelas:

Secuencial: 1000 x 5s = 83 minutos
Lote (10): 8.3 minutos
Lote (20): 4.2 minutos

Limite practico: 20 sesiones paralelas antes de que la congestion cause fallos.

Asignacion de Direcciones

Rango Proposito Cantidad
0x0001-0x00FF Aprovisionadores 255
0x0100-0x0FFF Relay/infraestructura 3,840
0x1000-0x7EFF Tags de activos 28,160
0x7F00-0x7FFF Reservado 256

9. Arquitectura de Seguridad

Clave Alcance Proposito
Device Key (128-bit) Por dispositivo, solo aprovisionador Configuracion, reset de nodo
Network Key (128-bit) Por subnet, todos los nodos Cifrado capa de red
App Key (128-bit) Por aplicacion Capa de acceso, datos de sensor

Los nodos relay reenvian mensajes usando la network key pero no pueden descifrar el payload de aplicacion. Un relay comprometido gana acceso de red pero no a datos de sensor.

Actualizacion IV

El SEQ de 24 bits proporciona proteccion contra replay. El IV index (32-bit) se incrementa para resetear el espacio SEQ. Intervalo minimo: 96 horas. A 1 msg/10s por tag, el desbordamiento de SEQ toma 1,942 dias (5.3 anos). Las actualizaciones IV son raras para tags de activos.

Aislamiento Multi-Tenant

Multiple app keys proporcionan aislamiento logico. Cada tenant obtiene una app key unica; los tags no pueden leer los datos de los demas incluso compartiendo la misma network key e infraestructura relay.

10. BLE Mesh vs Thread vs Zigbee

Parametro BLE Mesh Thread Zigbee 3.0
PHY rate 1-2 Mbps 250 kbps 250 kbps
Relay Flood gestionado/directed Enrutamiento RPL Arbol + mesh
Estado enrutamiento 0 KB 1-4 KB 2-8 KB
Max nodos 1000-5000/subnet 250-500 250-500
Corriente sleep 1.5-5 uA 3-10 uA 2-5 uA
TX (+4 dBm) 4.6 mA 8.0 mA 8.0 mA
Nodo movil Excelente Pobre Pobre

BLE Mesh gana para tags de activos en tres dimensiones: menor corriente TX (PHY 1 Mbps vs 250 kbps), adaptacion instantanea de nodo movil (flood vs convergencia de enrutamiento) y compatibilidad nativa de radio BLE.

11. Integracion de Gateway

Un gateway mesh participa en la mesh (tiene network key) y tiene conectividad IP (Ethernet, Wi-Fi, celular). Recibe mensajes mesh y los reenvia a la nube via MQTT o HTTPS.

Dos disenos: (1) Gateway proxy usando GATT proxy service para acceso ad-hoc; (2) Gateway embebido (nRF52840 + Wi-Fi) operando 24/7 con puente MQTT.

Densidad de gateway: 1 por 200-500 nodos mesh. Multiples gateways proporcionan redundancia; la nube desduplica por (SRC, SEQ).

Tag --> Relay --> Relay --> Gateway --> MQTT --> Dashboard
End-to-end: 200-800 ms

12. Comparacion de Stacks Mesh

Fabricante SDK SoC Mesh 1.1 RX Notas
Nordic NCS 2.5+ nRF52840/nRF5340 Si 5.2 mA Mejor docs, Zephyr
Silicon Labs GSDK 4.3+ EFR32BG22/BG24 Si 4.8 mA Menor RX, BG24 96KB
TI BLE-STACK 5.x CC2642R/CC2652R Parcial 5.9 mA SimpleLink
Espressif ESP-IDF ESP32-C3/C6 No (1.0) 8-12 mA Wi-Fi+BLE gateway

Para tags de activos, Nordic nRF52840 es el predeterminado: stack maduro, mejor documentacion, menor corriente combinada sleep+scan. SiLabs EFR32BG24 es fuerte para directed forwarding (mas RAM). ESP32-C3/C6 destaca para gateways que necesitan Wi-Fi.

13. Ejemplos de Codigo

Configuracion Relay (nRF Connect SDK / Zephyr)

#include 

static void configure_relay_node(uint16_t addr)
{
    int err;
    uint8_t count, intvl;
    
    err = bt_mesh_cfg_relay_set(net_key_idx, addr,
        BT_MESH_RELAY_ENABLED,
        BT_MESH_TRANSMIT(1, 10),
        &count, &intvl);
    if (err) {
        printk("Relay set failed: %d", err);
        return;
    }
    
    err = bt_mesh_cfg_ttl_set(net_key_idx, addr, 7);
}

Publicacion de Datos de Sensor

#define SENSOR_DATA_OP  BT_MESH_MODEL_OP_2(0x12, 0x00)

struct __attribute__((packed)) sensor_payload {
    int16_t temperature;
    uint16_t humidity;
    uint16_t battery_mv;
};

static int publish_sensor(int16_t temp, uint16_t hum, uint16_t batt)
{
    struct sensor_payload p = { temp, hum, batt };
    struct bt_mesh_msg_ctx ctx = {
        .addr = 0xC001,
        .send_ttl = 7,
        .app_idx = app_key_idx,
    };
    
    BT_MESH_MODEL_BUF_DEFINE(buf, SENSOR_DATA_OP, sizeof(p));
    bt_mesh_model_msg_init(&buf, SENSOR_DATA_OP);
    net_buf_simple_add_mem(&buf, &p, sizeof(p));
    return bt_mesh_model_publish(&sensor_model);
}

Python: Estimador de Escalabilidad

class MeshScalability:
    def __init__(self, n_nodes, relay_ratio, ttl, msg_interval_s, subnets=1):
        self.n = n_nodes
        self.relays = int(n_nodes * relay_ratio)
        self.ttl = ttl
        self.interval = msg_interval_s
        self.subnets = subnets
        self.capacity = 4800
    
    def relay_amp(self):
        return 1 + self.relays * 0.3 * min(self.ttl / 7.0, 1.0)
    
    def total_load(self):
        per_subnet = self.n / self.subnets
        return (per_subnet / self.interval) * self.relay_amp()
    
    def utilization(self):
        return self.total_load() / self.capacity
    
    def loss(self):
        u = self.utilization()
        if u < 0.04: return u * 0.1
        elif u < 0.10: return 0.004 + (u - 0.04) * 0.3
        elif u < 0.21: return 0.022 + (u - 0.10) * 0.5
        else: return 0.077 + (u - 0.21) * 1.2

m = MeshScalability(500, 0.05, 7, 10)
print(f"Load: {m.total_load():.0f} msgs/s, Loss: {m.loss()*100:.1f}%")

14. Depuracion y Diagnostico

  • Sniffer mesh: Usar nRF Sniffer para Bluetooth LE en Wireshark. Filtrar por tipo advertising mesh (0x2B). Inspeccionar decremento TTL, retransmisiones relay y cache hits.
  • Monitoreo heartbeat: Configurar publicacion heartbeat desde nodos relay. El destino recibe mensajes periodicos con TTL y RSSI para visibilidad de salud de red.
  • Estadisticas relay: Rastrear conteo relay por nodo, tasa de cache hit y fallos de retransmision. Alta tasa de cache hit indica buena cobertura; baja sugiere brechas.
  • Problemas comunes: Agotamiento TTL (aumentar TTL o anadir relays), overflow de cache (aumentar tamanho), congestion de canal (reducir tasa o subnet), timeout de aprovisionamiento (reducir tamano de lote).

15. Checklist de Diseno de Produccion

  • [ ] Determinar razon relay vs no-relay (objetivo 3-10%)
  • [ ] Calcular presupuesto de energia: nodos relay deben tener energia externa
  • [ ] Establecer TTL: 5-7 un edificio, 10+ campus
  • [ ] Configurar cache de mensajes: minimo 32 entradas (192 bytes RAM)
  • [ ] Planear arquitectura subnet para despliegues >1,000 nodos
  • [ ] Disenar flujo de aprovisionamiento por lotes (max 20 paralelo)
  • [ ] Configurar jerarquia network/app key para aislamiento multi-tenant
  • [ ] Establecer intervalo de publicacion: 10s monitoreo, 1s tiempo real (requiere subnetting)
  • [ ] Stress test bajo congestion: inyectar 2x trafico esperado y medir perdida
  • [ ] Planear densidad de gateway: 1 por 200-500 nodos, con redundancia
  • [ ] Habilitar monitoreo heartbeat
  • [ ] Verificar compatibilidad Mesh 1.1 directed forwarding si >2,000 nodos
  • [ ] Probar comportamiento de tag movil: verificar adaptacion de ruta entre zonas
  • [ ] Documentar procedimiento de actualizacion IV y calendario de key refresh
  • [ ] Planear OTA de firmware: usar distribucion via modelo mesh para actualizaciones masivas

Conclusion

Las redes mesh BLE transforman el seguimiento de activos de un modelo de salto unico saturado de gateways a una red escalable y auto-reparable. Las decisiones clave de ingenieria son: (1) usar infraestructura con red electrica para nodos relay, nunca tags de celda de moneda; (2) dimensionar la razon relay-to-tag al 3-10% segun distribucion fisica; (3) monitorear utilizacion de canal y subnetear antes de exceder 1,000 nodos activos; (4) aprovechar directed forwarding de Mesh 1.1 para escalabilidad de backbone; (5) planear aprovisionamiento por lotes y redundancia de gateway para despliegue de produccion.

El analisis de presupuesto de energia es implacable: un tag CR2032 con relay dura 4.6 dias, mientras un tag no-relay a 1 segundo dura 3.1 anos. Esta diferencia de 2,400x dicta la arquitectura: relays de infraestructura con red electrica, tags de bateria como publicadores no-relay. Separe esto correctamente, y la mesh maneja el resto. Ya sea desplegando 50 tags en un almacen o 5,000 en un campus industrial, estos principios ayudan a arquitecturar una red mesh de BLE tag que funciona en produccion.