Conectar múltiplos periféricos Bluetooth a um único dispositivo central (telemóvel, Pi, PC, gateway) requer escolher a **topologia** e **configuração stack** certas.
Opções Topologia
1. Central/Periférico (Estrela / Master-Slave) — Clássico
- Central (seu servidor/app) conecta a **múltiplos Periféricos** (sensores, wearables, tags).
- **Máx conexões concorrentes:** Bluetooth 4.x: 3–7; 5.0+: **até 20+** (dependente controlador).
- Periféricos **não falam entre si** — todo tráfego roteia através Central.
- Simples, amplamente suportado, latência determinística.
2. Bluetooth Mesh — Muitos-para-Muitos
- **Todos nós retransmitem mensagens** (flood gerido). Nenhum coordenador central necessário.
- **Escalável:** Centenas nós (luzes, interruptores, sensores).
- **Auto-recuperação:** Rotas em torno nós falhados.
- **Latência maior**, throughput menor (~10–20 kbps efetivo). Não para streaming.
- Requer **firmware mesh-capable** em todos nós (Nordic, Silicon Labs, ESP32, Zephyr RTOS).
3. Sem Conexão / Broadcast (Beacon / Advertising)
- Periféricos **anunciam** dados (iBeacon, Eddystone, custom). Central **escaneia** — sem conexão.
- **Scanners ilimitados**, ultra-baixo consumo (periférico dorme 99%).
- Unidirecional (periférico → central). Sem ack, sem segurança (a menos payload encriptado).
Passos Implementação (Modelo Central/Periférico)
- Ative Bluetooth no central (Linux: `bluetoothctl power on`; Android: `BluetoothAdapter.enable()`; iOS: `CBCentralManager`).
- Escaneie e Filtre para UUIDs serviço alvo / nomes / MACs.
- Emparelhe / Vincule cada periférico (MITM, OOB, ou Just Works). Guarde chaves para auto-reconexão.
- Conecte e Descubra Serviços (`connectGatt` / `connectPeripheral`). Cache handles.
- Ative Notificações/Indicações em CCCDs característica (0x2902) para dados tempo real.
- Multiplexe: Use **clientes GATT / filas separadas por dispositivo** na sua app. Event loop trata callbacks.
- Gestão Parâmetros Conexão: Peça **intervalo conexão** (min/max), **latência slave**, **timeout supervisão** por papel dispositivo (taxa alta IMU, baixa temp).
- Trate Desconexões/Reconexões: Backoff exponencial, chaves bonding persistentes.
Stacks Código
- Linux/Pi: **BlueZ (D-Bus API)** + Python `bleak` / `dbus-next` / `bluezero`.
- Android: `BluetoothGatt`, `BluetoothLeScanner` (Kotlin Flow/RxJava).
- iOS/macOS: **CoreBluetooth** (`CBCentralManager`, `CBPeripheral` — base delegate).
- Cross-Platform: **Flutter `flutter_blue_plus`**, **React Native `react-native-ble-plx`**, **.NET `BluetoothLE`**.
- Embedded Central: **Zephyr RTOS** (Bluetooth Host + Controller), **ESP-IDF** (NimBLE/Bluedroid).
Armadilhas Críticas
- Limite Conexões: Verifique spec controlador (Nordic nRF52: 20; nRF53: 32; ESP32: 3–7). Exceda → `CONN_FAILED`.
- Throughput: 1 conexão @ 30 Hz notify ≈ 10 kbps. 10 dispositivos = 100 kbps — OK. 20 @ 100 Hz = saturação.
- Coexistência: Wi-Fi 2.4 GHz mata throughput BLE. Use **AFH (Adaptive Frequency Hopping)**, separe antenas, prefira 5 GHz Wi-Fi.
- Energia: Central escaneando/conectado = corrente alta. Duty-cycle scanning.
Escolha **Central/Periférico** para <10–20 sensores com streams fiáveis. Escolha **Mesh** para 50+ nós iluminação/edifício. Escolha **Beacon** para telemetria ultra-baixo-consumo.