Penyegaran otomatis untuk Midori


11

Saya menggunakan Raspberry Pi untuk membuat kios web non-interaktif - halaman web tertentu (pengukuran dari stasiun pemantauan jarak jauh) untuk ditampilkan pada layar dalam mode layar penuh, konten sering disegarkan melalui AJAX.

Sekarang ada beberapa solusi untuk membuat Raspberry menjadi kios, dan saya cukup yakin saya akan bisa melakukannya dengan baik, tetapi kios itu harusnya bebas perawatan. Terutama dalam situasi ketika listrik padam, kemudian hidup kembali, tetapi entah bagaimana router / modem / infrastruktur jaringan tidak cukup online.

Dalam situasi itu Midori akan memunculkan halaman tentang "tidak dapat terhubung" atau sesuatu seperti itu dan akan macet seperti ini sampai seseorang siklus kekuatan lagi - karena halaman web termasuk mekanisme autorefresh sendiri gagal memuat!

Sekarang bagaimana saya bisa memaksa Midori memuat halaman ketika jaringan tersedia lagi, atau sesuatu dengan efek yang sama (auto-refresh selalu setiap 15 menit atau lebih, atau terus menyegarkan sampai halaman memuat atau semacamnya.)?

Jika opsi itu tidak tersedia untuk Midori, dapatkah Anda merekomendasikan beberapa solusi lain?


Saya tidak punya akses ke Pi sekarang, dan juga tidak ke Midori, tapi mungkin Midori memiliki dukungan dbus? Anda dapat mencoba menjalankan qdbus(dari paket libqt4-dbus) atau alat serupa dan mencari Midori di sana. Maka Anda kemungkinan besar dapat memicu penyegaran halaman.
Arne

Bahkan lebih baik: Sepertinya Midori memiliki sesuatu yang tertanam di dalamnya . Mungkin Anda bisa mencobanya dan mengirim jawaban di sini.
Arne

Apakah jawaban saya tidak berguna? Apakah Anda ingin saya menulis skrip bash alih-alih Python? Jika Anda perlu menggunakan crontab, adakah kesalahan yang bisa Anda balas?
xxmbabanexx

@xxmbabanexx: Itu berguna dan saya pasti akan menerimanya jika tidak ada yang lebih baik muncul. Saya telah menemukan solusi alternatif yang akan saya posting setelah sepenuhnya dikembangkan. Saya masih berharap seseorang datang dengan solusi yang tidak melakukan refresh jika halaman berfungsi dengan baik tetapi jika itu tidak terjadi, jawaban Anda sangat dapat diterima dan saya akan menerimanya.
SF.

@sf. Terima kasih atas info tambahannya. Setelah saya menyelesaikan pekerjaan rumah matematika saya, saya akan mengedit skrip saya untuk memasukkan pemeriksaan koneksi jaringan.
xxmbabanexx

Jawaban:


6

Dengan asumsi bahwa Anda memiliki Python di sistem Anda, ada alternatif untuk cron. Saya telah membuat skrip Python 2.7.3 cepat yang akan memuat ulang Midori setiap 5 menit.

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

Jika Anda perlu mengubah jumlah waktu istirahat, cukup ubah rest_timevariabelnya.

Skrip Baru

Seperti yang Anda katakan bahwa Anda membutuhkan program untuk menjadi "pintar", saya telah mengeditnya untuk membuatnya jadi. Saat menggunakan program ini, tolong jangan membuka Midori secara manual; buka dari skrip. Saya memiliki kebiasaan aneh untuk menabrak karena Speed ​​Dialer jika Anda melakukannya. Ini juga berjalan di Python 2.7.3. Jika Anda tidak ingin melakukan semua copy dan paste itu, silakan kunjungi kode pastebin saya .

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

Untuk berjaga-jaga jika ada yang datang dan mencari jawaban yang diperbarui, Midori sekarang memiliki opsi baris perintah --inactivity-reset=SECONDS(atau -isingkatnya).

Digabungkan dengan -aopsi, Anda dapat mencapai peramban yang terus-menerus memulai kembali dalam mode kios setiap x detik.

misalnya

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

Akan membuka http://www.google.com/ di jendela layar penuh dan menyegarkan halaman setelah 2 menit tidak aktif. ( -emengeksekusi perintah)


4

Saya memutuskan untuk mendekatinya dari sisi yang berbeda, sebagian besar tidak bergantung pada browser.

Browser dimulai dalam mode kios, menunjuk ke dokumen lokal tertentu:

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>

Sekarang dalam file ini, nilai batas waktu disesuaikan untuk mengandung dua autorefresh normal dari halaman jarak jauh ditambah beberapa, dan reload_urldiatur ke URL-nya.

Halaman jarak jauh memiliki snippet yang dieksekusi setiap kali refresh dilakukan dengan benar:

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

Jika sesuatu yang buruk terjadi - halaman gagal dimuat, dimuat sebagai 404 atau kesalahan atau javascriptnya berhenti karena alasan apa pun, atau beberapa pembajak redirect mendorong kita ke halaman yang berbeda, jika dua pesan penyegaran berturut-turut gagal tiba, bingkai pengawas me-reset URL ke sumber asli, yang secara otomatis melakukan pemuatan ulang.

Catatan, coba ... tangkap adalah untuk mencegah masalah dengan browser lama yang mungkin tidak mendukung postMessage. Ini tidak akan menjadi masalah dengan kios karena kami mengontrol lingkungan dan selalu dapat memastikan peramban yang tepat akan digunakan. OTOH, pada komputer klien acak tanpa bingkai mendengarkan pesan operasi postMessage adalah no-op asalkan tidak menyebabkan kesalahan pembatalan skrip, jadi coba..catch.


3

Saya menggunakan xdotool untuk mensimulasikan penekanan tombol 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

dan kemudian di crontab saya menjalankan skrip itu setiap menit

 */1 *   *   *   *    /home/pi/bin/refresh_kiosk.sh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.