Ir para conteúdo
Fórum Script Brasil
  • 0

Como fazer um - Long Polling usando PHP + Ajax + MySql


MarkAngel11

Pergunta

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!

Editado por MarkAngel11
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...