Aggiornamento automatico per Midori


11

Sto usando Raspberry Pi per creare un chiosco web non interattivo: una pagina Web specifica (misurazioni da una stazione di monitoraggio remota) da visualizzare su uno schermo in modalità schermo intero, con contenuti aggiornati frequentemente tramite AJAX.

Ora ci sono alcune soluzioni per trasformare Raspberry in un chiosco, e sono abbastanza sicuro che sarò in grado di farlo bene, ma il chiosco dovrebbe essere abbastanza esente da manutenzione. Soprattutto in una situazione in cui l'alimentazione si interrompe, quindi si riaccende, ma in qualche modo l'infrastruttura del router / modem / rete non è stata completamente online.

In quella situazione, Midori presenterà una pagina sull'incapacità di connettersi o qualcosa del genere e rimarrà bloccata in questo modo fino a quando qualcuno non riavvia la corrente, poiché la pagina web che include il proprio meccanismo di autorefresh non è riuscita a caricarsi!

Ora come posso forzare Midori a caricare la pagina quando la rete è di nuovo disponibile, o qualcosa di simile effetto (aggiornamento automatico sempre ogni 15 minuti circa, o continuare ad aggiornare fino a quando la pagina si carica o qualcosa del genere.)?

Se tale opzione non è disponibile per Midori, puoi consigliare qualche altra soluzione?


Non ho accesso a un Pi in questo momento, e nemmeno a Midori, ma forse Midori ha il supporto dbus? Potresti provare a correre qdbus(dal pacchetto libqt4-dbus) o uno strumento simile e cercare Midori lì dentro. Quindi molto probabilmente puoi attivare un aggiornamento della pagina.
Arne,

Ancora meglio: sembra che Midori abbia qualcosa di integrato . Forse puoi provarlo e pubblicare una risposta qui.
Arne,

La mia risposta non è stata utile? Vorresti che scrivessi uno script bash invece di Python? Se devi usare crontab, ci sono errori con cui puoi rispondere?
xxmbabanexx,

@xxmbabanexx: è stato utile e lo accetterò sicuramente se non ne compariranno di migliori. Ho trovato una soluzione alternativa che posterò una volta completamente sviluppata. Spero ancora che qualcuno trovi una soluzione che non esegue l'aggiornamento se la pagina funziona bene ma se ciò non accade, la tua risposta è perfettamente accettabile e la accetterò.
SF.

@sf. Grazie per le informazioni aggiuntive. Una volta terminati i compiti di matematica, modificherò il mio script per includere il controllo della connessione di rete.
xxmbabanexx,

Risposte:


6

Supponendo che tu abbia Python sul tuo sistema, c'è un'alternativa a cron. Ho creato un rapido script Python 2.7.3 che ricaricherà Midori ogni 5 minuti.

#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 è necessario modificare la quantità di tempo di riposo, è sufficiente modificare la rest_timevariabile.

Nuovo script

Come hai detto che avevi bisogno che il programma fosse "intelligente", l'ho modificato per renderlo tale. Quando si utilizza questo programma, non aprire Midori manualmente; aprilo dalla sceneggiatura. Ho una strana abitudine di crash a causa dello Speed ​​Dialer se lo fai diversamente. Funziona anche su Python 2.7.3. Se non vuoi fare tutte quelle copie e incolla, ti preghiamo di visitare il mio codice binario del codice.

"""
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

Nel caso in cui qualcuno arrivi e cerchi una risposta aggiornata, Midori ora ha un'opzione da riga di comando --inactivity-reset=SECONDS(o -iin breve).

Insieme -aall'opzione, è possibile ottenere un browser che si riavvia costantemente in modalità kiosk ogni x secondi.

per esempio

midori -a http://www.google.com/ -i 120 -e Schermo intero

Aprirà http://www.google.com/ in una finestra a schermo intero e aggiornerà la pagina dopo 2 minuti di inattività. ( -eesegue un comando)


4

Ho deciso di affrontarlo da un lato diverso, per lo più indipendente dal browser.

Il browser viene avviato in modalità kiosk, indicando un documento locale specifico:

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>

Ora in questo file, il valore di timeout è regolato per contenere due normali autorefreshes della pagina remota più alcuni, ed reload_urlè impostato sul suo URL.

La pagina remota ha uno snippet che viene eseguito ogni volta che il suo aggiornamento viene eseguito correttamente:

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

Se succede qualcosa di brutto: la pagina non viene caricata, carica come 404 o errore o il suo javascript si interrompe per qualsiasi motivo, o qualche reindirizzamento del dirottamento ci spinge a una pagina diversa, se non arrivano due messaggi di aggiornamento consecutivi, il frame del watchdog reimposta l'URL all'originale, che esegue automaticamente il ricaricamento.

Nota, il tentativo ... catch è di prevenire problemi con i browser più vecchi che potrebbero non supportare postMessage. Questo non sarà un problema con il chiosco poiché controlliamo l'ambiente e possiamo sempre garantire che verrà utilizzato il browser giusto. OTOH, su computer client casuali senza il frame che ascolta i messaggi l'operazione postMessage è no-op fintanto che non causa errori di interruzione dello script, quindi prova..catch.


3

Uso xdotool per simulare la pressione di un tasto 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 poi nel mio crontab eseguo quello script ogni minuto

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.