管理人のトップページ管理人ブログ戻る
     Planex CS-WMV02Gをハックする(1)

Date Written : 2009/07/10
mail : beatlesoft@gmail.com
以前はUSBカメラが中心で、LinuxでUSBカメラを2台接続しコントロールする仕組みも作ったのですが、現在はNetWork Cameraも安価になりました。そこで、最も安く、ソフト改造が可能なこのCS-WMV02をハックすることに挑戦します。
※注意 一応ここでの操作はUnix系(LinuxFreeBSDなど)のOSを知っていて、サーバーを構築した経験のある方が対象です。また結果としてメーカー保障は受けられなくなる可能性がありますし、トラブルが発生した場合は全て自己責任となりますので、ご了解ください。
PlanexのCS-WMV02Gは面白いネットワークカメラだと思います。Unix系の組み込みOSが使われているのです。つまり、ログインさえ出来れば色々カスタマイズが出来そうだということを意味しています。
そこで、今回、デザインの変更と携帯に表示をしてみたいと思います。
動画は携帯では無理だとおもいますが、javascriptで10秒毎に画像をリロードするのをカメラ内部につくりました。そのアドレスに携帯から接続しています。CS-WMV02Gのhttpサーバーの中に適当なhtmlを作成し利用するのです。私は駐車場の管理やマンションのセキュリティや在宅の防犯管理などでソフト改変が可能なこの機種を利用しています。携帯はPHSとEMですが、全く問題なく見えますし、ipodTouchをLAN経由でネットに出て確認するのも問題はありません。CS-WMV02Gにはsshではなく,設定したrootとrootのパスワードで入れます。接続はsshではなくtelnetです。ちょっとびっくりですね。 画像はjpgで、携帯の場合は、QVGA(320x240)がぴったりでした。 音声は全く無理です。マニアックな方法ですし、メーカー保障も対象外になりうる可能性もあります。UNIXになれた方には安易に理解できることです。 このカメラはもともとVIVOTEKの製品です。英語に自信のある方は会員登録すると多くの情報が入手可能ですよ。VIVOTECのサイトに行くとPlanexやCoregaがOEMで提供されていることがわかります。それ以外のメーカーのもありますよ。それに、価格的にも、はるかに安く購入もできます。
http://www.vivotek.com/products/network_cameras.php
写真(1) 写真(2) 写真(3) 写真(4) 写真(5) 動画(1)

写真(1)は私の携帯(EMのH11T)で表示したものです。iPhoneは持っていませんが、iPodTouchでは完全にOKでしたので、多分多くの携帯でも表示が出来ると思います。
写真(2)は携帯で10秒毎にリロードをしているところです。
写真(3)は単純にPC用の操作画面のデザインを変更したものです。
写真(4)は携帯用のhtmlをPCで表示したものです。
写真(5)は携帯用のm.htmlをviで編集している画像です。
動画(1)は動体検知した静止画像をftp送信されたサーバーが秒20枚の画像をつなげて動画を作成したものです。Divx5の圧縮でタイムスタンプをスーパーインポーズしたものです。タイムスタンプのスーパーインポーズはPlanex側ではなくサーバー側で処理しています。サーバーはLinuxで監視カメラで動体検知したもののみを見るのに適しています。この例では少ない静止画像数でしたが、多い場合は一日2万枚の画像を物理的に40Km離れたサーバーはftpで受信しています。20000÷20で1000秒の動画となります。つまり一日の動きを動画と言う形で16分40秒で見ることが出来るわけです。また、この例ではそれを毎日VGAとQVGAの動画に自動変換し保存しています。但し、この動画化は複雑で、大量のソフトも作成する必要がありますので今回は取り上げません。

以下はログインからwebのフォルダーまでの流れをターミナルソフト(私はteraterm)で追っかけたものです。多分、これだけで、Unix系の方は全てを理解されると思います。今回はここまでとさせていただきます。(注意)青い文字は私のコメントですので読み飛ばしてください。また、m.htmlを流用される場合はカットしてくださいね。
ではテレネットでログインをします。
ログインについてはrootで行わないと操作が出来ませんので
rootで入り、パスワードは登録したrootのパスワードを入力します。
(注)xxx.xxx.xxx.xxxはIPです。

[root@hogehoge ~]# telnet xxx.xxx.xxx.xxx
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
Escape character is '^]'.

Linux 2.4.26-vrs1 (xxx.xxx.xxx.yyy) (pts/0)

Network-Camera login: root    ←エンターキー
Password:   ←パスワード入力してエンター


BusyBox v1.00 (2006.01.16-08:12+0000) Built-in shell (ash)   ←シェルはashであることが分かります。
Enter 'help' for a list of built-in commands.

~ # ls   ←lsコマンドでファイルやディレクトリ構造を見る
eventd.0     snap_01.jpg  snap_03.jpg  snap_05.jpg  snap_07.jpg  video1.jpg
snap_00.jpg  snap_02.jpg  snap_04.jpg  snap_06.jpg  video.jpg    video2.jpg
~ # cd /   ←cdコマンドで/(ルート)に移動
/ # ls   ←lsコマンドでディレクトリ構造を見る
bin         etc         linuxrc     proc        tmp
dev         home        lost+found  root        usr
drivers     lib         mnt         sbin        var
/ # cd /mnt/flash/www
/mnt/flash/www # ls   ←lsコマンドでファイルやディレクトリ構造を見る
192.168.1.htm      common.js          m.html             setup
RtspVaPgDec.cab    default.css        main.html          snapshot.html
camctrl.js         homepage2.css      main2.html         topclient.html
center.html        index.html         maintop.html       topconfig.html
client.html        language.html      pic                webinfo.html
clientoption.html  leftmain.html      plugindef.js
clientset.html     lefttop.html       ret.html
/mnt/flash/www #
main2.htmlやm.htmlは私の作成したものですし、
setupとpicはフォルダーでこの中に画像部品があります。
画像部品を変更すれば全く別物の画面にすることも可能です。
/mnt/flash/www がDocumentRootです。


/mnt/flash/www # cat m.html   ←catコマンドでm.htmlを見る
<HTML><HEAD>
<meta charset="shift-jis">
<meta http-equiv="Refresh" content="10">   content="10"は10秒でリロードすることを意味します。早くも遅くもこの数値の変更しだいです。
<TITLE>
<script type="text/javascript">
<!--
document.write(HostName);
//-->
</script>
</TITLE>

<style type="text/css">
@import url(default.css);
</style>
<script type="text/javascript" src="/common.js"></script>
<script type="text/javascript" src="/cgi-bin/pubinfo.cgi"></script>
<script type="text/javascript" src="/plugindef.js"></script>
<!---
<DIV id="waterMark" style="position:absolute">
<IMG SRC="pic/bgmain2.gif" width=51 height=51 border=0>
</DIV>
//-->
<script language="JavaScript1.2">
<!--

markW = 51;
markH = 51;
markX = 0;
markY = 0;
markRefresh = 1;

if (!document.all) document.all = document;
if (!document.all.waterMark.style) document.all.waterMark.style = document.all.waterMark;

wMark = document.all.waterMark.style;
wMark.width = markW;
wMark.height = markH;
navDOM = window.innerHeight;

function setVals() {
 barW = 0;
 barH = 0;
 if (navDOM) {
   if (document.height > innerHeight) barW = 20;
   if (document.width > innerWidth) barH = 20;
 } else {
  innerWidth = document.body.clientWidth;
  innerHeight = document.body.clientHeight;
 }
 posX = ((innerWidth - markW)-barW) * (markX/100);
 posY = ((innerHeight - markH)-barH) * (markY/100);
}

function wRefresh() {
 wMark.left = posX + (navDOM?pageXOffset:document.body.scrollLeft);
 wMark.top = posY + (navDOM?pageYOffset:document.body.scrollTop);
}

function markMe() {
 setVals();
 window.onresize=setVals;
 markID = setInterval ("wRefresh()",markRefresh);
}

window.onload=markMe;

function onloadEvent()
{
 setTitle(HostName);
}

 //-->

</SCRIPT>
</HEAD>
<BODY onload="onloadEvent()">
<TABLE height=560 cellSpacing=0 cellPadding=0 width=700 border=0 valign="top">
 <TR>
 <!----
   <TD width=54> </TD>
   <TD align=middle valign=center>
 //-->
 <TD align=left valign=top>
 <script type="text/javascript">
 <!--
 document.write("<OBJECT ID=\"" + PLUGIN_ID + "\" WIDTH=" + (Width + X_OFFSET_CTRL) + " height=" + (Height + Y_OFFSET_CTRL));
 document.write(" CLASSID=CLSID:" + CLASS_ID);
 document.write(" CODEBASE=\"/" + PLUGIN_NAME + "#version=" + PLUGIN_VER + "\">");
 document.write("<PARAM NAME=\"Url\" VALUE=\"rtsp://" + location.hostname + ":" + RTSPPort + "/" + RTSPAccessName +"\">");
 document.write("<PARAM NAME=\"Stretch\" VALUE=\"" + STRETCH + "\">");
 document.write("<PARAM NAME=\"VSize\" VALUE=\"CMS\">");
 document.write("<PARAM NAME=\"Language\" VALUE=\"" + PLUGIN_LANG + "\">");
 document.write("<OBJECT data=\"/cgi-bin/video.jpg\" type=\"image/jpeg\">");
 document.write("This is a plug-in (ActiveX). If you see this text, your browser is not support or disable ActiveX.");
 document.write("</OBJECT>");
 document.write("</OBJECT>");
 //-->
 </script>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
今回はここまでです。次回はいつ掲載するかわかりませんが、よろしくね。