都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

『DSC - QX10 をゲットしたので、カメラを制御するのに、SSDPとか、JSON-RPC over HTTP を利用した簡単なアプリケーションを C# で作ってみた』を書いた後に、ふと疑問になったことがあったのでソースは手を抜きつつも、記事にしてみた

 

DSC - QX10 をゲットしたので、カメラを制御するのに、SSDPとか、JSON-RPC over HTTP を利用した簡単なアプリケーションを C# で作ってみた で DSC - QX10 に関する記事を書きました。こいつ、なかなかよいですよ。休みの日などはよく使ってます。一眼レフ並みの写真も撮れます。背景をぼかしちゃうみたいなこともできます。

f:id:koogucc11:20140201135120j:plain

 こんな感じも。

f:id:koogucc11:20140201135435j:plain

 写真を何枚か撮ってふと疑問に思ったんですけど、本体のシャッターボタン(写真の赤枠部分)を押したとき、どんな仕組みでアプリが反応してるのか?という疑問がわきました。

f:id:koogucc11:20140203213749j:plain

 さて、早速 API 仕様書をみてみましょう。パッと見るかぎり、下図のメソッドぽいですね。

f:id:koogucc11:20140203214557p:plain

 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
    ]
}

JSONの整形にはここのサービスを使用しました。

 カメラ側のシャッターボタンを押して、ロジックを実行すると下記のような結果が返却されます。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
    ]
}

JSONの整形にはここのサービスを使用しました。

 実際には、リクエストを出し続けて、結果が返却されるまでループするなどのロジックが必要なのはお分かりだと思います。そうです、興味がパッとわいただけなので、手抜を抜きました。次からは本気だしますwww

 ※こっち買ってもよかったな....