test_prtg_api.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. // Configuración PRTG
  3. $prtgUrl = 'http://192.168.2.3';
  4. $username = 'prtgadmin';
  5. $password = 'Ittec2025!';
  6. // Configuración BD
  7. $host = 'localhost';
  8. $port = 3306;
  9. $database = 'samqa';
  10. $dbUsername = 'root';
  11. $dbPassword = 'root';
  12. // Función para hacer peticiones HTTP
  13. function makeRequest($url, $params) {
  14. $queryString = http_build_query($params);
  15. $fullUrl = $url . '?' . $queryString;
  16. echo "[REQUEST] " . date('Y-m-d H:i:s') . " - $fullUrl\n";
  17. $context = stream_context_create([
  18. 'http' => [
  19. 'timeout' => 30,
  20. 'method' => 'GET'
  21. ]
  22. ]);
  23. $response = @file_get_contents($fullUrl, false, $context);
  24. if ($response === false) {
  25. $error = error_get_last();
  26. echo "[ERROR] " . date('Y-m-d H:i:s') . " - Error: " . $error['message'] . "\n";
  27. return false;
  28. }
  29. echo "[SUCCESS] " . date('Y-m-d H:i:s') . " - Respuesta recibida\n";
  30. return $response;
  31. }
  32. // Función para obtener sensores del grupo SAM
  33. function getSAMSensors($prtgUrl, $username, $password) {
  34. echo "\n=== CONSULTANDO SENSORES DEL GRUPO SAM ===\n";
  35. $params = [
  36. 'content' => 'sensors',
  37. 'output' => 'json',
  38. 'columns' => 'objid,lastvalue,parentid',
  39. 'filter_group' => 'SAM',
  40. 'username' => $username,
  41. 'password' => $password
  42. ];
  43. $response = makeRequest($prtgUrl . '/api/table.json', $params);
  44. if ($response) {
  45. echo "\n=== RESPUESTA SENSORES SAM ===\n";
  46. echo $response . "\n";
  47. echo "=== FIN RESPUESTA SENSORES ===\n\n";
  48. return $response;
  49. }
  50. return false;
  51. }
  52. // Función para conectar a BD
  53. function connectDB($host, $port, $database, $username, $password) {
  54. try {
  55. $pdo = new PDO("mysql:host=$host;port=$port;dbname=$database;charset=utf8", $username, $password);
  56. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  57. echo "[DB] Conexión establecida\n";
  58. return $pdo;
  59. } catch (PDOException $e) {
  60. echo "[ERROR DB] " . $e->getMessage() . "\n";
  61. return false;
  62. }
  63. }
  64. // Matriz de relación sensor -> contador (hardcodeada)
  65. $sensorCounterMap = [
  66. //2098 => 1,
  67. 2099 => 13,
  68. 2123 => 14
  69. ];
  70. // Función para buscar EQUI_COEQ por parentid
  71. function getEquiCoeq($pdo, $parentid) {
  72. $stmt = $pdo->prepare("SELECT EQUI_COEQ FROM s002v01tequi WHERE JSON_CONTAINS(EQUI_OTCO, JSON_QUOTE(?))");
  73. $stmt->execute([$parentid]);
  74. $result = $stmt->fetchColumn();
  75. return $result ?: null;
  76. }
  77. // Función para buscar lista de CONA_IDCO por EQUI_COEQ
  78. function getConaIdcoList($pdo, $equipCoeq) {
  79. $stmt = $pdo->prepare("SELECT CONA_IDCO FROM S002V01TCONA WHERE CONA_COEQ = ?");
  80. $stmt->execute([$equipCoeq]);
  81. $results = $stmt->fetchAll(PDO::FETCH_COLUMN);
  82. return $results ?: [];
  83. }
  84. // Función para registrar medición
  85. function registerMeasurement($pdo, $mediCore, $lastValue) {
  86. $stmt = $pdo->prepare("
  87. INSERT INTO s002v01tmedi
  88. (MEDI_NULI, MEDI_CORE, MEDI_VALO, MEDI_WSRE, MEDI_HORE)
  89. VALUES (1, ?, ?, 1, NOW())
  90. ");
  91. return $stmt->execute([$mediCore, $lastValue]);
  92. }
  93. // Ejecutar recolección
  94. echo "=== RECOLECTOR DE MEDICIONES PRTG ===\n";
  95. echo "Fecha: " . date('Y-m-d H:i:s') . "\n";
  96. echo "Servidor PRTG: $prtgUrl\n";
  97. echo "Grupo: SAM\n";
  98. try {
  99. // Conectar BD
  100. $pdo = connectDB($host, $port, $database, $dbUsername, $dbPassword);
  101. if (!$pdo) {
  102. throw new Exception("No se pudo conectar a la base de datos");
  103. }
  104. // Consultar sensores del grupo SAM
  105. $sensorsResponse = getSAMSensors($prtgUrl, $username, $password);
  106. if (!$sensorsResponse) {
  107. throw new Exception("No se obtuvieron sensores de PRTG");
  108. }
  109. $sensors = json_decode($sensorsResponse, true);
  110. if (!$sensors || !isset($sensors['sensors'])) {
  111. throw new Exception("No se pudo decodificar respuesta de sensores");
  112. }
  113. echo "\n=== PROCESANDO SENSORES ===\n";
  114. $processed = 0;
  115. $registered = 0;
  116. foreach ($sensors['sensors'] as $sensor) {
  117. $objid = $sensor['objid'];
  118. $parentid = $sensor['parentid'];
  119. $lastValueRaw = $sensor['lastvalue_raw'] ?? '';
  120. // Validar lastvalue_raw - si está vacío, usar 0
  121. $lastValue = (empty($lastValueRaw) || trim($lastValueRaw) === '') ? 0 : $lastValueRaw;
  122. echo "[SENSOR] Procesando objid: $objid, parentid: $parentid, valor: $lastValue\n";
  123. // 1. Verificar si el sensor está en la matriz
  124. if (!isset($sensorCounterMap[$objid])) {
  125. echo "[SKIP] Sensor $objid no está en la matriz de relación\n";
  126. $processed++;
  127. continue;
  128. }
  129. $expectedCounter = $sensorCounterMap[$objid];
  130. echo "[MATRIX] Sensor $objid -> Contador esperado: $expectedCounter\n";
  131. // 2. Buscar EQUI_COEQ usando parentid
  132. $equipCoeq = getEquiCoeq($pdo, $parentid);
  133. if (!$equipCoeq) {
  134. echo "[SKIP] No se encontró EQUI_COEQ para parentid: $parentid\n";
  135. $processed++;
  136. continue;
  137. }
  138. echo "[FOUND] EQUI_COEQ: $equipCoeq\n";
  139. // 3. Buscar lista de CONA_IDCO
  140. $conaIdcoList = getConaIdcoList($pdo, $equipCoeq);
  141. if (empty($conaIdcoList)) {
  142. echo "[SKIP] No se encontraron contadores para EQUI_COEQ: $equipCoeq\n";
  143. $processed++;
  144. continue;
  145. }
  146. echo "[FOUND] Contadores disponibles: " . implode(', ', $conaIdcoList) . "\n";
  147. // 4. Verificar si el contador esperado está en la lista
  148. if (!in_array($expectedCounter, $conaIdcoList)) {
  149. echo "[SKIP] Contador esperado $expectedCounter no está en la lista de contadores del dispositivo\n";
  150. $processed++;
  151. continue;
  152. }
  153. echo "[MATCH] Contador $expectedCounter encontrado en dispositivo\n";
  154. // 5. Registrar medición
  155. if (registerMeasurement($pdo, $expectedCounter, $lastValue)) {
  156. echo "[SUCCESS] Medición registrada con contador: $expectedCounter\n";
  157. $registered++;
  158. } else {
  159. echo "[ERROR] No se pudo registrar medición\n";
  160. }
  161. $processed++;
  162. echo "\n";
  163. }
  164. echo "=== RESUMEN ===\n";
  165. echo "Sensores procesados: $processed\n";
  166. echo "Mediciones registradas: $registered\n";
  167. echo "[INFO] Recolección completada\n";
  168. } catch (Exception $e) {
  169. echo "[ERROR FATAL] " . date('Y-m-d H:i:s') . " - " . $e->getMessage() . "\n";
  170. }
  171. echo "\n=== FIN RECOLECTOR ===\n";
  172. ?>