PythonistaでSonyのデジカメのリモートコントロール [Pythonista]
Wifiに繋がるソニーのデジカメはWifi経由でカメラをコントロールするための
Camera Remote APIを公開しているので、
iPhone上で動くPythonistaから接続を試してみた。
1. SSDPでデジカメの接続先を探す
iPhoneをデジカメのWifiに接続して、SSDPを送ることでカメラのIPアドレスと
接続するURLを調べられるようだ。
ということでPythonistaからSSDPを送ってみる。
実行してみたけどtimeoutしてデジカメが検出出来なかった。
不思議なことにiPhoneをデジカメのWifiに繋いでも、iPhoneのWifi接続マークが出なくて、
"4G"のままになっていた。けど状態でソニーが作ったデジカメをコントロールするアプリはちゃんと動くし、さらに普通にネットにも繋がってるという、両方に繋がっている状態に見える。
よくわからない状態だったので、ネットで調べてると接続先URLを見つけたのでそこへ接続することにした。
後で分かったことだけど、デジカメにWifiで繋ぐと、デジカメのIPは10.0.0.1、iPhoneのIPは10.0.1.1となっているが、
デフォルトゲートウェイが設定されていないせいで、SSDPの通信はデジカメに行かないでインターネット側に送っていたらしい。
iPhoneの"4G"の通信を止めてやることで、上のプログラムを実行するとデジカメから反応があった。
このLOCATIONに書いてあるURLにアクセスすると、カメラをコントロールするためのURLを返してくれるらしい。
2. デジカメのコントロール
JSONでカメラをコントロールするためのコマンドを書いてURLへ送ることでカメラが動いてくれるらしい。
試しにシャッターを切るコマンドを送ってみた。
ちゃんとシャッターを切ってくれた。
これでカメラをコントロール出来るようになった。
後はシャッターボタンとかのUIを作ってやれば、写真を撮るアプリが出来そう。
Camera Remote APIを公開しているので、
iPhone上で動くPythonistaから接続を試してみた。
1. SSDPでデジカメの接続先を探す
iPhoneをデジカメのWifiに接続して、SSDPを送ることでカメラのIPアドレスと
接続するURLを調べられるようだ。
ということでPythonistaからSSDPを送ってみる。
import socket MSEARCH_REQUEST_LINES = ( 'M-SEARCH * HTTP/1.1', 'HOST: 239.255.255.250:1900', 'MAN: "ssdp:discover"', 'MX: %(timeout)s', 'ST:urn:schemas-sony-com:service:ScalarWebAPI:1', '', '' ) timeout = 5 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(timeout) req = '\r\n'.join(MSEARCH_REQUEST_LINES) % {'timeout': timeout} sock.sendto(bytes(req, encoding='utf-8'), ('239.255.255.250', 1900)) while True: try: res, device = sock.recvfrom(4096) print('----------- from %s' % (device,)) print(res) print('-----------') except socket.timeout: print("timeout") break sock.close()
実行してみたけどtimeoutしてデジカメが検出出来なかった。
不思議なことにiPhoneをデジカメのWifiに繋いでも、iPhoneのWifi接続マークが出なくて、
"4G"のままになっていた。けど状態でソニーが作ったデジカメをコントロールするアプリはちゃんと動くし、さらに普通にネットにも繋がってるという、両方に繋がっている状態に見える。
よくわからない状態だったので、ネットで調べてると接続先URLを見つけたのでそこへ接続することにした。
後で分かったことだけど、デジカメにWifiで繋ぐと、デジカメのIPは10.0.0.1、iPhoneのIPは10.0.1.1となっているが、
デフォルトゲートウェイが設定されていないせいで、SSDPの通信はデジカメに行かないでインターネット側に送っていたらしい。
iPhoneの"4G"の通信を止めてやることで、上のプログラムを実行するとデジカメから反応があった。
b'HTTP/1.1 200 OK CACHE-CONTROL: max-age=1800 EXT: LOCATION: http://10.0.0.1:64321/scalarwebapi_dd.xml SERVER: UPnP/1.0 SonyImagingDevice/1.0 ST: urn:schemas-sony-com:service:ScalarWebAPI:1 USN: uuid:00000000-xxxx-xxxx-xxxx-xxxxxxxx::urn:schemas-sony-com:service:ScalarWebAPI:1 X-AV-Physical-Unit-Info: pa=""; pl=; X-AV-Server-Info: av=5.0; hn=""; cn="Sony Corporation"; mn="SonyImagingDevice"; mv="1.0";
このLOCATIONに書いてあるURLにアクセスすると、カメラをコントロールするためのURLを返してくれるらしい。
2. デジカメのコントロール
JSONでカメラをコントロールするためのコマンドを書いてURLへ送ることでカメラが動いてくれるらしい。
試しにシャッターを切るコマンドを送ってみた。
import json import requests SONY_CAMERA_URL = 'http://10.0.0.1:10000/sony/camera' def sony_cam_control_1 (): req_body = json.dumps({ 'method' : 'actTakePicture', 'params' : [], 'id' : 1, 'version': '1.0' }) res = requests.post(SONY_CAMERA_URL, data=req_body) #print("%s" %(res)) print(res.json()) return res.json() ret = sony_cam_control_1()
ちゃんとシャッターを切ってくれた。
これでカメラをコントロール出来るようになった。
後はシャッターボタンとかのUIを作ってやれば、写真を撮るアプリが出来そう。
2018-08-29 22:18
nice!(0)
コメント(4)
良さげだね。
Bluetoothじゃ無いんだね。
しかしてデフォゲ切れないと閉じた世界での撮影になるのねん。
距離が気になるとこかな?
by TAK (2018-08-30 07:34)
Bluetoothは無いけどWifiのほかにNFCでも繋がるよ。
デフォゲの設定がないおかげでカメラと繋げながらインターネットにも繋がって便利というみかたもあるよね。
リモートコントロールもそんなに離れてはやらないと思うから、自撮り出来る範囲なら距離も問題ないんじゃないかと思うよ。
by ろ (2018-08-30 10:52)
なるほどNFCも使えるのか。
リモコンレベルでは問題無いね。
VPNとか使って(自宅のカメラを外出先から制御のイメージで)遠隔で使えたりしたらスゲーと思ったが、それは、難しそうかな。
まあ、現状でも色々出来そうではあるね。
by TAK (2018-08-31 08:49)
VPNなら家のネットに繋がってるのと同じ状態になるからカメラの制御は出来るかもしれないね。
最近はペットか赤ちゃん向けにそういう製品もあるからそっちの方がいいかもしれないけど、使ってない時ならデジカメもありか
by ろ (2018-08-31 12:55)