PHPでRaspberryPiをリブートする

この記事は次のブログに引っ越しました。

PHPでRaspberryPi3 B+を再起動する <?php $bReboot = ($_GET['reboot'] == 'yes' ) ? true : false; if( $bReboot ){ print( "Now rebooting..." ); exec( 'sudo reboot now', $result ); print_r( $result ); } else { print( "Not rebooting" ); } ※再起動できずにエラーが出る場合、実行スクリプトのアクセス権に問題がある可能性があります。 ■所感 自宅のRaspberryPiに、GrovePiを使って温度や湿度を測ってtwitterなどに呟けるようになったり、YoutubeLiveのストリーミングなどは出来るようになったのですが、PureDataAsteriskなど色々遊ぶうちに長時間放置しておくとSSHでログインできなくなるようになりました。 厳密に言うと、SSHでログインは出来る(パスワードが通るところまでは出来る)のですが、その後の入力コンソールの表示待ちになってしまいます。 TeamViewer for Raspbianも入れているのですが、そちらからもパスワードが通ってから画面が出る前のタイミングで固まってしまいます。 どちらの方法も、再起動するとログイン出来て普通に使えるので、遊んでいるうちの何かがオーバーフローしているのかもしれません。 以前のRaspbianで、モニタを外していると省エネモードに入ってしまいWiFiが使えなくなる現象はあったみたいですが、ログインできない状態でもWiFi経由でApache(httpサーバー)が動いているのを確認できているので、これが原因ではないと思われます。 OSを入れ直すのが早いのかもしれませんが、ちょっと面倒なのと、今後YoutubeLiveのストリーミング機や土壌センサーによる水撒きとか、ガイガーカウンター値を呟くとか、色々やってみたい際に、外部から困った時の再起動を行うこともあるんだよなぁと思った次第です。 余談ですが、温度・湿度・放射能値などの気象観測で得た数値を発表する場合、とくに災害防止などのために測定したものは気象業務法第6条に触れるため、気象庁に届け出をしないといけないそうです。届けても認可が降りるのは認定済みの(高い)機器で測定したものに限るらい。災害防止目的以外でも、農業や施設内利用といった免除対象以外は公開するのに届けが必要で、測定結果に対しての文字情報ならOKで、数値だけの発表はNGらしいです。 閑話休題。さて、プログラム的には上記がベースになっているのですが、具体的な仕組みとして、 外部にあるサーバー(Lolipop)に再起動を促すフラグを記載したjsonファイルを置く(PHPjsonデータを返しても良い) RaspberryPiからcronで定期的に(1)をチェックしにいく フラグが立っていたらフラグを下ろすリクエストを(1)の外部サーバに送る(フラグを下ろすURLにアクセスする) 外部サーバはフラグが降りたら、その結果をjson形式で返す 無事フラグが降りたのを確認したら、RaspberryPiは再起動を行う 以下はそのサンプルの一部です。 <?php $host = "http://yourHostServer.com/"; $check = "checkRebootStatus.php"; //再起動フラグを確認 $reset = "checkRebootStatus.php?flag=off"; //再起動フラグを下ろす。下ろした結果がjsonで返ってくる。 $reboot = "checkRebootStatus.php?flag=on"; //再起動フラグを立てる。 $aResult = json_decode( file_get_contents( $host . $check ), true ); if( $aResult['reboot'] ){ $sUrl = $host . $reset; $aResult = json_decode( file_get_contents( $sUrl ), true ); if ( $aResult['reboot'] ){ echo "Can not reset reboot flag at : {$sUrl}"; } else { echo "Now rebooting..."; exec( 'sudo reboot now', $result ); //exec( 'python ./reboot.py 2>&1', $result ); Print_r( $result ); } } else { //フラグが立っていない場合、その旨とフラグを立てるリンクを表示。 echo "<p>no change</p>"; echo "<p><a href='{$host}{$reboot}'>Turn on reboot flag.</a></p>"; echo "<p>Go to the link above and comeback to this page.</p>"; }