『DSC - QX10 をゲットしたので、カメラを制御するのに、SSDPとか、JSON-RPC over HTTP を利用した簡単なアプリケーションを C# で作ってみた』を書いた後に、ふと疑問になったことがあったのでソースは手を抜きつつも、記事にしてみた
DSC - QX10 をゲットしたので、カメラを制御するのに、SSDPとか、JSON-RPC over HTTP を利用した簡単なアプリケーションを C# で作ってみた で DSC - QX10 に関する記事を書きました。こいつ、なかなかよいですよ。休みの日などはよく使ってます。一眼レフ並みの写真も撮れます。背景をぼかしちゃうみたいなこともできます。
こんな感じも。
写真を何枚か撮ってふと疑問に思ったんですけど、本体のシャッターボタン(写真の赤枠部分)を押したとき、どんな仕組みでアプリが反応してるのか?という疑問がわきました。
さて、早速 API 仕様書をみてみましょう。パッと見るかぎり、下図のメソッドぽいですね。
The purpose of this API is sending the event from the server actively. When the client calls some APIs and/or the user operates the camera directly, the client can get the parameter updates from the camera by using this API.
この API でうまくいきそうです。params の説明に、Long polling フラグという説明があります。このパラメータを true に設定し、QX10 にリクエストを送出すると、タイムアウト or 何か変更があったらレスポンス返されるようになります。まさに、Long Time Polling ですね。( デバイスのプログラミングとは思えない感じです。 )
それでは、実装してみましょう。前回のソースを流用すると、下記の通りになります。( 今回も汎用性はまったくないメソッドですw JSONの文字列を少し変更して、メソッド名が DoPost2 になっただけだし...)
static async void DoPost2() { string jsonparams = "{\"method\": \"getEvent\"," + "\"params\": [true]," + "\"id\": 1," + "\"version\": \"1.0\"}"; string url = "http://10.0.0.1:10000/sony/camera"; var httpclient = new HttpClient(); var jsoncontent = new StringContent(jsonparams, Encoding.UTF8, "application/json"); httpclient.MaxResponseContentBufferSize = int.MaxValue; var response = await httpclient.PostAsync(url, jsoncontent); String text = await response.Content.ReadAsStringAsync();
MessageBox.Show(text); } private void button3_Click(object sender, EventArgs e) { Task t = new Task(DoPost2); t.Start(); }
上記のロジックを実行すると下記のような結果が返却されます。
{ "id": 1, "result": [ null, null, null, null, null, , , null, { "motionRecognition": "None", "sceneRecognition": "None", "steadyRecognition": "Tripod", "type": "sceneRecognition" }, null, , null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ] }
カメラ側のシャッターボタンを押して、ロジックを実行すると下記のような結果が返却されます。takePictureUrlに 写真の URL が返されています。
{ "id": 1, "result": [ null, { "cameraStatus": "IDLE", "type": "cameraStatus" }, null, null, null, [ { "takePictureUrl": [ "http://10.0.0.1:60152/pict140203_2204460000.JPG?%211234%21http%2dget%3a%2a%3aimage%2fjpeg%3a%2a%21%21%21%21%21" ], "type": "takePicture" } ], , null, { "motionRecognition": "None", "sceneRecognition": "None", "steadyRecognition": "Tripod", "type": "sceneRecognition" }, null, [ { "numberOfRecordableImages": 183, "recordTarget": true, "recordableTime": -1, "storageDescription": "Storage Media", "storageID": "Memory Card 1", "type": "storageInformation" } ], null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ] }
実際には、リクエストを出し続けて、結果が返却されるまでループするなどのロジックが必要なのはお分かりだと思います。そうです、興味がパッとわいただけなので、手抜を抜きました。次からは本気だしますwww
※こっち買ってもよかったな....