Автообновление для Midori


11

Я использую Raspberry Pi для создания неинтерактивного веб-киоска - конкретной веб-страницы (измерения с удаленной станции мониторинга), которая будет отображаться на экране в полноэкранном режиме, содержимое часто обновляется через AJAX.

Сейчас есть немало решений для превращения Raspberry в киоск, и я уверен, что смогу сделать это просто отлично, но киоск должен быть совершенно необслуживаемым. Особенно в ситуации, когда питание отключается, затем снова включается, но каким-то образом инфраструктура маршрутизатора / модема / сети не совсем подключилась.

В этой ситуации у Midori появится страница о «невозможности подключения» или о чем-то подобном, и она будет зависать до тех пор, пока кто-то снова не включит питание - поскольку веб-страница, включающая собственный механизм автообновления, не загружалась!

Теперь, как я могу заставить Midori загружать страницу, когда сеть снова становится доступной или что-то подобное (автоматическое обновление всегда каждые 15 минут или около того, или обновление до тех пор, пока страница не загрузится или что-то в этом роде)?

Если этот вариант недоступен для Midori, можете ли вы порекомендовать другое решение?


У меня нет доступа ни к Пи, ни к Мидори, но, возможно, у Мидори есть поддержка dbus? Вы можете попробовать запустить qdbus(из пакета libqt4-dbus) или какой-нибудь подобный инструмент и найти там Midori. Тогда вы, скорее всего, можете запустить обновление страницы.
Арне

Еще лучше: кажется, что в Мидори что-то встроено . Может быть, вы можете попробовать это и опубликовать ответ здесь.
Арне

Был ли мой ответ бесполезен? Вы хотите, чтобы я написал сценарий bash вместо Python? Если вам нужно использовать crontab, есть ли ошибки, на которые вы можете ответить?
xxmbabanexx

@xxmbabanexx: Это было полезно, и я обязательно приму это, если не появятся лучшие. Я нашел альтернативное решение, которое я опубликую, как только оно будет полностью разработано. Я все еще надеюсь, что кто-то придумает решение, которое не выполняет обновление, если страница работает нормально, но если этого не произойдет, ваш ответ вполне приемлем, и я приму его.
SF.

@sf. Спасибо за дополнительную информацию. Как только я закончу свою домашнюю работу по математике, я отредактирую свой сценарий, чтобы включить проверку сетевого подключения.
xxmbabanexx

Ответы:


6

Предполагая, что у вас есть Python в вашей системе, есть альтернатива cron. Я создал быстрый скрипт Python 2.7.3, который будет перезагружать Midori каждые 5 минут.

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

Если вам нужно изменить время отдыха, просто измените rest_timeпеременную.

Новый скрипт

Поскольку вы сказали, что вам нужно, чтобы программа была «умной», я отредактировал ее, чтобы сделать так. При использовании этой программы, пожалуйста, не открывайте Midori вручную; откройте его из скрипта. У меня есть странная привычка сбой из-за Speed ​​Dialer, если вы делаете иначе. Он также работает на Python 2.7.3. Если вы не хотите делать все эти копии и вставки, пожалуйста, посетите мой код вставки кода.

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

На всякий случай, если кто-нибудь заходит и ищет обновленный ответ, Midori теперь имеет опцию командной строки --inactivity-reset=SECONDS(или -iдля краткости).

В сочетании с этой -aопцией вы можете постоянно перезагружать браузер в режиме киоска каждые x секунд.

например

midori -a http://www.google.com/ -i 120 -e Полноэкранный режим

Откроется http://www.google.com/ в полноэкранном окне и обновит страницу через 2 минуты бездействия. ( -eвыполняет команду)


4

Я решил подойти к этому с другой стороны, в основном независимо от браузера.

Браузер запускается в режиме киоска, указывая на определенный локальный документ:

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>

Теперь в этом файле значение тайм-аута настроено так, чтобы оно содержало два обычных автообновления удаленной страницы, плюс некоторые, и было reload_urlустановлено на ее URL.

Удаленная страница имеет фрагмент, который выполняется каждый раз, когда ее обновление выполняется правильно:

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

Если случается что-то плохое - страница не загружается, загружается как 404, либо ошибка, либо ее javascript прекращается по какой-либо причине, либо какое-то переадресация угонщика подталкивает нас на другую страницу, если два последовательных сообщения обновления не приходят, фрейм сторожевого таймера сбрасывает URL-адрес к оригиналу, который автоматически выполняет перезагрузку.

Обратите внимание, что try ... catch предназначен для предотвращения проблем со старыми браузерами, которые могут не поддерживать postMessage. Это не будет проблемой для киоска, так как мы контролируем окружающую среду и всегда можем гарантировать, что будет использован правильный браузер. OTOH, на случайных клиентских компьютерах без фрейма, прослушивающего сообщения, операция postMessage не работает, если она не вызывает ошибку прерывания сценария, поэтому попытайтесь ... поймать


3

Я использую xdotool для имитации нажатия клавиши 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

а затем в моем crontab я запускаю этот скрипт каждую минуту

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.