Midori için otomatik yenileme


11

Etkileşimli olmayan bir web kiosk oluşturmak için Raspberry Pi kullanıyorum - tam ekran modunda ekranda görüntülenecek belirli bir web sayfası (uzaktan izleme istasyonundan ölçümler), içerik AJAX ile sık sık yenileniyor.

Şimdi Ahududu bir kiosk yapmak için birkaç çözüm var ve eminim ki gayet iyi yapabilirim, ancak kiosk bakım gerektirmez. Özellikle gücün kesildiği, sonra tekrar açıldığı durumda, ancak bir şekilde yönlendirici / modem / ağ altyapısı tamamen çevrimiçi değildi.

Bu durumda Midori "bağlantı kurulamıyor" veya bunun gibi bir şey hakkında bir sayfa bulur ve birisi yeniden gücü kesene kadar bu şekilde sıkışır - çünkü kendi otomatik yenileme mekanizması içeren web sayfası yüklenemedi!

Şimdi Midori'yi ağ tekrar kullanılabilir olduğunda veya benzer bir etkiye sahip bir sayfayı yüklemeye nasıl zorlayabilirim (her 15 dakikada bir otomatik yenileme veya sayfa yüklenene veya böyle bir şey oluncaya kadar yenilemeye devam edebilir.)?

Bu seçenek Midori için kullanılamıyorsa, başka bir çözüm önerebilir misiniz?


Şu anda bir Pi'ye ve Midori'ye erişimim yok, ama Midori'nin dbus desteği var mı? Çalıştırmayı qdbus(paketten libqt4-dbus) veya benzer bir aracı deneyebilir ve orada Midori'yi arayabilirsiniz. Ardından büyük olasılıkla sayfanın yenilenmesini tetikleyebilirsiniz.
Arne

Daha da iyisi: Midori'de yerleşik bir şey var gibi görünüyor . Belki bunu deneyebilir ve burada bir cevap gönderebilirsiniz.
Arne

Cevabım işe yaramadı mı? Python yerine bash betiği yazmamı ister misiniz? Crontab'ı kullanmanız gerekiyorsa, yanıtlayabileceğiniz hatalar var mı?
xxmbabanexx

@xxmbabanexx: Yararlıydı ve daha iyisi görünmezse kesinlikle kabul edeceğim. Tamamen geliştirilmiş bir kez göndereceğim alternatif bir çözüm buldum. Hala birisinin sayfa iyi çalışıyorsa yenileme yapmayan bir çözüm bulmasını umuyorum, ancak bu olmazsa, cevabınız mükemmel kabul edilebilir ve kabul edeceğim.
SF.

@sf. Ek bilgi için teşekkürler. Matematik ödevimi bitirdiğimde, komut dosyasımı ağ bağlantısı kontrolünü içerecek şekilde düzenleyeceğim.
xxmbabanexx

Yanıtlar:


6

Sisteminizde Python bulunduğunu varsayarsak, bunun bir alternatifi vardır cron. Midori'yi her 5 dakikada bir yeniden yükleyecek hızlı bir Python 2.7.3 betiği oluşturdum.

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

Dinlenme süresi miktarını değiştirmeniz gerekirse, rest_timedeğişkeni değiştirmeniz yeterlidir .

Yeni Komut Dosyası

Programın "akıllı" olması için ihtiyaç duyduğunu söylediğin gibi, bunu yapmak için onu düzenledim. Bu programı kullanırken lütfen Midori'yi manuel olarak açmayın; komut dosyasından açın. Aksi takdirde Hızlı Dialer nedeniyle çökmesini tuhaf bir alışkanlığı var. Ayrıca Python 2.7.3 üzerinde çalışır. Tüm bu kopya ve yapıştırma işlemlerini yapmak istemiyorsanız, lütfen kodun benim macununu ziyaret edin .

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

Herhangi birinin gelip güncellenmiş bir cevap araması durumunda Midori artık bir komut satırı seçeneğine --inactivity-reset=SECONDS(veya -ikısa olarak) sahiptir.

Bu -aseçenekle birlikte, her x saniyede bir kiosk modunda sürekli olarak yeniden başlatılan bir tarayıcı elde edebilirsiniz.

Örneğin

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

Http://www.google.com/ tam ekran bir pencerede açılır ve 2 dakika boyunca herhangi bir işlem yapılmadığında sayfayı yeniler. ( -ebir komutu yürütür)


4

Farklı bir taraftan, çoğunlukla tarayıcıdan bağımsız olarak yaklaşmaya karar verdim.

Tarayıcı belirli bir yerel belgeye işaret ederek kiosk modunda başlatılır:

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>

Şimdi bu dosyada, zaman aşımı değeri uzak sayfanın iki normal otomatik yenilemesini ve bazılarını içerecek reload_urlşekilde ayarlandı ve URL'sine ayarlandı.

Uzak sayfada, yenilemesinin her doğru gerçekleştirilmesinde yürütülen bir snippet bulunur:

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

Kötü bir şey olursa - sayfa yüklenemez, 404 veya hata olarak yüklenir veya herhangi bir nedenden dolayı javascript durur veya bazı kaçırma yönlendirmeleri bizi farklı bir sayfaya iter, iki ardışık yenileme mesajı gelmezse, izleme çerçevesi URL'yi sıfırlar otomatik olarak yeniden yükleme gerçekleştirir.

Unutmayın, try ... catch, postMessage'ı desteklemeyen eski tarayıcılarla ilgili sorunları önlemek içindir. Çevreyi kontrol ettiğimiz ve her zaman doğru tarayıcının kullanılacağından emin olabileceğimiz için bu kiosk ile ilgili bir sorun olmayacaktır. OTOH, rasgele istemci bilgisayarlarda, postMessage işleminin, komutları iptal etme hatasına neden olmadığı sürece postMessage işleminin işlem yapmaması nedeniyle, bu yüzden deneyin ..catch.


3

Bir f5 tuşa basımı taklit etmek için xdotool kullanıyorum

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

ve sonra crontab'ımda o betiği her dakika çalıştırıyorum

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.