SSブログ

PythonistaでSonyのデジカメのリモートコントロール [Pythonista]

Wifiに繋がるソニーのデジカメはWifi経由でカメラをコントロールするための
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を作ってやれば、写真を撮るアプリが出来そう。


nice!(0)  コメント(4) 

nice! 0

コメント 4

TAK

良さげだね。
Bluetoothじゃ無いんだね。
しかしてデフォゲ切れないと閉じた世界での撮影になるのねん。
距離が気になるとこかな?
by TAK (2018-08-30 07:34) 

ろ

Bluetoothは無いけどWifiのほかにNFCでも繋がるよ。
デフォゲの設定がないおかげでカメラと繋げながらインターネットにも繋がって便利というみかたもあるよね。
リモートコントロールもそんなに離れてはやらないと思うから、自撮り出来る範囲なら距離も問題ないんじゃないかと思うよ。
by (2018-08-30 10:52) 

TAK

なるほどNFCも使えるのか。
リモコンレベルでは問題無いね。
VPNとか使って(自宅のカメラを外出先から制御のイメージで)遠隔で使えたりしたらスゲーと思ったが、それは、難しそうかな。
まあ、現状でも色々出来そうではあるね。
by TAK (2018-08-31 08:49) 

ろ

VPNなら家のネットに繋がってるのと同じ状態になるからカメラの制御は出来るかもしれないね。
最近はペットか赤ちゃん向けにそういう製品もあるからそっちの方がいいかもしれないけど、使ってない時ならデジカメもありか
by (2018-08-31 12:55) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Raspberry Pi で Tenso..Pythonistaでgitを使う ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。