みどりの自動更新


11

Raspberry Piを使用して、非インタラクティブなWebキオスクを作成しています。特定のWebページ(リモート監視ステーションからの測定値)を全画面モードで画面に表示し、AJAXを通じてコン​​テンツを頻繁に更新します。

現在、Raspberryをキオスクにするための解決策はいくつかあります。きちんと実行できると確信していますが、キオスクはメンテナンスフリーです。特に電源が切れてから復帰する場合は、ルーター/モデム/ネットワークインフラストラクチャが完全にオンラインになりませんでした。

その状況では、Midoriは「接続できません」などのページを表示し、誰かが再び電源を入れ直すまで、このようにスタックします-独自の自動更新メカニズムを含むWebページがロードに失敗したためです。

では、ネットワークが再び利用可能になったときにMidoriに強制的にページを読み込ませる方法や、同様の効果(15分ごとに常に自動更新する、またはページが読み込まれるまで更新を続けるなど)を強制するにはどうすればよいですか?

Midoriがそのオプションを使用できない場合、他の解決策をお勧めできますか?


現在Piにアクセスできず、Midoriにもアクセスできませんが、Midoriにはdbusサポートがありますか?あなたは、実行してみてください可能性がありqdbus(パッケージからlibqt4-dbusか、そこにみどりのためのいくつかの同様のツールと見て)。次に、おそらくページの更新をトリガーできます。
Arne

さらに良い:Midoriには何かが組み込まれているようです。多分あなたはそれを試して、ここに答えを投稿することができます。
Arne、

私の答えは役に立ちませんでしたか?Pythonではなくbashスクリプトを作成しますか?crontabを使用する必要がある場合、返信できるエラーはありますか?
xxmbabanexx 2013

@xxmbabanexx:便利でしたが、もっと良いものが表示されなければ、私はきっとそれを受け入れます。完全に開発されたら投稿する代替ソリューションを見つけました。ページが正常に機能している場合に誰かが更新を実行しないソリューションを考え出すことをまだ望んでいますが、それが発生しない場合、あなたの答えは完全に受け入れ可能であり、受け入れます。
SF。

@sf。追加情報をありがとう。数学の宿題を終えたら、スクリプトを編集してネットワーク接続チェックを含めます。
xxmbabanexx 2013

回答:


6

システムにPythonがインストールされていると仮定すると、に代わるものがありcronます。Midoriを5分ごとにリロードする簡単なPython 2.7.3スクリプトを作成しました。

#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を手動で開かないください。スクリプトから開きます。スピードダイヤラーが原因でクラッシュするという奇妙な癖があります。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>

このファイルでは、タイムアウト値が調整され、リモートページの2つの通常の自動更新に加えていくつかreload_urlが含まれ、そのURLに設定されます。

リモートページには、更新が正しく実行されるたびに実行されるスニペットがあります。

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

何か悪いことが起こった場合-ページの読み込みに失敗するか、404またはエラーとして読み込まれるか、なんらかの理由でそのJavaScriptが停止するか、ハイジャックリダイレクトによって別のページにプッシュされます。自動的にリロードを実行します。

注:try ... catchは、postMessageをサポートしていない可能性のある古いブラウザの問題を回避するためのものです。これはキオスクでは問題になりません。私たちが環境を制御し、常に適切なブラウザが使用されることを保証できるからです。OTOH、メッセージをリッスンするフレームのないランダムクライアントコンピューターでは、スクリプト中止エラーが発生しない限り、postMessage操作は何も実行されないため、try..catchになります。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.