ようこそゲストさん

無能日記

メッセージ欄

分類 【R&D(ids)】 で検索

一覧で表示する

IDSまとめ

はてブ 2010/09/24 7:46 R&D(ids)poti

IDSまとめ

なぜつくろうと思ったか。

これにインスパイアされた。
はちゅねは無理として、せめてIDS相当は作れそうだなって思ったからやってみた。

問題点

はちゅねとかセンサーとか作れません。
というわけで、センサーを入手しないといけません。
ググッてみると似たような製品にsensor-hm/ecoというのがあったので試してみることに。

やったこと

1. sensor-hm/ecoを調べる。
最初に、WINDOWS 7で正常に動くことを確認。
次に、おもむろにsnoopyproでusbの通信をキャプる。
素人目にも、それ程難しい通信はなさそうだったので、行けそうな期待膨らむ。
USBデバイスの初期化処理後は、コントロールメッセージを送り、その後はinterruptのbulk通信のみのよう。
2. libusbを使って動かしてみる。
LINUXのPCにつないだのもあって、お手軽な感じのlibusbを使うことにした。
ひとまず、テンプレートのコードに、control message処理とinterruptのbulk通信 の処理を適当に追加したら動いた。
変更は以下のような感じ。
    /* control message */
    unsigned char wdata[0];
    if (usb_control_msg(
        sensor->dh,
        0x42,
        0x10,
        0x18,
        0x00,
        (char *)wdata,
        sizeof(wdata),
        DEVICE_TIMEOUT) < 0) {
            fprintf(stderr, "failed in control message.\n");
    }

    unsigned char wdata[0];
    unsigned char rdata[8];
    if (usb_interrupt_write(
        sensor->dh,
        endpoint->bEndpointAddress,
        (char *)wdata,
        sizeof(wdata),
        DEVICE_TIMEOUT) < 0) {
            fprintf(stderr, "failed in intterupt write. (%s)\n", usb_strerror());
    }
    if (usb_interrupt_read(
        sensor->dh,
        endpoint->bEndpointAddress,
        (char *)rdata,
        sizeof(rdata),
        DEVICE_TIMEOUT) < 0) {
            fprintf(stderr, "failed in intterupt read. (%s)\n", usb_strerror());
    }
    if (rdata[4] == 0xff) {
        /* 人がいる */
    } else {
        /* ひとはいない */
    }
多分、FreeBSDやNetBSDのugenでも動くとおもう。
仕様決め
仕様をざっくりと決めることにしました。
といっても、あまり複雑なものを作る気力がないので、大まかに以下のような物を考えました。(ありきたりですね。)
ids.png
検出->1次警告音->2次警告音->ツイット->電話->監視カメラで状況確認という流れです。
1次警告から2次警告までは1分時間があり、この間にアラートのキャンセルを行うことで、2次警告以降を行わないように出来ます。
これはまちがって、自分が引っかかったとき解除できないと困るからです。
デーモンを作る
検知部分をデーモン化してしまうことにしました。そのほうが後々楽だと判断したので。
デーモンは簡単なRPC(というかただのTCPでコマンド文字列処理しただけ)を実装して、そこにコマンドを送ることで、外部とのやりとりができるようにしました。
また、アラート検出した場合は1次処理と2次処理に分離して、それそれshell -cで外部スクリプトを実行するようにしました。
なので、普通にLINUXのコマンドを利用できるので、音を鳴らす以外のことも比較的簡単に出来ます。
これらの処理に、センサー部分の処理をつないで完成です。
本当は、設定変更可能な部分を設定ファイルに外出ししたかったのですが、気力がなくなったのでやめました。いつかやります。(TODO)
デーモンが完成したので
フロントエンドを作る
WEBから監視を停止したり、再開したり、ご検知をキャンセルしたりできるようにするひつようがあります。というわけで作りました。
htmlを1つ書いて、CGIをpythonでかきました。
jqueryを使ってます。
まぁ、このへんは特に難しさも突起すべきこともないので割愛。
カメラを買う。
はい。カメラがありませんでした。なので買うことにしました。
選定ですが、LINUXにつながるWEBかめらでも良かったんですが、設置場所のことを考えるとネットワークカメラのほうが実用的だと思ったので、CS-TX04Fというプラネックスの製品を買うことにしました。理由は安いから。
部屋が2つあるから、2つも買ってしまったorz。1個で十分だった。
このカメラですが、セットアップをMACですると映像が表示されません。
どうやら、WINDOWSにしか対応してない漢の実装のだったようです。
ACTIVEXなんて、MACやiphoneで使えたりしないので、なんだかなぁと思いつつ情報収集していると、edimax ic-1510のOEM製品らしく(クリソツ)ic-1510のファームが動作し、ic-1510はver 1.39からsafariとかにも対応していると書いてたので、そちらに乗かえ。
アップデートは問題なく終わり。MACでも映像が見られるようになりました。(録画は相変わらずWINDOWSだけなのね)
カメラの画像を埋め込む。
ソースを覗いてみると。safariでは以下の部分が肝(windows, operaはその上に描いてあるところが肝)になっているよでした。cgiを引っ張るとMJPEGのデータが延々と書き出されてくるということらしい。
document.write('<img id="MJPEG_streaming2" src="https://[hostname]:80/snapshot.cgi" align="center" width="320" height="240">');
そこまでわかってしまえば、埋め込むためにやることは簡単で、ブラウザ判定部分とdocument.writeしているあたりをごっそりコピって上げれば映像が見れました。
音楽をならしたりツイットしたりする。
ちょっと前に戻って、1次処理、2次処理部分に戻ります。
もはやこの段階だとただのシェルスクリプトなので難しさは何もありません。
(音楽をならすときは、ならそうとしているPCにスピーカーやヘッドフォンを付けてください。違うPCに付けて鳴らなくて悩んだ。orz)
今回は、ミク的なwavファイルを容易しました。
1次警告音は以下の用な感じで
amixer set Front on 80%
aplay notice.wav
2次警告音は以下のような感じで
amixer set Front on 100%
aplay alert.wav
ツイットは2次処理に入れてあります。
echo"message"| nkf -w |ctwit .... (自前のツイットプログラム。巷にいっぱいあるので作る必要はない。)
後は電話ですが、asteriskでモーニングコールを参照してもらえれば一目瞭然です。outgoingに発呼用のファイルをコピーするだけです。
終に
ひとまず、ここまで一通り完了したわけですが。
どのくらいのお金と、手間がかかったかというと。
かかった費用(概算)
CS-TX04F 5000 x 2
sensor-hm/eco 6000 x 1
-----------------------
16000
実装時間
14h x 3 = 42h
若干敗北な感じがする。やっぱカメラ1個でよかったよ!
要望があれば、コードはもうちょっとちゃんと実装して公開してもいいかなと思ってはいる。

画面

そうそう、iphoneで見た時の画面はこんなの。
部屋が汚いとかのツッコミいらない。
IMG_0006.jpg

1: poti 『ソースコード公開した。 コンテンツのsoftwareからどうぞ』 (2010/10/02 17:57)