PanasonicのカメラとのWiFi通信
PanasonicのLUMIX GシリーズのミラーレスカメラGX8を購入しました。 WiFi通信が使えるカメラは初めてなのでいろいろと実験してみました。
ここ数年のPanasonicのカメラはHTTPで接続すると/cam.cgiで色々と制御できるようなっているということが分かりました。
例
export host=192.168.54.1 curl -v "http://${host}/cam.cgi?mode=getstate"
ただ、この状態に持ってくるにはどうやら通信先のソフトをカメラ側に認識してもらう必要があるようです。
私はPanasonic純正のAndroidアプリImage Appをインストールしてカメラを同じアクセスポイントに接続することでこのあたりはパスしました。
このへんは試していないので省略しますが、:60606/xxxxxxxxxxxx/Server0/ddd
や/cam.cgi?mode=accctrl&type=req_acc&
や/cam.cgi?mode=setsetting&type=device_name&
の2つを適切なパラメータで呼ぶ必要があるようです。詳しくはGitHub内を"cam.cgi"
でコード検索してみてください。
カメラ側でWi-Fi機能、履歴から接続するを選びAPに接続すると「スマートフォンのアプリを立ち上げていない場合は、立ち上げてください」と表示されるので、ここで1回だけcam.cgiのgetstateを送って認識させます。IPはDHCPなので事前になんとかして調べておいてください。本体のIPアドレス表示機能がありますが、接続しないと表示されないので使えないです。私はとりあえず一度だけImage Appを立ち上げてIPを確認しましたが、もうちょっとよい方法が欲しいところです。arpingとかを使えばいいのかな。
追記: とりあえず以下のようなスクリプトでpingを打つことにしてみました。
seq 200 254 | xargs -P32 -i ping -c1 -W 1 192.168.24.{} | grep icmp_
/cam.cgi?mode=startstream&value=49152
みたいなコマンドを送るとvalueで指定したUDPポートにMotionJPEGっぽいデータが送られてきます。
これをffplayで再生できるとの情報もありましたが、私の環境ではだめでした。netcatで受信後にffplayやmplayerで再生することはできました。
どうもパケットを解析してffd8からffd9までのJPEG部分だけを取り出して保存していく必要があるようです。このあたりも検索すればいろいろと出てきます。
ただ、なぜか動画の上部しか表示されませんでした。動画の大きさは/cam.cgi?mode=setsetting&type=liveviewsize&value=qvga
で変えられたので、QVGAで同じようにしてみたところ、うまく再生できました。
大きさはVGAとQVGAの2択のようです。フレームレートもあまり期待できないようなので、リモート制御するとき以外はあまり使うことはなさそうです。
で、肝心のファイルのダウンロードはどうするのか調べたところ、ダウンロード自体はhttp://${host}:50001/DO${id}.${ext}
のような形式のようですが、既知のidを使ってもうまくダウンロードできませんでした。
その後、UPnPでいろいろとしないといけないことが分かってきました。どうやらUPnPでファイル一覧にアクセスしてからでないとダウンロードできないようです。あと拡張子はなんでもよさそうです。jpgやmp4などを指定しておけばよいでしょう。
UPnPの処理は長くなるので以下のGistを見てください。
:60606/Server0/CDS_control
をPOSTしているところがそれです。
結果がXMLで得られたらあとはそれを解析するだけです。
ここまでくればお好みのスクリプトで調理してあげればよいです。この例ではxml2を使っており、事前にsudo apt install xml2
しておく必要があります。
あとはtmp.xmlを見ればなんとなく分かるかと思いますが、/Result/DIDL-Lite/item/@id=
がIDで/Result/DIDL-Lite/item/upnp:class=
がファイルの種類です。
ダウンロードは先程のhttp://${host}:50001/DO${id}.${ext}
となります。
PanasonicのカメラはAPIの仕様が公開されていないため苦労しましたが、先人のハックのおかげでここまでできるようになりました。 GH4やGH5とかでもたぶんいけるのではないでしょうか。
WiFiでのダウンロードよりもSDカードやUSBマスストレージを使う方が速いですが、お手軽にダウンロードスクリプトを走らせてしばらく放置しておけばよいので使える場面はあるかと思います。