setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(Throwable $e) { die("Erro na BD: " . $e->getMessage()); } // Configuração do MQTT $mqttHost='xupas.mooo.com'; $mqttPort=1883; $mqttUser='xupa'; $mqttPass='xupa'; // Função para enviar comando function sendMqttCommand(string $espId, int $pin, int $value): bool { global $mqttHost, $mqttPort, $mqttUser, $mqttPass; try { $clientId = "gpio-panel-".uniqid(); $settings = (new ConnectionSettings()) ->setUsername($mqttUser) ->setPassword($mqttPass) ->setKeepAliveInterval(10) ->setConnectTimeout(3) ->setSocketTimeout(3); $mqtt = new MqttClient($mqttHost, $mqttPort, $clientId); $mqtt->connect($settings, true); $payload = json_encode([ 'cmd' => 'GPIO', 'pin' => $pin, 'value' => $value ]); $topic = "esp/{$espId}/cmd"; $mqtt->publish($topic, $payload, 0, false); $mqtt->disconnect(); return true; } catch (Throwable $e) { error_log("MQTT-ERR) " . $e->getMessage()); return false; } } // Processar pedidos if ($_SERVER['REQUEST_METHOD'] === 'POST') { $esp = $_POST['esp'] ?? ''; $pin = intval($_POST['pin'] ?? -1); $val = intval($_POST['value'] ?? -1); if ($esp && $pin >= 0 && ($val === 0 || $val === 1)) { $ok = sendMqttCommand($esp, $pin, $val); if ($ok) { $msg = "✅ Comando enviado: {$esp} → Pino {$pin} → ".($val ? "ON" : "OFF"); } else { $msg = "❌ Falha ao enviar comando para {$esp}"; } } else { $msg = "⚠️ Parâmetros inválidos"; } } // Buscar ESPs registados $stmt = $db->query("SELECT uid, online, last_seen FROM contadores ORDER BY uid ASC"); $esps = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> Controle GPIO via MQTT

⚡ Controle de GPIO (MQTT)

ESP Status Último Sinal Pino Ação
Online Offline