Sistema integral para gestión ganadera con enfoque en conteo asistido por IoT, trazabilidad operativa y control de usuarios por roles.
BoviSense conecta tres mundos en una sola experiencia:
- Operación de campo (ganadero): configuración de finca, conexión al equipo, ejecución de conteos y consulta de historial.
- Gestión administrativa: alta, edición y baja de usuarios con control de roles/estado.
- Integración técnica: backend con Firebase + API REST y puente con dispositivos ESP32/Jetson para el flujo de conteo.
El objetivo es claro: reducir errores manuales en conteos, detectar diferencias contra lo esperado y generar alertas accionables.
- Gestión completa de usuarios (
crear,editar,eliminar). - Asignación de rol (
administradorousuario) y estado (activooinactivo). - Generación automática de contraseña inicial y envío de credenciales por correo SMTP.
- Búsqueda y filtros por estado/rol.
- Dashboard operativo con métricas rápidas:
- conteos totales
- alertas pendientes
- últimos conteos y alertas
- Configuración de finca (nombre + cantidad esperada de ganado).
- Flujo guiado de conteo desde la app:
- conexión al equipo
- verificación de estado
- inicio/parada del conteo
- guardado del resultado final
- Historial de conteos con detalle por sesión.
- Gestión de alertas (incluye marcado como leída).
- Autenticación con Firebase Authentication.
- Autorización por roles en backend.
- Bloqueo de acceso para usuarios inactivos.
- Cambio y recuperación de contraseña desde la app.
Flutter App (MVVM + Provider)
|
| HTTPS + Firebase ID Token
v
Node.js/Express API
|
+--> Firebase Auth (validación de identidad)
+--> Cloud Firestore (Usuarios, Configuración, Conteos, Alertas)
+--> SMTP (envío de credenciales)
|
+--> Integración con flujo IoT (ESP32/ESP8266/Jetson/LoRa)
- Frontend: Flutter, Provider, Firebase (Auth + Firestore), HTTP.
- Backend: Node.js, Express, Firebase Admin SDK, Nodemailer.
- IoT/Bridge: ESP32 BLE bridge, ESP8266 hotspot/descubrimiento UDP+HTTP, canal LoRa hacia Jetson.
.
├── frontend/ # App Flutter
├── backend/ # API REST y lógica de negocio
├── comunicacion-iot/ # Sketches y documentación de integración IoT
└── jetson/ # Scripts desplegables para ejecución en Jetson
GET /listar usuariosPOST /crear usuarioPUT /:uidactualizar usuarioDELETE /:uideliminar usuario
GET /dashboardGET /configuracionPUT /configuracionGET /dispositivoPOST /conteosGET /conteosGET /conteos/:idGET /alertasPUT /alertas/:id/leer
- Flutter SDK 3.10+ (recomendado canal estable).
- Node.js 18+.
- Proyecto Firebase configurado (Auth + Firestore).
- Cuenta SMTP válida para envío de credenciales.
- (Opcional) hardware IoT para pruebas de campo.
Entrar al backend:
cd backendInstalar dependencias:
npm installCrear backend/.env con variables necesarias:
PORT=3000
GOOGLE_APPLICATION_CREDENTIALS=./ruta/a/service-account.json
SMTP_HOST=smtp.tu-proveedor.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=tu_usuario
SMTP_PASS=tu_password
SMTP_FROM="BoviSense <no-reply@tu-dominio.com>"Iniciar servidor:
npm run devPrueba rápida:
GET http://localhost:3000/healthEntrar al frontend:
cd frontendInstalar dependencias:
flutter pub getConfigurar URL del backend en:
frontend/lib/core/config/app_config.dart
Ejecutar app:
flutter run- Registrar usuarios desde módulo administrador.
- Configurar finca (cantidad esperada).
- Conectar equipo de conteo.
- Ejecutar conteo y guardar resultado.
- Revisar diferencia y alertas.
- Consultar historial para seguimiento operativo.
- Aplicación funcional en fase final de integración.
- Frontend y backend productivos para pruebas operativas.
- Integración IoT disponible con rutas de validación en
comunicacion-iot/y scripts enjetson/.
- El mensaje de
packages have newer versions incompatible with dependency constraintsen Flutter es una advertencia, no un error de compilación. - La app usa token de Firebase para consumir la API; si el backend rechaza acceso, revisar primero credenciales de Firebase Admin y estado/rol del usuario.
BoviSense está diseñado para resolver una necesidad concreta del campo: tomar decisiones con datos confiables, en el momento correcto y con una operación simple para el usuario final.