Olá galera. Essa é a primeira vez que estou escrevendo pois me deparei com algo complicado (pra mim pelo menos).
Contextalizando:
Estou fazendo um sistema para monitorar e gerenciar as lampadas da minha casa. O projeto consiste em servidor web Apache, PHP e comando direto para microcontrolador (Arduino em questao).
Pois bem. Todas as conexoes e funcionamento estão perfeitos, mas me deparei com a necessidade de fazer uma atualizacao em tempo real. A minha aplicacao está dessa forma:
index.php: contem as imagens das lampadas. Quando a lampada esta apagada, clico nela e então rodo 3 funcoes basicas:
1. Seto no banco de dados o valor 1 (ligada) para a lampada do ID correspondente;
2. Atualizado o arquivo data.txt com a tag <img src="on.jpg"> (long polling)
3. Mando pro arduino o codigo correspondente para ligar a lampada correspondente.
lampada.php: contem as funcoes necessarias para os passos acima.
O meu problema esta agora em realizar o Long Polling para atualizar a imagem da lampada na tela no exato momento em que o usuario clica na lampada. Achei uma funcao na internet e realmente funcinou, mas me deparei com estas necessidades:
1. Passar o ID da lampada para a funcao que esta no javascript/ajax para que ele corretamente pegue esta informação e atualize a lampada correta.
2. Realizar o long polling corretamente.
Aqui vai o trecho do codigo:
<script type="text/javascript" charset="utf-8">
var timestamp = null;
function waitForMsg() {
$.ajax({
type: "GET",
url: "codlamp/getdata.php?timestamp=" + timestamp,
async: true,
cache: false,
success: function (data) {
var json = eval('(' + data + ')');
if (json['msg'] != "") {
//alert( json['msg'] );
//Display message here
$("#lampada4").empty();
$("#lampada4").append(json['msg'] + "<hr>").slideDown("slow");
}
timestamp = json["timestamp"];
setTimeout("waitForMsg()", 1000);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
// alert("error: "+textStatus + " "+ errorThrown );
setTimeout("waitForMsg()", 1000);
}
});
}
$(document).ready(
function ()
{
$('.jclock').jclock();
waitForMsg();
$("#lampada4").click(function () {
$("#lampada4").load("lampada.php?num=4");
});
});
</script>
No final desse arquivo, tenho as tags divs que possuem a imagem da lampada e que deve ser atualizada. Detalhe que são 15 lampadas e 15 tags. Portando preciso passar o ID para a funcao realizar suas consultas pelo id e retornar atualizacao da imagem que foi clicada.
<body>
<?php include 'inicial.php'; ?>
<div></div>
<div id="planta"></div>
<div id="titulo">Planta Baixa - Marcus Vinicius</div>
<div class="lampada" id="lampada1"><?php consultaEstadoLamp(1); ?><br /></div>
<div class="lampada" id="lampada2"><?php consultaEstadoLamp(2); ?><br /></div>
<div class="lampada" id="lampada3"><?php consultaEstadoLamp(3); ?><br /></div>
<div class="lampada" id="lampada4"><?php consultaEstadoLamp(4); ?><br /></div>
<div class="lampada" id="lampada5"><?php consultaEstadoLamp(5); ?><br /></div>
<div class="lampada" id="lampada6"><?php consultaEstadoLamp(6); ?><br /></div>
</body>
O arquivo getdada.php é esse:
<?php
$filename= dirname(__FILE__)."/data4.txt";
$lastmodif = isset( $_GET['timestamp'])? $_GET['timestamp']: 0 ;
$currentmodif=filemtime($filename);
while ($currentmodif <= $lastmodif) {
usleep(10000);
clearstatcache();
$currentmodif =filemtime($filename);
}
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp']= $currentmodif;
echo json_encode($response);
?>
A funcao ConsultaEstadoLampada() é irrelevante na duvida, mas para terem uma ideia do que estou fazendo vou colar aqui:
function consultaEstadoLamp($num) {
include 'conexao.php';
$query = 'SELECT estado, local FROM lampada WHERE lampada =' . $num;
$result = mysqli_query($link, $query);
while ($row = mysqli_fetch_array($result)) {
$estado = $row['estado'];
$local = $row['local'];
}
if ($estado == 1) {
//deleta o arquivo data.txt
unlink('codlamp/data' . $num . '.txt');
//cria um novo arquivo data.txt
$fp = fopen('codlamp/data' . $num . '.txt', "w+");
//coloca dentro a atualizacao pois escrita no banco
$escreve = fwrite($fp, '<img src="imagens/on.png" width="40" height="32">' . '<br/> ' . $local);
//fecha conexao com arquivo
fclose($fp);
} else {
//deleta o arquivo data.txt
unlink('codlamp/data' . $num . '.txt');
//cria um novo arquivo data.txt
$fp = fopen('codlamp/data' . $num . '.txt', "w+");
//coloca dentro a atualizacao pois escrita no banco
$escreve = fwrite($fp, '<img src="imagens/off.png" width="40" height="32">' . '<br/> ' . $local);
//fecha conexao com arquivo
fclose($fp);
}
}
Aguardo resposta!