| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <?php
- // Configuración PRTG
- $prtgUrl = 'http://192.168.2.3';
- $username = 'prtgadmin';
- $password = 'Ittec2025!';
- // Configuración BD
- $host = 'localhost';
- $port = 3306;
- $database = 'samqa';
- $dbUsername = 'root';
- $dbPassword = 'root';
- // Función para hacer peticiones HTTP
- function makeRequest($url, $params) {
- $queryString = http_build_query($params);
- $fullUrl = $url . '?' . $queryString;
-
- echo "[REQUEST] " . date('Y-m-d H:i:s') . " - $fullUrl\n";
-
- $context = stream_context_create([
- 'http' => [
- 'timeout' => 30,
- 'method' => 'GET'
- ]
- ]);
-
- $response = @file_get_contents($fullUrl, false, $context);
-
- if ($response === false) {
- $error = error_get_last();
- echo "[ERROR] " . date('Y-m-d H:i:s') . " - Error: " . $error['message'] . "\n";
- return false;
- }
-
- echo "[SUCCESS] " . date('Y-m-d H:i:s') . " - Respuesta recibida\n";
- return $response;
- }
- // Función para obtener sensores del grupo SAM
- function getSAMSensors($prtgUrl, $username, $password) {
- echo "\n=== CONSULTANDO SENSORES DEL GRUPO SAM ===\n";
-
- $params = [
- 'content' => 'sensors',
- 'output' => 'json',
- 'columns' => 'objid,lastvalue,parentid',
- 'filter_group' => 'SAM',
- 'username' => $username,
- 'password' => $password
- ];
-
- $response = makeRequest($prtgUrl . '/api/table.json', $params);
-
- if ($response) {
- echo "\n=== RESPUESTA SENSORES SAM ===\n";
- echo $response . "\n";
- echo "=== FIN RESPUESTA SENSORES ===\n\n";
- return $response;
- }
-
- return false;
- }
- // Función para conectar a BD
- function connectDB($host, $port, $database, $username, $password) {
- try {
- $pdo = new PDO("mysql:host=$host;port=$port;dbname=$database;charset=utf8", $username, $password);
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- echo "[DB] Conexión establecida\n";
- return $pdo;
- } catch (PDOException $e) {
- echo "[ERROR DB] " . $e->getMessage() . "\n";
- return false;
- }
- }
- // Matriz de relación sensor -> contador (hardcodeada)
- $sensorCounterMap = [
- //2098 => 1,
- 2099 => 13,
- 2123 => 14
-
- ];
- // Función para buscar EQUI_COEQ por parentid
- function getEquiCoeq($pdo, $parentid) {
- $stmt = $pdo->prepare("SELECT EQUI_COEQ FROM s002v01tequi WHERE JSON_CONTAINS(EQUI_OTCO, JSON_QUOTE(?))");
- $stmt->execute([$parentid]);
- $result = $stmt->fetchColumn();
- return $result ?: null;
- }
- // Función para buscar lista de CONA_IDCO por EQUI_COEQ
- function getConaIdcoList($pdo, $equipCoeq) {
- $stmt = $pdo->prepare("SELECT CONA_IDCO FROM S002V01TCONA WHERE CONA_COEQ = ?");
- $stmt->execute([$equipCoeq]);
- $results = $stmt->fetchAll(PDO::FETCH_COLUMN);
- return $results ?: [];
- }
- // Función para registrar medición
- function registerMeasurement($pdo, $mediCore, $lastValue) {
- $stmt = $pdo->prepare("
- INSERT INTO s002v01tmedi
- (MEDI_NULI, MEDI_CORE, MEDI_VALO, MEDI_WSRE, MEDI_HORE)
- VALUES (1, ?, ?, 1, NOW())
- ");
-
- return $stmt->execute([$mediCore, $lastValue]);
- }
- // Ejecutar recolección
- echo "=== RECOLECTOR DE MEDICIONES PRTG ===\n";
- echo "Fecha: " . date('Y-m-d H:i:s') . "\n";
- echo "Servidor PRTG: $prtgUrl\n";
- echo "Grupo: SAM\n";
- try {
- // Conectar BD
- $pdo = connectDB($host, $port, $database, $dbUsername, $dbPassword);
- if (!$pdo) {
- throw new Exception("No se pudo conectar a la base de datos");
- }
-
- // Consultar sensores del grupo SAM
- $sensorsResponse = getSAMSensors($prtgUrl, $username, $password);
- if (!$sensorsResponse) {
- throw new Exception("No se obtuvieron sensores de PRTG");
- }
-
- $sensors = json_decode($sensorsResponse, true);
- if (!$sensors || !isset($sensors['sensors'])) {
- throw new Exception("No se pudo decodificar respuesta de sensores");
- }
-
- echo "\n=== PROCESANDO SENSORES ===\n";
- $processed = 0;
- $registered = 0;
-
- foreach ($sensors['sensors'] as $sensor) {
- $objid = $sensor['objid'];
- $parentid = $sensor['parentid'];
- $lastValueRaw = $sensor['lastvalue_raw'] ?? '';
-
- // Validar lastvalue_raw - si está vacío, usar 0
- $lastValue = (empty($lastValueRaw) || trim($lastValueRaw) === '') ? 0 : $lastValueRaw;
-
- echo "[SENSOR] Procesando objid: $objid, parentid: $parentid, valor: $lastValue\n";
-
- // 1. Verificar si el sensor está en la matriz
- if (!isset($sensorCounterMap[$objid])) {
- echo "[SKIP] Sensor $objid no está en la matriz de relación\n";
- $processed++;
- continue;
- }
-
- $expectedCounter = $sensorCounterMap[$objid];
- echo "[MATRIX] Sensor $objid -> Contador esperado: $expectedCounter\n";
-
- // 2. Buscar EQUI_COEQ usando parentid
- $equipCoeq = getEquiCoeq($pdo, $parentid);
- if (!$equipCoeq) {
- echo "[SKIP] No se encontró EQUI_COEQ para parentid: $parentid\n";
- $processed++;
- continue;
- }
-
- echo "[FOUND] EQUI_COEQ: $equipCoeq\n";
-
- // 3. Buscar lista de CONA_IDCO
- $conaIdcoList = getConaIdcoList($pdo, $equipCoeq);
- if (empty($conaIdcoList)) {
- echo "[SKIP] No se encontraron contadores para EQUI_COEQ: $equipCoeq\n";
- $processed++;
- continue;
- }
-
- echo "[FOUND] Contadores disponibles: " . implode(', ', $conaIdcoList) . "\n";
-
- // 4. Verificar si el contador esperado está en la lista
- if (!in_array($expectedCounter, $conaIdcoList)) {
- echo "[SKIP] Contador esperado $expectedCounter no está en la lista de contadores del dispositivo\n";
- $processed++;
- continue;
- }
-
- echo "[MATCH] Contador $expectedCounter encontrado en dispositivo\n";
-
- // 5. Registrar medición
- if (registerMeasurement($pdo, $expectedCounter, $lastValue)) {
- echo "[SUCCESS] Medición registrada con contador: $expectedCounter\n";
- $registered++;
- } else {
- echo "[ERROR] No se pudo registrar medición\n";
- }
-
- $processed++;
- echo "\n";
- }
-
- echo "=== RESUMEN ===\n";
- echo "Sensores procesados: $processed\n";
- echo "Mediciones registradas: $registered\n";
- echo "[INFO] Recolección completada\n";
-
- } catch (Exception $e) {
- echo "[ERROR FATAL] " . date('Y-m-d H:i:s') . " - " . $e->getMessage() . "\n";
- }
- echo "\n=== FIN RECOLECTOR ===\n";
- ?>
|