Rokiのチラ裏

学生による学習のログ

Siriから自宅サーバー監視カメラ(motion)をオンオフするまで

今回もお家ハックネタ。ラズパイとかでも同じ事ができると思う。 motionについては過去のエントリを参照してほしい。

さて、取り敢えずまずはphpからmotionを起動したり殺したりしなければならない。そのためにはroot権限が必要になる。これには、apacheからのmotion実行に対しての操作はパスワードが不要である旨をvisudoに明記する必要がある。*1

% sudo visudo
Defaults visiblepw
www-data ALL=(ALL) NOPASSWD:/usr/bin/motion;/usr/bin/killall

で、phpファイルであるが、motionプロセスが立ち上がっていれば殺し、立ち上がっていなければ生成させるようにする。取り敢えず以下のようにしている。

<?php
$output=shell_exec('ps alx | grep motion | grep -v grep | grep -v \'php motion\'');

if(strpos($output,'motion')!==false){
    `sudo killall motion`;
}
else if(strpos($output,'motion')===false){
    `sudo motion`;
}
?>

以上で、HTTP GETリクエストを送ればmotionが付いたり消えたりするようになる。

$ curl -X GET "http://server/motion.php"

さて、次にHTTPリクエストを送るだけのアプリを作る。といっても本当にHTTPリクエストを送るだけなので簡単。レスポンスが返ってきた瞬間にアプリを即終了させる。

import UIKit

class URLSessionGetClient {
    func get(url urlString: String) {
        let url = URL(string: urlString)
        let task = URLSession.shared.dataTask(with: url!) { data, response, error in
            if let _ = data, let response = response {
                print(response)
                exit(EXIT_SUCCESS);
            } else {
                print(error ?? "Error")
                exit(EXIT_SUCCESS);
            }
        }
        task.resume()
    }
    
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let urlSessionGetClient = URLSessionGetClient()
        urlSessionGetClient.get(url: "http://192.168.12.2/motion.php")
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

適当にアイコンを設定。アイコンは一つ素材を用意すればconvertコマンドで別サイズの画像を生成できる。

% convert icon.png -resize 120x120 appiconset/iPhone-App-7-10-60pt@2x.png
% convert icon.png -resize 180x180 appiconset/iPhone-App-7-10-60pt@3x.png

後は、連絡先などでニックネームを決めてやるとSiriから任意の呼称で起動できるようになる。以下のように動く。

総括

お家ハックは楽しい。

*1:セキュリティ的に公開サーバーなどではこのような事をしない方が良い。