Actualisation automatique pour Midori

11

J'utilise Raspberry Pi pour créer un kiosque Web non interactif - une page Web spécifique (mesures à partir d'une station de surveillance à distance) à afficher sur un écran en mode plein écran, le contenu est actualisé fréquemment via AJAX.

Maintenant, il existe de nombreuses solutions pour faire de la framboise un kiosque, et je suis sûr que je pourrai le faire très bien, mais le kiosque devrait être assez sans entretien. Surtout dans une situation où l'alimentation est coupée, puis revient, mais en quelque sorte l'infrastructure routeur / modem / réseau n'est pas tout à fait en ligne.

Dans cette situation, Midori proposera une page sur "incapable de se connecter" ou quelque chose comme ça et elle sera bloquée comme ça jusqu'à ce que quelqu'un redémarre le courant - car la page Web comprenant son propre mécanisme de rafraîchissement automatique n'a pas pu se charger!

Maintenant, comment puis-je forcer Midori à charger la page lorsque le réseau est à nouveau disponible, ou quelque chose de similaire (actualisation automatique toujours toutes les 15 minutes environ, ou continuer à rafraîchir jusqu'à ce que la page se charge ou quelque chose comme ça.)?

Si cette option n'est pas disponible pour Midori, pouvez-vous recommander une autre solution?

SF.
la source
Je n'ai pas accès à un Pi en ce moment, ni à Midori, mais peut-être que Midori a un support dbus? Vous pouvez essayer d'exécuter qdbus(à partir du package libqt4-dbus) ou un outil similaire et rechercher Midori là-dedans. Ensuite, vous pouvez très probablement déclencher une actualisation de la page.
Arne
Encore mieux: il semble que Midori ait intégré quelque chose . Vous pouvez peut-être essayer cela et poster une réponse ici.
Arne
Ma réponse n'était-elle pas utile? Souhaitez-vous que j'écrive un script bash au lieu de Python? Si vous devez utiliser crontab, y a-t-il des erreurs auxquelles vous pouvez répondre?
xxmbabanexx
@xxmbabanexx: C'était utile et je l'accepterai sûrement si aucun meilleur n'apparaît. J'ai trouvé une solution alternative que je publierai une fois entièrement développée. J'espère toujours que quelqu'un trouvera une solution qui n'effectuera pas de rafraîchissement si la page fonctionne très bien, mais si cela ne se produit pas, votre réponse est parfaitement acceptable et je l'accepterai.
SF.
@sf. Merci pour l'information supplémentaire. Une fois mes devoirs de mathématiques terminés, je modifierai mon script pour inclure la vérification de la connexion réseau.
xxmbabanexx

Réponses:

6

En supposant que vous avez Python sur votre système, il existe une alternative à cron. J'ai créé un script Python 2.7.3 rapide qui rechargera Midori toutes les 5 minutes.

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

Si vous devez modifier la durée du repos, changez simplement la rest_timevariable.

Nouveau script

Comme vous avez dit que vous aviez besoin que le programme soit "intelligent", je l'ai modifié pour qu'il en soit ainsi. Lorsque vous utilisez ce programme, veuillez ne pas ouvrir Midori manuellement; ouvrez-le à partir du script. J'ai une étrange habitude de tomber en panne à cause de la numérotation rapide si vous faites autrement. Il fonctionne également sur Python 2.7.3. Si vous ne voulez pas faire tout ce copier-coller, veuillez visiter ma boîte à pâte du code.

"""
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
la source
8

Juste au cas où quelqu'un viendrait et chercherait une réponse mise à jour, Midori a maintenant une option de ligne de commande --inactivity-reset=SECONDS(ou -ipour faire court).

Associé à cette -aoption, vous pouvez obtenir un navigateur qui redémarre constamment en mode kiosque toutes les x secondes.

par exemple

midori -a http://www.google.com/ -i 120 -e Plein écran

Ouvre http://www.google.com/ dans une fenêtre plein écran et actualise la page après 2 minutes d'inactivité. ( -eexécute une commande)

shrmn
la source
4

J'ai décidé de l'aborder sous un angle différent, principalement indépendant du navigateur.

Le navigateur est démarré en mode kiosque, pointant vers un document local spécifique:

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>

Maintenant, dans ce fichier, la valeur du délai d'attente est ajustée pour contenir deux rafraîchissements automatiques normaux de la page distante plus certains, et reload_urlest définie sur son URL.

La page distante a un extrait qui est exécuté chaque fois que son rafraîchissement est effectué correctement:

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

En cas de problème - la page ne se charge pas, se charge en 404 ou en erreur ou son javascript s'arrête pour une raison quelconque, ou une redirection de détournement nous pousse vers une autre page, si deux messages de rafraîchissement consécutifs n'arrivent pas, le cadre du chien de garde réinitialise l'URL à l'original, qui effectue automatiquement le rechargement.

Remarque, le try ... catch est d'éviter les problèmes avec les navigateurs plus anciens qui peuvent ne pas prendre en charge postMessage. Ce ne sera pas un problème avec le kiosque puisque nous contrôlons l'environnement et pouvons toujours nous assurer que le bon navigateur sera utilisé. OTOH, sur des ordinateurs clients aléatoires sans que le cadre n'écoute les messages, l'opération postMessage n'est pas opérationnelle tant qu'elle ne provoque pas d'erreur d'abandon de script, essayez donc..catch.

SF.
la source
3

J'utilise xdotool pour simuler une pression de touche 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

puis dans mon crontab je lance ce script toutes les minutes

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Jamie Cook
la source