Atualização automática para Midori


11

Estou usando o Raspberry Pi para criar um quiosque da web não interativo - uma página específica (medições de uma estação de monitoramento remoto) a ser exibida em uma tela no modo de tela cheia, com o conteúdo atualizado com frequência pelo AJAX.

Agora, existem algumas soluções para transformar o Raspberry em um quiosque, e tenho certeza de que poderei fazê-lo bem, mas o quiosque deve ser bastante livre de manutenção. Especialmente na situação em que a energia acaba e volta a ligar, mas de alguma forma a infraestrutura do roteador / modem / rede não ficou totalmente online.

Nessa situação, o Midori apresentará uma página sobre "incapaz de conectar" ou algo assim e ela ficará paralisada até que alguém desligue e ligue novamente - uma vez que a página da Web, incluindo seu próprio mecanismo de atualização automática, não foi carregada!

Agora, como posso forçar o Midori a carregar a página quando a rede estiver disponível novamente, ou algo com o mesmo efeito (atualização automática sempre a cada 15 minutos ou mais ou continuar atualizando até que a página carregue ou algo assim)?

Se essa opção não estiver disponível para o Midori, você pode recomendar outra solução?


Eu não tenho acesso a um Pi agora, e nem a Midori, mas talvez Midori tenha suporte a dbus? Você pode tentar executar qdbus(do pacote libqt4-dbus) ou alguma ferramenta semelhante e procurar o Midori lá. Então você provavelmente pode acionar uma atualização da página.
Arne

Ainda melhor: parece que Midori tem algo embutido . Talvez você possa tentar isso e postar uma resposta aqui.
Arne

Minha resposta não foi útil? Deseja que eu escreva um script bash em vez de Python? Se você precisar usar o crontab, há algum erro com o qual possa responder?
Xxmbabanexx

@xxmbabanexx: Foi útil e certamente aceitarei se não aparecerem melhores. Encontrei uma solução alternativa que publicarei uma vez totalmente desenvolvida. Ainda espero que alguém encontre uma solução que não execute atualização se a página estiver funcionando bem, mas se isso não acontecer, sua resposta é perfeitamente aceitável e eu a aceitarei.
SF.

@sf. Obrigado pela informação adicional. Depois que terminar minha lição de matemática, editarei meu script para incluir a verificação de conexão de rede.
Xxmbabanexx

Respostas:


6

Supondo que você tenha o Python no seu sistema, existe uma alternativa para cron. Eu criei um rápido script Python 2.7.3 que recarregará o Midori a cada 5 minutos.

#This program reloads midori every 5 minutes

#Redifine the variables below as you see fit

rest_time = 300 #Rest time is set to 300 seconds (5 minutes) 


import subprocess as sub #Imports terminal commands (needed for reload)
from time import sleep #Import sleep (allows an infinite loop to become dormant)

while True: #This is an infinite loop. This means that our script won't stop.
    sub.call(["midori", "-e", "Reload"]) #This forwards our command to the terminal
    sleep(rest_time) #Wait rest_time second(s), then start the loop again. 

Se você precisar alterar a quantidade de tempo de descanso, basta alterar a rest_timevariável.

Novo Script

Como você disse que precisava que o programa fosse "inteligente", eu o editei para fazê-lo. Ao usar este programa, não abra o Midori manualmente; abra-o a partir do script. Eu tenho um hábito estranho de travar devido ao Discador rápido, se você fizer o contrário. Também roda em Python 2.7.3. Se você não quiser fazer toda essa cópia e colagem, visite minha pasta do código.

"""
Midori Kiosk Reloader.
Created by xxmbabanexx

NOTE: This program opens Midori automatically. DO NOT OPEN IT MANUALLY, SIMPLY CLICK ON THIS PROGRAM.

KEYS

1 = Connection Complete. All is well.

0 = Connection Incomplete. Something is wrong.
"""


#Change these variables to your liking.

host = "www.google.com" #Put your desired host URL/IP between the quotes

port = 80 #Set to default port of 80. If your host uses something else, please change it.

recheck_time = 10 #The number of seconds the program will wait to ping the server. Change this at your leisure. 

page_to_open_to = "www.google.com" #This is the webpage the kiosk will open to. Put the url between the quotes.


#Excersise caution when changing these vars.

last = -1 #undefined state
up = -1 #Undefined state



"""
#---------------- Main code. Do NOT touch unless you KNOW what you are doing. ------------
"""
#Import modules

import subprocess as sub
from time import sleep
import socket
import threading

sub.Popen(["midori", "-a", page_to_open_to]) #open midori


#Check if internet is up
addr = (host, port) #the connection addr


while True:
    last = up #reset checking var
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #create socket
    try: #attempt to ping, change vars
        s.connect(addr)
        up = 1
        print "\n"
    except socket.error: #if error when pinging, change vars
        up = 0
        print "\n"

    print "LAST CHECK:", last
    print "CURRENT CHECK:", up
    if last == 0 and up == 1:
        print "Reloading Midori.\n"
        sub.call(["midori", "-e", "Reload"])
    s.close()


    sleep(recheck_time)

8

Caso alguém apareça e procure uma resposta atualizada, o Midori agora tem uma opção de linha de comando --inactivity-reset=SECONDS(ou -iabreviada).

Juntamente com a -aopção, você pode obter um navegador constantemente reiniciando no modo quiosque a cada x segundos.

por exemplo

midori -a http://www.google.com/ -i 120 -e Tela cheia

Abre o http://www.google.com/ em uma janela de tela cheia e atualiza a página após 2 minutos de inatividade. ( -eexecuta um comando)


4

Decidi abordá-lo de um lado diferente, principalmente independente do navegador.

O navegador é iniciado no modo quiosque, apontando para um documento local específico:

watchdog.html

<!DOCTYPE html>
<html>
    <head>
        <title>Monitoring</title>
        <script type="text/javascript">
        <!--
        var reload_url="http://example.org/watched.html";
        var to = 10000;  // Watchdog timeout: 10s.
        var wd;
        var ifr;
        function setup_watchdog()
        {
            ifr=document.getElementById("frame1");
            window.onmessage = function(e){
                if (e.data == 'tyrp') {
                    window.clearTimeout(wd);
                    wd = window.setTimeout(wdf,to);
                }
            };
            ifr.src = reload_url;
            wd = window.setTimeout(wdf,to);
        }

        function wdf()
        {
            ifr.src = reload_url;
            wd = window.setTimeout(wdf,to);
        }
        // -->
        </script>
    </head>
    <body onload="setup_watchdog()" style="margin: 0; overflow: hidden;">
        <iframe id="frame1" src="#" 
        style="position:absolute; left: 0px; width: 100%; top: 0px; height: 100%; margin:0; padding:0; border:0px none transparent;"></iframe>
    </body>
</html>

Agora, neste arquivo, o valor do tempo limite é ajustado para conter duas atualizações automáticas normais da página remota e mais algumas, e reload_urlé definido como sua URL.

A página remota possui um trecho que é executado toda vez que sua atualização é realizada corretamente:

try {
    window.top.postMessage('tyrp', '*');
} catch(e){}

Se algo de ruim acontecer - a página falha ao carregar, carrega como 404 ou erro ou seu javascript pára por qualquer motivo, ou algum redirecionamento de invasão nos leva a uma página diferente, se duas mensagens de atualização consecutivas falharem, o quadro de watchdog redefine o URL ao original, que executa automaticamente a recarga.

Observe que o try ... catch é para evitar problemas com navegadores mais antigos, que podem não suportar o postMessage. Isso não será um problema no quiosque, pois controlamos o ambiente e sempre podemos garantir que o navegador correto será usado. OTOH, em computadores-cliente aleatórios sem o quadro ouvindo as mensagens, a operação postMessage não funciona, desde que não cause erro de abortamento de script, portanto, tente ... capturar.


3

Eu uso o xdotool para simular um pressionamento de tecla f5

pi@data-integrity-pi ~/log $ cat ~/bin/refresh_kiosk.sh
DISPLAY=:0 xdotool search --name ci-monitor windowactivate --sync key F5 >> ~/log/tmp.log 2>&1

e então no meu crontab eu corro esse script a cada minuto

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.