Automatyczne odświeżanie dla Midori

11

Używam Raspberry Pi do stworzenia nieinteraktywnego kiosku internetowego - konkretnej strony internetowej (pomiary ze zdalnej stacji monitorującej), która ma być wyświetlana na ekranie w trybie pełnoekranowym, treść odświeżana często przez AJAX.

Teraz istnieje kilka rozwiązań, aby przekształcić Raspberry w kiosk i jestem pewien, że będę w stanie zrobić to dobrze, ale kiosk powinien być dość bezobsługowy. Zwłaszcza w sytuacji zaniku zasilania, a następnie powrotu, ale w jakiś sposób infrastruktura routera / modemu / sieci nie dołączyła do sieci.

W takiej sytuacji Midori wyświetli stronę o „niemożności połączenia” lub coś w tym rodzaju i utknie w ten sposób, dopóki ktoś nie włączy zasilania ponownie - ponieważ strona zawierająca własny mechanizm automatycznego odświeżania nie załadowała się!

Teraz, jak mogę zmusić Midori do załadowania strony, gdy sieć jest ponownie dostępna, lub coś z podobnym efektem (automatyczne odświeżanie zawsze co około 15 minut, lub odświeżanie aż do załadowania strony lub coś takiego).

Jeśli ta opcja jest niedostępna dla Midori, czy możesz polecić jakieś inne rozwiązanie?

SF.
źródło
Nie mam teraz dostępu do Pi i ani do Midori, ale może Midori ma obsługę dbus? Możesz spróbować uruchomić qdbus(z pakietu libqt4-dbus) lub podobne narzędzie i poszukać tam Midori. Wtedy najprawdopodobniej możesz uruchomić odświeżanie strony.
Arne,
Jeszcze lepiej: Wygląda na to, że Midori ma coś wbudowanego . Może możesz spróbować i opublikować odpowiedź tutaj.
Arne,
Czy moja odpowiedź nie była przydatna? Czy chciałbyś, żebym napisał skrypt bash zamiast Python? Jeśli potrzebujesz użyć crontab, czy są jakieś błędy, na które możesz odpowiedzieć?
xxmbabanexx
@xxmbabanexx: Przydało się i na pewno to zaakceptuję, jeśli nie pojawią się lepsze. Znalazłem alternatywne rozwiązanie, które opublikuję po pełnym opracowaniu. Nadal mam nadzieję, że ktoś wymyśli rozwiązanie, które nie wykonuje odświeżania, jeśli strona działa dobrze, ale jeśli tak się nie stanie, twoja odpowiedź jest całkowicie do zaakceptowania i ja ją zaakceptuję.
SF.
@sf. Dzięki za dodatkowe info. Po zakończeniu pracy domowej z matematyki zmodyfikuję skrypt, aby uwzględnić sprawdzanie połączenia sieciowego.
xxmbabanexx

Odpowiedzi:

6

Zakładając, że masz Python w swoim systemie, istnieje alternatywa dla cron. Stworzyłem szybki skrypt Python 2.7.3, który będzie ładował Midori co 5 minut.

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

Jeśli chcesz zmienić czas odpoczynku, po prostu zmień rest_timezmienną.

Nowy skrypt

Jak powiedziałeś, że potrzebujesz, aby program był „inteligentny”, edytowałem go, aby tak było. Podczas korzystania z tego programu nie otwieraj Midori ręcznie; otwórz go ze skryptu. Mam dziwny nawyk zawieszania się z powodu szybkiego wybierania, jeśli zrobisz inaczej. Działa również w Pythonie 2.7.3. Jeśli nie chcesz wykonywać całej tej kopii i wklejania, odwiedź moją stronę kodu źródłowego.

"""
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
źródło
8

Na wypadek, gdyby ktoś wpadł i szukał zaktualizowanej odpowiedzi, Midori ma teraz opcję wiersza poleceń --inactivity-reset=SECONDS(lub -iw skrócie).

W połączeniu z tą -aopcją, możesz uzyskać stale restartującą się przeglądarkę w trybie kiosku co x sekundy.

na przykład

midori -a http://www.google.com/ -i 120 -e Pełny ekran

Otworzy http://www.google.com/ w oknie pełnoekranowym i odświeży stronę po 2 minutach bezczynności. ( -ewykonuje polecenie)

shrmn
źródło
4

Postanowiłem podejść do tego z innej strony, głównie niezależnej od przeglądarki.

Przeglądarka jest uruchamiana w trybie kiosku, wskazując na konkretny dokument lokalny:

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>

Teraz w tym pliku wartość limitu czasu jest dostosowywana, aby zawierała dwa normalne automatyczne odświeżanie strony zdalnej plus niektóre, i reload_urljest ustawiana na jej adres URL.

Strona zdalna ma fragment, który jest wykonywany za każdym razem, gdy jego odświeżanie jest wykonywane poprawnie:

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

Jeśli dzieje się coś złego - strona nie ładuje się, ładuje się jako 404 lub błąd lub jego javascript zatrzymuje się z jakiegokolwiek powodu, lub przekierowanie przechwytujące popycha nas na inną stronę, jeśli dwa kolejne komunikaty odświeżające nie dotrą, ramka watchdog resetuje adres URL do oryginału, który automatycznie wykonuje przeładowanie.

Uwaga: try ... catch ma na celu zapobieganie problemom ze starszymi przeglądarkami, które mogą nie obsługiwać postMessage. Nie będzie to problemem z kioskiem, ponieważ kontrolujemy środowisko i zawsze możemy zapewnić, że zostanie użyta odpowiednia przeglądarka. OTOH, na losowych komputerach klienckich bez ramki nasłuchującej wiadomości, operacja postMessage nie działa, o ile nie powoduje błędu przerywania skryptu, dlatego spróbuj..catch.

SF.
źródło
3

Używam xdotool do symulacji naciśnięcia klawisza 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

a następnie w moim crontabie uruchamiam ten skrypt co minutę

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Jamie Cook
źródło