Alerta de emergencia · malla de un salto

La alerta llega aunque no haya red.

Un disparo remoto abre una pantalla de autorización. El gesto del usuario lee el GPS una sola vez, avisa al mapa y enciende una malla Bluetooth entre teléfonos vecinos. Inspirado en Cell Broadcast; FCM hace de stand-in en esta prueba de concepto.

Cliente
Android 8+
Servidor
Next.js 16
Radio
BLE GATT
Identidad
celular E.164
Alerta de emergenciaCBS

Se solicita asistencia en tu zona. Autoriza para compartir tu ubicación. Sin ese gesto no se lee el GPS ni se enciende la radio.

Autorizar
  • • Leyendo ubicación…
  • • Fix: 4.60971, −74.08175 (±12 m)
  • • Malla BLE encendida
  • • Abriendo el chat…

Todo lo sensible cuelga de un único toque.

Cómo funciona

El flujo es lineal hasta el gesto. Después se abre en paralelo: mapa, acuse a la IA y malla peer-to-peer.

  1. 01

    Disparo remoto

    FCM entrega un data message de alta prioridad, incluso con la app cerrada. En un sistema real sería Cell Broadcast, que no pasa por internet.

  2. 02

    Pantalla de autorización

    La notificación abre a pantalla completa, con el teléfono bloqueado. Nada se mide todavía: el GPS y el Bluetooth esperan el gesto.

  3. 03

    GPS de un disparo

    getCurrentLocation entrega una muestra y cierra el proveedor. Sin listener residual, sin rastreo. Si no hay red, el ping falla y da igual.

  4. 04

    Malla y chat

    La radio BLE se enciende aunque falle HTTP. El usuario pasa al chat: el texto viaja entre teléfonos y, si hay cobertura, también hacia la IA.

Cuatro teléfonos, una malla. Sin tabla de rutas.

El advertising sólo anuncia presencia. Los mensajes van por GATT, enteros, sin trocear. Cada nodo es servidor y cliente: de cada pareja conecta el de id menor. Lo que llega se repite una vez; el TTL corta el eco.

  • Descubrimiento. UUID 8f1e2a30-… — no FEAA, que es Eddystone y convierte cualquier beacon en falso positivo.

  • Identidad. SHA-256(celular)[0..2] sobre el aire. Compacto para encaminar, no es privacidad.

  • Inundación. Jitter 10–220 ms antes de repetir. El origen no se reescribe: la respuesta tiene que saber a quién volver.

  • Pasarela. Si un nodo no tiene cobertura, un vecino reenvía el JSON verbatim. El celular del cuerpo sigue siendo el del origen.

Malla BLE de cuatro nodosABCDD sin red celularGATT · inundación · TTL 3
D no tiene cobertura. B hace de pasarela y postea el reporte de D sin reescribir el origen.

Dos destinos, dos contratos

El mapa de esta página y el bot de IA no comparten esquema. El tipo de información lo dice la ruta, no un campo discriminador.

Este backend

POST /api/v1/alert-response

Ping del gesto. Zod estricto, clave anónima de Supabase, RLS de sólo-insert. El mapa se suscribe a los inserts: el pin aparece al pulsar Autorizar.

{
  "device_id": "uuid",
  "timestamp": "2026-08-16T03:19:42Z",
  "location": { "latitude", "longitude", … },
  "ble_status": { "advertising": true }
}

Backend de la IA

POST /alerta · POST /mensaje

Cinco claves exactas. El mensaje añade el texto al final. La URL vive en ajustes del teléfono: cambiar de servidor no exige un APK nuevo.

{
  "lat": 4.6097102,
  "long": -74.0817491,
  "celular": "+573001234567",
  "potencia_red": -85,
  "coneccion_mesh": true
}

El repo

android/
App Kotlin. Emisor y escáner BLE, GPS one-shot, FCM, chat.
backend/
Next.js en Vercel. Ingesta pública, mapa Leaflet, Realtime.
Identidad
El número de teléfono, no el UUID del dispositivo.
Pruebas
Contrato JSON, paquetes, inundación y enlaces en JVM. Radio y GPS, en el teléfono.

El mapa en vivo refleja los pings reales de los teléfonos que autorizaron la alerta.

Abrir mapa en vivo →