Simulador profesional de flota de dispositivos para Mender.io. Este proyecto permite simular cientos de dispositivos IoT de diferentes verticales industriales para pruebas de plataforma.
- Persistencia: Dispositivos almacenados en SQLite con llaves RSA, identidad e inventario
- Concurrencia: Arquitectura asyncio para manejar cientos de dispositivos en un solo proceso
- Multi-industria: Perfiles configurables para Automotive, Smart Buildings, Medical, Industrial IoT y Retail
- Simulación realista:
- Descarga con tiempo basado en ancho de banda virtual
- Estados de actualización: Downloading → Installing → Rebooting → Success/Failure
- Tasa de éxito configurable (80% por defecto)
- Logs de error realistas
- Manejo de señales: Cierre graceful con SIGTERM/SIGINT
- Python 3.9+
- Cuenta en Mender.io (hosted o self-hosted)
git clone https://github.com/your-org/mender-simulator.git
cd mender-simulatorpython3 -m venv venv
source venv/bin/activate # Linux/macOS
# o
venv\Scripts\activate # Windowspip install -e .Esto instala el simulador en modo editable junto con todas las dependencias.
cp config/config.yaml config/config.local.yaml
# Editar config/config.local.yaml con tu tenant_tokenEdita config/config.yaml:
server:
url: "https://hosted.mender.io"
tenant_token: "TU_TENANT_TOKEN"
poll_interval: 30
simulator:
success_rate: 0.8 # 80% de actualizaciones exitosas
log_file: "simulator.log"
log_level: "INFO"
database_path: "devices.db"
industries:
automotive:
enabled: true
count: 10
bandwidth_kbps: 500
# ...| Industria | Device Type | Identity | Bandwidth |
|---|---|---|---|
| Automotive | tcu-4g-lte | mac, vin | 500 KB/s |
| Smart Buildings | bms-controller-hvac | mac, serial_number | 1000 KB/s |
| Medical | patient-monitor-icu | mac, serial_number | 2000 KB/s |
| Industrial IoT | plc-gateway-modbus | mac, serial_number | 250 KB/s |
| Retail | pos-terminal-emv | mac, pos_sn | 800 KB/s |
Notas:
device_typees parte del inventory, no del identitysuccess_rateen config.yaml controla la tasa de éxito global (0.8 = 80%)
Los atributos de inventario son principalmente estáticos y representan el estado del dispositivo, no telemetría en tiempo real.
Nota: Mender NO es un sistema de telemetría en tiempo real. Los atributos de inventario se actualizan durante el polling (cada 30-60 segundos) y representan información del dispositivo, no métricas de sensores.
| Atributo | Descripción |
|---|---|
| device_id | Identificador único del dispositivo |
| device_type | Tipo de dispositivo (de config.yaml) |
| industry | Vertical industrial |
| artifact_name | Nombre del artefacto (formato: {device_type}-{version}) |
| rootfs-image.version | Versión del rootfs (igual que artifact_name) |
| kernel_version | Versión del kernel |
| firmware_version | Versión del firmware |
| simulator_version | Versión del simulador |
| last_seen | Última conexión (ISO 8601) |
| Atributo | Descripción |
|---|---|
| oem_variant | Variante OEM (standard, premium, sport) |
| odometer_km | Kilómetros recorridos |
| Atributo | Descripción |
|---|---|
| zone_type | Tipo de zona (hvac, lighting, security) |
| floor | Piso del edificio (1-50) |
| room_count | Número de habitaciones |
| hvac_mode | Modo HVAC (cooling, heating, idle, auto) |
| Atributo | Descripción |
|---|---|
| fda_device_class | Clase FDA (II, III) |
| compliance_standards | Estándares de cumplimiento |
| calibration_due | Fecha de próxima calibración |
| software_validated | Software validado (true) |
| Atributo | Descripción |
|---|---|
| plant_id | ID de planta (PLANT-A, B, C) |
| line | Línea de producción (L01-L10) |
| unit | Unidad (U000-U099) |
| supported_protocols | Protocolos soportados |
| plc_connected | PLC conectado (true/false) |
| uptime_hours | Horas de uptime desde último reinicio |
| Atributo | Descripción |
|---|---|
| region | Región (NA, EU, APAC, LATAM) |
| store_id | ID de tienda (1000-9999) |
| payment_modules | Módulos de pago (chip, nfc, magstripe) |
| receipt_printer | Impresora conectada (true/false) |
# Usando configuración por defecto
python -m mender_simulator
# Especificando archivo de configuración
python -m mender_simulator -c config/config.local.yaml| Señal | Comando | Descripción |
|---|---|---|
| SIGINT | Ctrl+C |
Detener el simulador (graceful shutdown) |
| SIGTERM | kill <pid> |
Detener el simulador (graceful shutdown) |
| SIGUSR1 | kill -USR1 <pid> |
Forzar poll inmediato (inventario + check updates) |
Ejemplo: Forzar poll inmediato
# Obtener el PID del simulador
pgrep -f mender_simulator
# Forzar poll inmediato
kill -USR1 <pid># Copiar archivo de servicio
sudo cp mender-simulator.service /etc/systemd/system/
# Crear usuario
sudo useradd -r -s /bin/false mender-simulator
# Crear directorios
sudo mkdir -p /opt/mender-simulator/{data,config}
sudo mkdir -p /var/log/mender-simulator
# Copiar archivos
sudo cp -r src/* /opt/mender-simulator/
sudo cp config/config.yaml /opt/mender-simulator/config/
# Permisos
sudo chown -R mender-simulator:mender-simulator /opt/mender-simulator
sudo chown -R mender-simulator:mender-simulator /var/log/mender-simulator
# Habilitar y arrancar
sudo systemctl daemon-reload
sudo systemctl enable mender-simulator
sudo systemctl start mender-simulator
# Ver logs
sudo journalctl -u mender-simulator -fPara probar despliegues, puedes generar artefactos de demo con el script incluido.
# Instalar mender-artifact
brew install mender-artifact # macOS
# O descargar de https://docs.mender.io/downloads# Solo una industria
./scripts/create-demo-artifacts.sh smart_buildings
./scripts/create-demo-artifacts.sh automotive
./scripts/create-demo-artifacts.sh medical
./scripts/create-demo-artifacts.sh industrial_iot
./scripts/create-demo-artifacts.sh retail
# Todas las industrias
./scripts/create-demo-artifacts.sh all
# Especificar directorio de salida
./scripts/create-demo-artifacts.sh smart_buildings ./my-artifactsCada industria genera 4 versiones: v1.0.0, v1.1.0, v1.2.0, v2.0.0
# Con mender-cli
mender-cli artifacts upload ./artifacts/*.mender
# O usar la UI de Mender para subir manualmenteScript para listar y eliminar dispositivos de Mender.
Obtener un Personal Access Token (PAT) de Mender:
- Ir a Mender UI → Settings → Access Tokens
- Crear nuevo token
- Exportar como variable de entorno
export MENDER_PAT='tu-personal-access-token'./scripts/cleanup-devices.sh list # Todos
./scripts/cleanup-devices.sh list-pending # Pendientes
./scripts/cleanup-devices.sh list-accepted # Aceptados
./scripts/cleanup-devices.sh list-rejected # Rechazados
./scripts/cleanup-devices.sh list-noauth # Sin autorización./scripts/cleanup-devices.sh decommission-pending # Solo pendientes
./scripts/cleanup-devices.sh decommission-accepted # Solo aceptados
./scripts/cleanup-devices.sh decommission-rejected # Solo rechazados
./scripts/cleanup-devices.sh decommission-noauth # Solo noauth
./scripts/cleanup-devices.sh decommission-all # TODOS (cuidado!)# Elimina devices.db y simulator.log
./scripts/cleanup-devices.sh cleanup-local# Ejecutar todos los tests
pytest
# Con cobertura
pytest --cov=src/mender_simulator
# Tests específicos
pytest tests/test_crypto.py -vmender-simulator/
├── src/
│ └── mender_simulator/
│ ├── db/ # Persistencia SQLite
│ │ ├── models.py # Modelos de datos
│ │ └── database.py # Manager async
│ ├── client/ # Cliente Mender API
│ │ ├── auth.py # Autenticación
│ │ ├── inventory.py # Inventario
│ │ └── deployments.py # Despliegues
│ ├── simulation/ # Lógica de simulación
│ │ ├── profiles.py # Perfiles de industria
│ │ └── device_simulator.py
│ ├── utils/ # Utilidades
│ │ ├── crypto.py # RSA keys
│ │ └── config.py # Configuración
│ └── main.py # Orquestador principal
├── tests/ # Tests unitarios
├── config/ # Configuración
└── requirements.txt
El simulador interactúa con los siguientes endpoints:
POST /api/devices/v1/authentication/auth_requests- AutenticaciónPATCH /api/devices/v1/inventory/device/attributes- Actualizar inventarioGET /api/devices/v1/deployments/device/deployments/next- Verificar desplieguesPUT /api/devices/v1/deployments/device/deployments/{id}/status- Reportar estadoPUT /api/devices/v1/deployments/device/deployments/{id}/log- Enviar logs
- Polling: Cada dispositivo consulta el servidor periódicamente
- Deployment Check: Si hay actualización disponible, inicia el proceso
- Downloading: Simula descarga con tiempo basado en tamaño/bandwidth
- Installing: Simula instalación (5-15 segundos)
- Rebooting: Simula reinicio (3-8 segundos)
- Success/Failure: Basado en
success_rate, reporta éxito o fallo con logs
- Fork el repositorio
- Crea una rama feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Agrega nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Crea un Pull Request
MIT License - ver LICENSE para más detalles.