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:セキュリティ的に公開サーバーなどではこのような事をしない方が良い。