やはりエンジニアは常にエンジニアでいるべきだと私は思うのです。
ということで、愛機Olympus E-M5 Mark II のWifi機能をハックしてワイヤレスレリーズを作りたいと思います。
OlympusのカメラはOI.Shareというアプリでシャッターを切ったり、写真を転送することができます。
今回は手元にあるNexus5にこのアプリを導入し、そのアプリで行っている通信をキャプチャしてみようと思います。
手順としては下記のようになります。
①Android端末(Nexus5)にカメラコントロール用のアプリ(OI.Share)とパケットキャプチャ用のアプリを導入
②実際にOI.Shareでカメラ接続~シャッターを切るところまで実行・パケットをキャプチャ
③キャプチャしたデータをPCに送り、パケット解析用ソフト(Wireshark)で解析
①Android端末(Nexus5)にカメラコントロール用のアプリ(OI.Share)とパケットキャプチャ用のアプリを導入
Windowsでパケットキャプチャソフトを使用してパケットを見たりしたことはあったのですが、android端末では初めてだったので、まずはandroid端末でパケットキャプチャを行う方法から調べました。私の手元にあるNexus5はルートをとっていないので、ルート権限がなくても実現可能な方法を探したところ、tPacketCaptureというソフトを使用すればできそうだと分かりました。
http://www.taosoftware.co.jp/android/packetcapture/
試しにインストールしたところ、動作させることができました。
あとは実際にカメラに接続して操作するためにOlympusのOI.Shareを用意しておきます。
https://play.google.com/store/apps/details?id=jp.olympusimaging.oishare&hl=ja
余談ですが、いつも三脚使って撮影するときにはこのOI.Shareのワイヤレスレリーズ機能を使用させてもらってます。ただのレリーズ機能だけではなくスマホでライブビューしながら撮影できたりもします。撮った写真もすぐにスマホに転送できるので友人との旅行のときには重宝しています。(Olympusの回し者じゃないですよ...
②実際にOI.Shareでカメラ接続~シャッターを切るところまで実行・パケットをキャプチャ
実際にパケットをキャプチャしてみます、まずばカメラのwifiを有効にして、接続準備しておきます。
次にandroid端末側でtPacketCaptureを起動し、キャプチャを開始します。
あとはカメラにwifi接続し、リモコンレリーズモードにしてシャッタを切ります。
キャプチャ完了したら.pcap拡張子のファイルが生成されます。
③キャプチャしたデータをPCに送り、パケット解析用ソフト(Wireshark)で解析
キャプチャしたデータをPCに送ります。私はdropbox経由で送りました。
あとはPCの解析ソフトで解析します。
私は定番のWiresharkを使用しました。
ざっと通信を確認したところ、httpでやり取りがされているようでした。
ここでとりあえずhttpでフィルタかけてみます。
switch_cammmode.cgiやexec_shutter.cgiあたりにgetリクエストかければ動きそうな感じです。
とりあえずこの解析で得られたとおりにhttpリクエストを送ってみました。
...が、ここで躓きました。
上記のURIにアクセスしてもなんだか正常なレスポンスが返ってきません。
悩んだ挙句、上記のswich_cammode.cgiでググってみたところ、すでに解析されてる方がいました。
Olympus TGとWi-fiコントロール・基本編
こちらの方は別のカメラで行っていますが、olympusのカメラならほぼ同じ手順でできるようです。
こちらの記事を参照させていただいたところ、httpでアクセス(コマンドを送る)ためにはhttpヘッダの指定が必要のようです。
Connection: Keep-Alive
User-Agent: OI.Share v2
また、カメラ側のIPアドレスは192.168.0.10固定のようです。
ヘッダにこの情報を付加して再度挑戦したところ、正常っぽいレスポンスが返ってきました。
カメラに接続後、
switch_cammode.cgi?mde=shutter
でリモコンレリーズモードに入り、
exec_shutter.cgi?com=1st2ndpush
exec_shutter.cgi?com=2nd1strelease
でシャッタが切れました。
curlコマンドで書くとこんな感じです。
curl --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI:Share v2' "http://192.168.0.10/switch_cammode.cgi?mode=shutter"
curl --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI:Share v2' "http://192.168.0.10/exec_shutter.cgi?com=1st2ndpush"
curl --header 'Host: 192.168.0.10' --header 'Connection: Keep-Alive' --header 'User-Agent: OI:Share v2' "http://192.168.0.10/exec_shutter.cgi?com=2nd1strelease"
とりあえずこれでシャッタが切れるようになりました。
次はこれを利用してワイヤレスレリーズを実際に作ってみたいと思います。
0 件のコメント:
コメントを投稿