まめ畑

ゆるゆると書いていきます

Coregaのカメラを動かすメモ

研究室の後輩の卒研で「CG-WLNCPTG (CG-WLNCPTG) | コレガ」を自作のソフトで動かすという要件があったのでメモ。
付属のソフトで動かせますが、それだとダメなので調べてみたメモ。
今回はPDA上のWindows mobileで開発したので、ソースはそれように。


このカメラってWEBの管理画面から動かせるのかな?
なんか、もろもろめんどかったのでWiresharkでパケットの中身を見た。
結果、凄く簡単だった。

動かし方

HTTPでアクセスして、パラメータをPOSTしてるだけだけ。
送るパラメータ

PanSingleMoveDegree=1&TiltSingleMoveDegree=1&PanTiltSingleMove=方向

でも実際はPanTiltSingleMoveだけでいいみたい。
前の2つのパラメータ変えても特に何も起こんない。
これをBASIC認証のヘッダつけて送るだけ。

方向は

  • 上 1
  • 右 3
  • 下 7
  • 左 5

こんな感じ。


C#だと

TcpClient client = new TcpClient(Address, Port);
string message = "POST /pantiltcontrol.cgi HTTP/1.0\r\n";
message += "Content-Type: text/plain\r\n";
message += "Authorization: Basic BASIC認証のあれ\r\n";
message += "Content-Length: 68\r\n\r\n";
message += "PanSingleMoveDegree=1&TiltSingleMoveDegree=1&PanTiltSingleMove=" + cmd + "\r\n\r\n";

Byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
stream.Flush();

こんな感じです。

ついでに画像も表示させてみる。

画像も取得してみます。
付属ソフトや管理画面で見れますが、リアルタイムに取得する方法がわからなかったので力技。
WEBの管理画面だとアプレット使っていて、あるメッセージをトリガーにストリームで画像をとってきてるだけな感じがしたけど、違うのかな?

今回は、管理画面の画像を取得する。
Windows mobile上で動くもの初めて作ったので、もっといい方法ありそう。


抜粋で。

private void showImage_Click(object sender, EventArgs e)
{
   Thread th = new Thread(new ThreadStart(getImage));
   th.IsBackground = true;
   th.Start();
}

delegate void getImageDelegate(Bitmap image);

private void getImage()
{
   Stream stream = null;

   while (true)
   {
       try
       {
           WebRequest wreq = WebRequest.Create("http://Address/IMAGE.JPG");
           wreq.Credentials = new NetworkCredential("ID", "PASS");
           wreq.Timeout = 2000;
           WebResponse wres = wreq.GetResponse();
           stream = wres.GetResponseStream();
           Invoke(new getImageDelegate(imagePanelt), new Bitmap(stream));
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message, "Error");
       }
       finally
       {
           if (stream != null) stream.Close();
           Thread.Sleep(500);
       }
   }
}

private void imagePanel(Bitmap image)
{
   cameraImage.Image = image;
}

こんな感じで思いっきり力技。
WEB管理画面の画像を定期的に取得する、カメラに負荷がかかる方法。
でも、結構安定してた。


あと、ごにょごにょしててWindows Mobile上ではMemoryStream使えなんですね。



うん。意外と簡単だった。
ん?なぜ俺がこんな事やってるんだ???