Automatische Aktualisierung für Midori

11

Ich verwende Raspberry Pi, um einen nicht interaktiven Webkiosk zu erstellen - eine bestimmte Webseite (Messungen von einer Fernüberwachungsstation), die im Vollbildmodus auf einem Bildschirm angezeigt wird und deren Inhalte häufig über AJAX aktualisiert werden.

Jetzt gibt es einige Lösungen, um Raspberry zu einem Kiosk zu machen, und ich bin mir ziemlich sicher, dass ich das ganz gut kann, aber der Kiosk sollte ziemlich wartungsfrei sein. Besonders in Situationen, in denen der Strom ausfällt und dann wieder eingeschaltet wird, aber irgendwie war die Router- / Modem- / Netzwerkinfrastruktur nicht ganz online.

In dieser Situation wird Midori eine Seite über "Verbindung nicht möglich" oder ähnliches erstellen, die so lange hängen bleibt, bis jemand die Stromversorgung wieder aus- und wieder einschaltet - da die Webseite mit ihrem eigenen automatischen Aktualisierungsmechanismus nicht geladen werden konnte!

Wie kann ich nun Midori zwingen, die Seite zu laden, wenn das Netzwerk wieder verfügbar ist, oder etwas Ähnliches (automatische Aktualisierung immer alle 15 Minuten oder so oder so lange aktualisieren, bis die Seite geladen wird oder so ähnlich)?

Wenn diese Option für Midori nicht verfügbar ist, können Sie eine andere Lösung empfehlen?

SF.
quelle
Ich habe momentan keinen Zugang zu einem Pi und auch nicht zu Midori, aber vielleicht hat Midori dbus-Unterstützung? Sie können versuchen, qdbus(aus dem Paket libqt4-dbus) oder einem ähnlichen Tool auszuführen und dort nach Midori zu suchen. Dann können Sie höchstwahrscheinlich eine Aktualisierung der Seite auslösen.
Arne
Noch besser: Es scheint, dass Midori etwas eingebaut hat . Vielleicht kannst du das versuchen und hier eine Antwort posten.
Arne
War meine Antwort nicht nützlich? Möchten Sie, dass ich anstelle von Python ein Bash-Skript schreibe? Wenn Sie crontab verwenden müssen, gibt es Fehler, mit denen Sie antworten können?
xxmbabanexx
@xxmbabanexx: Es war nützlich und ich werde es sicherlich akzeptieren, wenn keine besseren erscheinen. Ich habe eine alternative Lösung gefunden, die ich veröffentlichen werde, sobald sie vollständig entwickelt ist. Ich hoffe immer noch, dass jemand eine Lösung findet, die keine Aktualisierung durchführt, wenn die Seite einwandfrei funktioniert, aber wenn dies nicht geschieht, ist Ihre Antwort vollkommen akzeptabel und ich werde sie akzeptieren.
SF.
@sf. Danke für die zusätzlichen Infos. Sobald ich meine Mathe-Hausaufgaben erledigt habe, bearbeite ich mein Skript, um die Überprüfung der Netzwerkverbindung einzuschließen.
xxmbabanexx

Antworten:

6

Angenommen, Sie haben Python auf Ihrem System, gibt es eine Alternative zu cron. Ich habe ein schnelles Python 2.7.3-Skript erstellt, das Midori alle 5 Minuten neu lädt.

#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. 

Wenn Sie die Ruhezeit ändern müssen, ändern Sie einfach die rest_timeVariable.

Neues Skript

Als Sie sagten, dass das Programm "intelligent" sein muss, habe ich es bearbeitet, um es so zu machen. Wenn Sie dieses Programm verwenden, öffnen Sie Midori bitte nicht manuell. Öffnen Sie es aus dem Skript. Ich habe die seltsame Angewohnheit, aufgrund des Kurzwahlgeräts abzustürzen, wenn Sie etwas anderes tun. Es läuft auch auf Python 2.7.3. Wenn Sie nicht alles kopieren und einfügen möchten, besuchen Sie bitte meinen Pastebin des Codes.

"""
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)
xxmbabanexx
quelle
8

Für den Fall, dass jemand vorbeikommt und nach einer aktualisierten Antwort sucht, hat Midori jetzt eine Befehlszeilenoption --inactivity-reset=SECONDS(oder -ikurz).

In Verbindung mit der -aOption können Sie alle x Sekunden einen ständig neu startenden Browser im Kioskmodus erreichen.

z.B

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

Öffnet http://www.google.com/ in einem Vollbild - Fenster und aktualisieren Sie die Seite nach 2 Minuten Inaktivität. ( -eführt einen Befehl aus)

Shrmn
quelle
4

Ich beschloss, es von einer anderen Seite aus zu betrachten, meistens browserunabhängig.

Der Browser wird im Kioskmodus gestartet und zeigt auf ein bestimmtes lokales Dokument:

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>

In dieser Datei wird der Zeitlimitwert so angepasst, dass er zwei normale automatische Aktualisierungen der Remote-Seite sowie einige enthält, und reload_urlauf ihre URL festgelegt.

Die Remote-Seite verfügt über ein Snippet, das jedes Mal ausgeführt wird, wenn die Aktualisierung korrekt ausgeführt wird:

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

Wenn etwas Schlimmes passiert - die Seite kann nicht geladen werden, wird als 404 oder Fehler geladen oder ihr Javascript wird aus irgendeinem Grund gestoppt oder eine Hijack-Umleitung führt uns zu einer anderen Seite. Wenn zwei aufeinanderfolgende Aktualisierungsnachrichten nicht eintreffen, setzt der Watchdog-Frame die URL zurück zum Original, das automatisch neu lädt.

Beachten Sie, dass mit try ... catch Probleme mit älteren Browsern vermieden werden sollen, die postMessage möglicherweise nicht unterstützen. Dies ist kein Problem mit dem Kiosk, da wir die Umgebung kontrollieren und immer sicherstellen können, dass der richtige Browser verwendet wird. OTOH, auf zufälligen Client-Computern, ohne dass der Frame die Nachrichten abhört, ist die postMessage-Operation nicht aktiv, solange sie keinen Fehler beim Abbrechen des Skripts verursacht. Versuchen Sie also..catch.

SF.
quelle
3

Ich benutze das xdotool, um einen f5-Tastendruck zu simulieren

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

und dann führe ich in meinem crontab das Skript jede Minute aus

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Jamie Cook
quelle