最近流行のスティックPCですが、これを使ってWindowsPCによるデジタルサイネージが出来ないか、模索してます。
PCベースでデジタルサイネージを構築する際、必要になってくるがブラウザ制御用ソフト。基本放置で何時間も稼働するわけですが、不意のリセットやフリーズ、勝手な再起動にどう対処するかが、課題になります。
まずは、どんなサイネージになるのかデモを作ろうと思い、IEをコントロールする用のスクリプトをUWSCで書いてみました。UWSCはフリーのWindowsコントロール用スクリプト言語。元々はマウスの動きを「録画して」再生するソフトだったと思います。基本的にWindowsの制御には最適な言語です。
とりあえず、スクリプトをEXE化して、スタートアップに入れ、自動でブラウザを起動、定期的に読み込み直し、時間が来たら終了、をやってみたいと思います。(EXE化はUWSCシェアウェア版の機能)
とりあえず、UWSC公式サイトのIE起動サンプルをベースに組み立てます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
STOPFORM(FALSE) //stopボタンを非表示に //ブラウザをフルスクリーンで起動 Public IE IE = CreateOLEObj("InternetExplorer.Application") IE.Visible = true setOleEvent() URL = "スライドショーの置いてあるURL" IE.Navigate(URL) IE.FullScreen = True //定期的に読み込み直し WHILE 1 KBD(VK_F5, CLICK, 100) //F5キーを押す SLEEP(600) //600秒に1回リロード GETTIME() X = G_TIME_HH2 + G_TIME_NN2 //現在時刻の取得 IFB X = 2030 THEN //20時30分にシャットダウンする POFF(P_SHUTDOWN) //PCをシャットダウン ENDIF WEND //------IE制御用 DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32 CONST WM_ACTIVATE = $06 Public Pub_url, Pub_docc, Pub_BeforNav_cnt, Pub_DocComp_cnt, Pub_inp_flg Procedure BusyWait() Sleep(0.3) tm = GetTime() repeat ifb GetTime() - tm > 90 // TimeOut Pub_docc = ""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0 IE.Navigate(Pub_url) tm = GetTime() endif Sleep(0.2) ifb Pub_inp_flg Pub_inp_flg = False continue endif if IE.busy then continue if Pub_url = "" then break // No read if (Pos("*"+Pub_url+"*",Pub_docc)) or (Pos("*"+IE.LocationURL+"*",Pub_docc)) or (Pub_BeforNav_cnt<=Pub_DocComp_cnt) then else continue errflg = False if IE.document.title = "503 Unavailable" then errflg = True if IE.document.title = "Service Unavailable" then errflg = True if IE.document.title = "503 Service Temporarily Unavailable" then errflg = True ifb errflg Sleep(90) // 503: Wait&Retry tm = 0 continue endif Sleep(0.3) until ! Pub_inp_flg Pub_url=""; Pub_docc=""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0 SendMessageA(IE.Hwnd, WM_ACTIVATE, 0, 0) Fend Procedure setOleEvent() OleEvent(IE, "DWebBrowserEvents2", "BeforeNavigate2", "fucBeforNav") OleEvent(IE, "DWebBrowserEvents2", "DocumentComplete", "fucDocComp") OleEvent(IE, "DWebBrowserEvents2", "OnQuit", "fucQuit") Pub_url=""; Pub_docc=""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0; Pub_inp_flg=False Fend Procedure fucBeforNav() ifb (Pos("javascript:",""+EVENT_PRM[1])=0) and ("about:blank"<>""+EVENT_PRM[1]) if Pub_url="" then Pub_url = ""+EVENT_PRM[1] Pub_BeforNav_cnt = Pub_BeforNav_cnt + 1 endif Pub_inp_flg = True Fend Procedure fucDocComp() ifb (Pos("javascript:",""+EVENT_PRM[1])=0) and ("about:blank"<>""+EVENT_PRM[1]) Pub_docc = Pub_docc + "*"+EVENT_PRM[1]+"*" Pub_DocComp_cnt = Pub_DocComp_cnt + 1 endif Pub_inp_flg = True Fend Procedure fucQuit() ExitExit Fend |
実際に表示するスライドショートして、フルスクリーン表示が可能な、jqueryのスライダーcamera slideshowを使ってみました。画像のみ差し替えあとはフルスクリーンのデモそのままです。
http://agn-web.com/demo/camera/demo/fullscreen.htm
デモではドロップボックスのpublicフォルダにスライド用の写真を入れてありますので、ドロップボックスに指定のファイル名で画像を放りこめば、デジタルサイネージのスライドショーも差し変わる、コンテンツ更新らくらく仕様です。
これで、UWSCのEXEファイルをPCに仕込むことで、フルスクリーンでIEを起動し、定期的にリロードして、指定時間にスリープするデジタルサイネージ用PCとしての体裁が整いました。
できれば、これらに加えて
・安全のためキー操作などのハードウェアロック。
・PCのハードウェア情報などのログを取り、1日1回メールで送信。
・WEBカメラを仕込んで、立ち止まった人の数を計測。
・その時何を見ていたかと合せてレポート作成。
なども仕込んでおくと、これだけでも結構高機能なデジタルサイネージになりますね。安全な連続運転にはもっと色々気を遣う必要がありますが、デモとしては十分でしょう。
安価なWindowsベースのスティックPCの登場で夢が広がります。
本格的に動かすならならもうちょっと堅牢さが必要だと思います。自由度ではRasberry PiあたりでLinuxベースのシステムを組んだ方がいいような気もします。とりあえず、お手軽さを重視して、UWSCを使った構築例でした。