/// <summary>
        /// 指定IPアドレスのカメラのパラメータを取得する
        /// </summary>
        /// <param name="ipAddress"></param>
        /// <returns></returns>
        public CameraParam GetCameraParam(string ipAddress)
        {
            try {
                TcpClient     tcp = new TcpClient(ipAddress, SHOOTIMAGESERVER_PORT);
                NetworkStream ns  = tcp.GetStream();
                ns.ReadTimeout  = 5000;
                ns.WriteTimeout = 5000;

                // get parameter コマンドを送信
                string cmd      = "PGT";
                byte[] cmdBytes = System.Text.Encoding.UTF8.GetBytes(cmd);
                ns.Write(cmdBytes, 0, cmdBytes.Length);

                // データを受信
                while (tcp.Client.Available == 0)
                {
                }
                byte[] rcvBytes = new byte[tcp.Client.Available];
                ns.Read(rcvBytes, 0, tcp.Client.Available);
                string rcvString = System.Text.Encoding.UTF8.GetString(rcvBytes);

                ns.Close();
                tcp.Close();
                return(CameraParam.DecodeFromJsonText(rcvString));
            } catch (Exception e) {
                Console.Error.WriteLine(e.Message);
                return(null);
            }
        }
        /// <summary>
        /// 指定IPアドレスのカメラにパラメータを設定する
        /// </summary>
        /// <param name="ipAddress"></param>
        /// <param name="param"></param>
        public void SetCameraParam(string ipAddress, CameraParam param)
        {
            try {
                TcpClient     tcp = new TcpClient(ipAddress, SHOOTIMAGESERVER_PORT);
                NetworkStream ns  = tcp.GetStream();
                ns.ReadTimeout  = 5000;
                ns.WriteTimeout = 5000;

                // set parameter コマンドを送信
                string cmd      = "PST";
                byte[] cmdBytes = System.Text.Encoding.UTF8.GetBytes(cmd);
                ns.Write(cmdBytes, 0, cmdBytes.Length);

                // "ACK"データを受信
                while (tcp.Client.Available == 0)
                {
                }
                byte[] rcvBytes = new byte[tcp.Client.Available];
                ns.Read(rcvBytes, 0, tcp.Client.Available);
                string rcvString = System.Text.Encoding.UTF8.GetString(rcvBytes);
                if (rcvString == "ACK")
                {
                    // parameter を送信
                    var jsonText  = param.EncodeToJsonText();
                    var sendBytes = System.Text.Encoding.UTF8.GetBytes(jsonText);
                    // 送信するデータサイズを送る (little endian)
                    byte[] sizeBytes = new byte[4];
                    sizeBytes[0] = (byte)(sendBytes.Length & 0xff);
                    sizeBytes[1] = (byte)((sendBytes.Length & 0xff00) >> 8);
                    sizeBytes[2] = (byte)((sendBytes.Length & 0xff0000) >> 16);
                    sizeBytes[3] = (byte)((sendBytes.Length & 0xff000000) >> 24);
                    ns.Write(sizeBytes, 0, sizeBytes.Length);
                    // パラメータを送信する
                    ns.Write(sendBytes, 0, sendBytes.Length);
                }
                ns.Close();
                tcp.Close();
            } catch (Exception e) {
                Console.Error.WriteLine(e.Message);
            }
        }