Fonera 2.0+OpenWrtでウェブカメラの映像を無線で飛ばす

Fonera 2.0を使ってケーブルの届かない場所の映像を無線LANでアクセスポイントまで飛ばし、インターネットに配信する実験をしてみた。

今回使用した機材は次の通り。無線LANのアクセスポイントとして以前にFonera+を改造したものを使用したが、特にFonera+である必要はなく一般の市販品でもかまわない。たまたま手持ちがこれしかなかったのでこれを使ったというだけである。ウェブカメラはUVC(USB Video Class)仕様の市販品ならまず問題ないはず。今回の実験では、移動のための手段と電源確保のために乗用車にカメラを搭載した。

機材型式
ウェブカメラLogicool Qcam Communicate Deluxe(QCAM-130X)
カメラ側無線LAN装置Fonera 2.0 (FON2202)を改造
無線LANアクセスポイントFonera+ (FON2201)を改造
カメラ側電源車載用12v-5v変換基板(自作)、ケーブル

Fonera 2.0のオリジナルのファームウェアにはプラグインとしてウェブカメラの機能が備わっているのでこれを使うことも可能だがいくつか欠点がある。

  1. ソフトウェアの構造上不明な点があり改造しづらい(あくまでも私感)
  2. システム管理画面のアカウントでログインしないと映像が見られないので、一般に公開するのはセキュリティの観点から好ましくない

そこで、より自由度の高いOpenWrtのファームウェアに書き換えることにした。ファームウェアの書き換えにはFonera 2.0のシリアルピンを使うわけだが、シリアル-USB変換基板FT232RXを使ってPCに接続した。

今回は、開発用ホストPCとしてUbuntu 9.04を使用した。今回は端末エミュレータとしてminicomを使ってみた。Ubuntu 9.04にはminicomがインストールされていなかったのでインストールする。

  1. $ sudo aptitude update
  2. $ sudo aptitude install minicom

シリアル-USB変換基板のデバイスドライバは既にインストールされていた(と思う)ので、USBケーブルを接続するだけで認識した。デバイスファイルは/dev/ttyUSB0となった。

  1. $ dmesg
  2.  中略
  3. [ 1117.753277] ftdi_sio 1-2:1.0: FTDI USB Serial Device converter detected
  4. [ 1117.753390] usb 1-2: Detected FT232RL
  5. [ 1117.753606] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0
  6. [ 1117.753674] usbcore: registered new interface driver ftdi_sio
  7. [ 1117.753686] ftdi_sio: v1.4.3:USB FTDI Serial Converters Driver

シリアル通信のパラメータは、ホームディレクトリに次のファイルを作成することによって設定する。

~/.minirc.dfl

  1. pu port /dev/ttyUSB0
  2. pu baudrate 9600
  3. pu minit
  4. pu rtscts No

これで、Fonera 2.0のRedBootと会話するための通信経路ができたわけだが、ここでもう1つFonera 2.0のファームウェアのイメージを送り込むための通信経路を用意する。RedBootにはシリアル経由でファームウェアを送り込む機能もあるが、あまりにも時間がかかるので、今回は普通にTFTPサーバ経由(これがデフォルト)にすることにした。TFTPでファームウェアのイメージを送り込むためには、シリアル接続のほかのイーサネット接続が必要になるわけだが、ハード的にはFonera 2.0のComputerポート(イーサネットコネクタの黒い方)とPCをイーサネットケーブルで直結すればよい。ただ、Ubuntu 9.04には、TFTPサーバはインストールされていないのでインストールする必要がある。

  1. $ sudo aptitude minicominstall atftpd
  2. $ sudo /etc/init.d/openbsd-inetd start

次に、OpenWrtのファームウェアのイメージファイルをhttp://kamikaze.openwrt.org/8.09.1/atheros/からダウンロードしてくる。入手するイメージは2つあり、1つはカーネル、もう1つはルートファイルシステムである。openwrt-atheros-vmlinux.lzma (786,432バイト)openwrt-atheros-root.squashfs (1,703,936バイト)ダウンロードしたら、これらのイメージファイルをTFTPの/var/lib/tftpboot/ディレクトリにコピーしFonera 2.0から読み出せるようパーミッションを変更しておく。

  1. $ sudo cp ~/openwrt-* /var/lib/tftpboot/
  2. $ sudo chmod o+r /var/lib/tftpboot/openwrt-*

Fonera2.0のRedBootがTFTPサーバを認識できるよう、PCのIPアドレスをFonera 2.0と同じセグメントにする必要がある。Fonera 2.0のRedBootでは自分のアドレスを192.168.1.1/24にする予定なので、PCのIPアドレスは192.168.1.10/24にした。これで、Fonera 2.0のファームウェア書き換えに必要なPC側の準備は終わった。minicomを起動してFonera 2.0の電源を入れる。minicomの画面に+と表示された時点でCtrl+Cキーを打ってRedBootモードに入る。「=== Excecuting boot script in xx seconds - enter ^C to abort」というメッセージはもう少し後のタイミングで表示されるが、あらかじめCtrl+Cキーを打っておいてもかまわないようだ。

  1. $ minicom

TFTP経由でOpenWrtのイメージを読み込むにあたって、RedBoot側では自分のIPアドレスとTFTPサーバーのIPアドレスを設定する必要がある。

  1. RedBoot> ip_address -l 192.168.1.1/24 -h 192.168.1.10
  2. IP: 192.168.1.1/255.255.255.0, Gateway: 192.168.1.254
  3. Default server: 192.168.1.10
  4. RedBoot>

現在のフラッシュメモリのパーティションを確認しておく。loaderとimageとimage2の3つがFonera 2.0のオリジナルのファームウェアだ。

  1. RedBoot> fis list
  2. Name FLASH addr Mem addr Length Entry point
  3. RedBoot 0xA8000000 0x80040400 0x00030000 0xA8000000
  4. loader 0xA8030000 0x80100000 0x00010000 0x80100000
  5. image 0xA8040000 0x80040400 0x00470004 0x80040400
  6. image2 0xA8660000 0xA8660000 0x00140000 0x80040400
  7. FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
  8. RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
  9. RedBoot>

フラッシュメモリを初期化する。

  1. RedBoot> fis init
  2. About to initialize [format] FLASH image system - continue (y/n)? y
  3. *** Initialize FLASH Image System
  4. ... Erase from 0xa87e0000-0xa87f0000: .
  5. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  6. RedBoot>

フラッシュメモリのパティションをみる。Fonera 2.0のオリジナルのファームウェアがなくなった。さようなら、フリッパー君。

  1. RedBoot> fis list
  2. Name FLASH addr Mem addr Length Entry point
  3. RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000
  4. FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
  5. RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
  6. RedBoot>

PCに用意しておいたカーネルのイメージファイルをTFTP経由で読み込む。

  1. RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
  2. Using default protocol (TFTP)
  3. Raw file loaded 0x80040400-0x801003ff, assumed entry at 0x80040400
  4. RedBoot>

読み込んだカーネルのイメージをフラッシュメモリに書き込む。

  1. RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.17
  2. ... Erase from 0xa8030000-0xa80f0000: ............
  3. ... Program from 0x80040400-0x80100400 at 0xa8030000: ............
  4. ... Erase from 0xa87e0000-0xa87f0000: .
  5. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  6. RedBoot>

フラッシュメモリのパティションをみる。vmlinux.bin.17という名前でカーネルが書き込まれた。

  1. RedBoot> fis list
  2. Name FLASH addr Mem addr Length Entry point
  3. RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000
  4. vmlinux.bin.17 0xA8030000 0x80041000 0x000C0000 0x80041000
  5. FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
  6. RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
  7. RedBoot>

未使用のフラッシュメモリの大きさを調べる。差をとって 0xA87E0000 - 0xA80F0000 = 0x006f0000 が求めたい大きさ。

  1. RedBoot> fis free
  2. 0xA80F0000 .. 0xA87E0000
  3. RedBoot>

2つ目のイメージファイル、ルートファイルシステムのイメージファイルをTFTPサーバー(PC)から読み込む。

  1. RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs
  2. Using default protocol (TFTP)
  3. Raw file loaded 0x80040400-0x801e03ff, assumed entry at 0x80040400
  4. RedBoot>

読み込んだルートファイルシステムのイメージをフラッシュメモリに書き込む。残り全てのフラッシュメモリの領域をルートファイルシステムにする。

  1. RedBoot> fis create -l 0x006f0000 rootfs
  2. ... Erase from 0xa80f0000-0xa87e0000: ..........................................
  3. ... Program from 0x80040400-0x801e0400 at 0xa80f0000: ..........................
  4. ... Erase from 0xa87e0000-0xa87f0000: .
  5. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  6. RedBoot>
最終的にフラッシュメモリのパティションはこうなる。
  1. RedBoot> fis list
  2. Name FLASH addr Mem addr Length Entry point
  3. RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000
  4. vmlinux.bin.17 0xA8030000 0x80041000 0x000C0000 0x80041000
  5. rootfs 0xA80F0000 0x80040400 0x006F0000 0x80040400
  6. FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
  7. RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
  8. RedBoot>

RedBootが起動時に新しく書き込んだファームウェアを起動するよう、RedBootの起動スクリプトを書き換える。

  1. RedBoot> fconfig boot_script_data
  2. boot_script_data:
  3. Enter script, terminate with empty line
  4. >> fis load -l vmlinux.bin.17
  5. >> exec
  6. >>
  7. Update RedBoot non-volatile configuration - continue (y/n)? y
  8. ... Erase from 0xa87e0000-0xa87f0000: .
  9. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  10. RedBoot>

RedBootの起動スクリプトが正しく書き換わったか確認する。

  1. RedBoot> fconfig -l -n
  2. boot_script: true
  3. boot_script_data:
  4. .. fis load -l vmlinux.bin.17
  5. .. exec
  6. boot_script_timeout: 2
  7. bootp: false
  8. bootp_my_gateway_ip: 192.168.1.254
  9. bootp_my_ip: 192.168.1.1
  10. bootp_my_ip_mask: 255.255.255.0
  11. bootp_server_ip: 192.168.1.254
  12. console_baud_rate: 9600
  13. gdb_port: 9000
  14. info_console_force: false
  15. net_debug: false
  16. RedBoot>

これで、フラッシュメモリの書き換えとRedBootの設定変更が終わった。Fonera2.0をリセットすると新しいファームウェアが起動する。

  1. RedBoot> reset

しばらくして、Enterキーを押すとOpenWrtのロゴが表示されてシェルに入る。

この時点では、rootのパスワードが設定されていないためtelnetでもログインできるが、SSHの方が好ましいのでパスワードを設定する。パスワードが短いと「Bad password: too short」と叱られるが、受け付けてはもらえる。

  1. root@OpenWrt:/# passwd
  2. Changing password for root
  3. New password:
  4. Bad password: too short
  5. Retype password:
  6. Password for root changed by root
  7. root@OpenWrt:/#

PCからTelnetしてみると、もはやログインできなくなっている。

  1. ogane@ogane-desktop:~$ telnet 192.168.1.1
  2. Trying 192.168.1.1...
  3. Connected to 192.168.1.1.
  4. Escape character is '^]'.
  5. Login failed.
  6. Connection closed by foreign host.
  7. ogane@ogane-desktop:~$

一方、SSHでログインすると最初の一回だけはこのように表示されるので、yesと答える。次回からはパスワードを打ち込むだけログインできるようになる。

  1. ogane@ogane-desktop:~$ ssh root@192.168.1.1
  2. The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
  3. RSA key fingerprint is 61:2b:57:2c:00:ff:36:c0:b6:8f:cf:ce:47:b9:13:bd.
  4. Are you sure you want to continue connecting (yes/no)? yes
  5. Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts.
  6. root@192.168.1.1's password:

SSHでログインできるようになったので、シリアルケーブルをはずして蓋を閉めてしまう。ここから後の作業がうまくいかなくなったら、最悪の場合、またシリアルケーブルを接続してここまで行った作業、つまりファームウェアの入れ替え、を行ってここに戻ってくればいい。ここからは、無線LANの設定を行う。ブラウザ画面から設定する方法やuciコマンドを使って設定する方法もあるがうまく行かなかったので、/etc/config/にある次の3つのファイルをviエディタで編集して設定した。ただ、これらの設定に関してよく理解しているわけではないので間違いやもっと良い方法があるかもしれない。

/etc/config/network

宅内LANのIPアドレスが192.168.1.0/24なので、Fonera 2.0のWAN側のIPアドレスは固定で192.168.1.2とした。ゲートウェーおよびDNSサーバのIPアドレスも宅内LANのそれに合わせる。これをしないとopkgを使ってインターネット上のリソースを利用することができなくなる。

  1. config 'interface' 'loopback'
  2.     option 'ifname' 'lo'
  3.     option 'proto' 'static'
  4.     option 'ipaddr' '127.0.0.1'
  5.     option 'netmask' '255.0.0.0'
  6. config 'interface' 'lan'
  7.     option 'type' 'bridge'
  8.     option 'proto' 'static'
  9.     option 'netmask' '255.255.255.0'
  10.     option 'ifname' 'eth0.0'
  11.     option 'defaultroute' '0'
  12.     option 'peerdns' '0'
  13.     option 'ipaddr' '192.168.10.1'
  14. config 'interface' 'wan'
  15.     option 'defaultroute' '0'
  16.     option 'peerdns' '0'
  17.     option 'ifname' 'ath0'
  18.     option 'proto' 'static'
  19.     option 'ipaddr' '192.168.1.2'
  20.     option 'netmask' '255.255.255.0'
  21.     option 'gateway' '192.168.1.254'
  22.     option 'dns' '192.168.1.254'

/etc/config/wireless

無線通信のパラメータとしては、SSIDをOgane_WiFi_(^^)vにし、WEPによる暗号化に設定した。これらは無線LANのアクセスポイントの設定と一致させる必要がある。

  1. config 'wifi-device' 'wifi0'
  2.     option 'type' 'atheros'
  3.     option 'channel' 'auto'
  4.     option 'txpower' '10'
  5.     option 'disabled' '0'
  6.     option 'diversity' '0'
  7. config 'wifi-iface'
  8.     option 'device' 'wifi0'
  9.     option 'mode' 'sta'
  10.     option 'encryption' 'wep'
  11.     option 'key' '*********'
  12.     option 'ssid' 'Ogane_WiFi_(^^)v'
  13.     option 'network' 'wan'

/etc/config/firewall

ファイアウォールのWAN側のinputをACCEPTに変更する。

  1. config defaults
  2.     option syn_flood    1
  3.     option input        ACCEPT
  4.     option output        ACCEPT
  5.     option forward        REJECT
  6. config zone
  7.     option name        lan
  8.     option input    ACCEPT
  9.     option output    ACCEPT
  10.     option forward    REJECT
  11. config zone
  12.     option name        wan
  13. #    option input    REJECT
  14.     option input    ACCEPT
  15.     option output    ACCEPT
  16.     option forward    REJECT
  17. #    option masq        1
  18. config forwarding
  19.     option src lan
  20.     option dest wan
  21.     option mtu_fix    1
  22. # include a file with users custom iptables rules
  23. config include
  24.     option path /etc/firewall.user

ここで、PCと繋いでいたLANケーブルを外し、Fonera 2.0を再起動する。これで、無線LAN経由でFonera 2.0にアクセスできるようになる。IPアドレスは、設定したFonera 2.0のWAN側のIPアドレス192.168.1.2である。PCからSSHで再度ログインすると、次のように叱られる。

  1. $ ssh root@192.168.1.2
  2. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  3. @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
  4. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  5. IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
  6. Someone could be eavesdropping on you right now (man-in-the-middle attack)!
  7. It is also possible that the RSA host key has just been changed.
  8. The fingerprint for the RSA key sent by the remote host is
  9. de:b7:42:95:06:04:cd:86:9e:86:8e:8b:77:76:c6:73.
  10. Please contact your system administrator.
  11. Add correct host key in /home/hoge/.ssh/known_hosts to get rid of this message.
  12. Offending key in /home/ogane/.ssh/known_hosts:2
  13. RSA host key for 192.168.1.2 has changed and you have requested strict checking.
  14. Host key verification failed.

次のように、以前にログインしたときのSSHのキャッシュを削除すればまたログインできるようになる。

  1. $ rm /home/hoge/.ssh/known_hosts
  2. $ ssh root@192.168.1.2
  3. The authenticity of host '192.168.1.2 (192.168.1.2)' can't be established.
  4. RSA key fingerprint is de:b7:42:95:06:04:cd:86:9e:86:8e:8b:77:76:c6:73.
  5. Are you sure you want to continue connecting (yes/no)? yes
  6. Warning: Permanently added '192.168.1.2' (RSA) to the list of known hosts.
  7. root@192.168.1.2's password:

ここからは、今回のウェブカメラ・アプリケーションを構築してゆく。まず、パッケージリストを更新する。うまく、レポジトリにつながるようなので一安心する。

  1. root@OpenWrt:~# opkg update
  2. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/Packages.gz
  3. Connecting to downloads.openwrt.org (78.24.191.177:80)
  4. Packages.gz 100% |*******************************| 141k 00:00:00 ETA
  5. Inflating http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/Packages.gz
  6. Updated list of available packages in /var/opkg-lists/snapshots
  7. root@OpenWrt:~#
最初にUSB2.0バイスドライバーをインストールする。
  1. root@OpenWrt:~# opkg install kmod-usb2
  2. Installing kmod-usb2 (2.6.26.8-atheros-1) to root...
  3. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/kmod-usb2_2.6.26.8-atheros-1_mips.ipk
  4. Connecting to downloads.openwrt.org (78.24.191.177:80)
  5. kmod-usb2_2.6.26.8-a 100% |*******************************| 21428 00:00:00 ETA
  6. Installing kmod-usb-core (2.6.26.8-atheros-1) to root...
  7. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/kmod-usb-core_2.6.26.8-atheros-1_mips.ipk
  8. Connecting to downloads.openwrt.org (78.24.191.177:80)
  9. kmod-usb-core_2.6.26 100% |*******************************| 71030 00:00:00 ETA
  10. Configuring kmod-usb-core
  11. Configuring kmod-usb2
  12. root@OpenWrt:~#

次にUVCカメラ用デバイスドライバーをインストールする。

  1. root@OpenWrt:~# opkg install kmod-video-uvc
  2. Installing kmod-video-uvc (2.6.26.8+r261-atheros-1) to root...
  3. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/kmod-video-uvc_2.6.26.8+r261-atheros-1_mips.ipk
  4. Connecting to downloads.openwrt.org (78.24.191.177:80)
  5. kmod-video-uvc_2.6.2 100% |*******************************| 34315 00:00:00 ETA
  6. Installing kmod-video-core (2.6.26.8-atheros-1) to root...
  7. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/kmod-video-core_2.6.26.8-atheros-1_mips.ipk
  8. Connecting to downloads.openwrt.org (78.24.191.177:80)
  9. kmod-video-core_2.6. 100% |*******************************| 29218 00:00:00 ETA
  10. Configuring kmod-video-core
  11. Configuring kmod-video-uvc
  12. root@OpenWrt:~#

最後に、MJPEG-streamerをインストールする。

  1. root@OpenWrt:~# opkg install mjpg-streamer
  2. Installing mjpg-streamer (r68-2) to root...
  3. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/mjpg-streamer_r68-2_mips.ipk
  4. Connecting to downloads.openwrt.org (78.24.191.177:80)
  5. mjpg-streamer_r68-2_ 100% |*******************************| 113k 00:00:00 ETA
  6. Installing libpthread (0.9.29-14.1) to root...
  7. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/libpthread_0.9.29-14.1_mips.ipk
  8. Connecting to downloads.openwrt.org (78.24.191.177:80)
  9. libpthread_0.9.29-14 100% |*******************************| 19154 --:--:-- ETA
  10. Installing libjpeg (6b-1) to root...
  11. Downloading http://downloads.openwrt.org/kamikaze/8.09.1/atheros/packages/libjpeg_6b-1_mips.ipk
  12. Connecting to downloads.openwrt.org (78.24.191.177:80)
  13. libjpeg_6b-1_mips.ip 100% |*******************************| 57827 00:00:00 ETA
  14. Configuring libjpeg
  15. Configuring libpthread
  16. Configuring mjpg-streamer
  17. root@OpenWrt:~#

ありがたいことに、どのパッケージも依存するパッケージを自動的にインストールしてくれた。これで、必要なパッケージのインストールは終わった。早速USBポートにウェブカメラを接続してみると、ちゃんと認識されるようになった。

  1. root@OpenWrt:~# dmesg
  2.  中略
  3. usbcore: registered new interface driver usbfs
  4. usbcore: registered new interface driver hub
  5. usbcore: registered new device driver usb
  6. PCI: Enabling device 0000:00:00.1 (0000 -> 0002)
  7. ehci_hcd 0000:00:00.1: EHCI Host Controller
  8. ehci_hcd 0000:00:00.1: new USB bus registered, assigned bus number 1
  9. ehci_hcd 0000:00:00.1: irq 5, io mem 0x80c21000
  10. ehci_hcd 0000:00:00.1: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
  11. usb usb1: configuration #1 chosen from 1 choice
  12. hub 1-0:1.0: USB hub found
  13. hub 1-0:1.0: 3 ports detected
  14. v4l2_common: Unknown symbol i2c_attach_client
  15. Linux video capture interface: v2.00
  16. usbcore: registered new interface driver uvcvideo
  17. USB Video Class driver (SVN r261)
  18. usb 1-1: new high speed USB device using ehci_hcd and address 2
  19. usb 1-1: configuration #1 chosen from 1 choice
  20. uvcvideo: Found UVC 1.00 device <unnamed> (046d:0992)
  21. root@OpenWrt:~#

いよいよ大詰めである。MJPEG-streamのインストールによって、/webcam_www/にはコンテンツとしてデモのページも用意されている。MJPEG-streamを手動で起動してみる。

  1. root@OpenWrt:~# mjpg_streamer -o "output_http.so -w /webcam_www"
  2. MJPG Streamer Version.: 2.0
  3. i: Using V4L2 device.: /dev/video0
  4. i: Desired Resolution: 640 x 480
  5. i: Frames Per Second.: 5
  6. i: Format............: MJPEG
  7. o: www-folder-path...: /webcam_www/
  8. o: HTTP TCP port.....: 8080
  9. o: username:password.: disabled
  10. o: commands..........: enabled

MJPEG-streamのデモのページでは、次の方法による映像の配信を確認できるようになっている。

このデモのページを使って、UbuntuのFireFoxで映像が見えるか確認してみる。Javaアプレットのデモ以外は問題なく見られた。

静止画 - OK

imgタグで表示 - OK(IEはNG)

JavaScriptを使って表示 - OK

CambozolaのJavaアプレットで表示 - NG(WindowsからならOK)

Javaアプレットのデモは、自作のJavaアプレットに置き換えることによって問題なく表示するようになった。

  1. ogane@ogane-desktop:~$ scp cambozola-0.76-mawatari.jar root@192.168.1.2:/webcam_www/cambozola.jar

最後に仕上げとして、Fonera 2.0起動時にMJPEG-Streamerが自動的に起動するように/etc/init.dディレクトリに起動スクリプトwebcamを作成した。

/etc/init.d/webcam

  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2009 Yasuo Ogane
  3. START=50
  4. start() {
  5.     mjpg_streamer -i "input_uvc.so -f 15 -r 640x480 -d /dev/video0" -o "output_http.so -w /webcam_www -p 8080" &
  6. }
  7. stop() {
  8.     killall mjpg_streamer
  9. }

この起動スクリプトが起動時に呼び出されるように、/etc/rc.dディレクトリにS50webcamという名前のシンボリックリンクを作成する。起動スクリプトのアクセスモードも忘れずに変更しておく。

  1. root@OpenWrt:/etc/rc.d# ln -s ../init.d/webcam S50webcam
  2. root@OpenWrt:/etc/rc.d# chmod 755 ../init.d/webcam

以上でFonera 2.0のファームウェアの改造作業は終わりだ。再起動すると宅内LANに接続されたどのPCからも無線LANを介してFonera2.0に接続したウェブカメラの映像を見ることができるようになった。あとはインターネット接続用のルータの設定を変更するだけでインタネット上に公開できる。

しかしその前に、少し試験をしておきたい。というのは、この段階ではまだ室内レベルで無線LANによる映像配信ができたというだけで、はたしてどのくらいの距離までこれが可能なのか確かめていないからだ。そのために、乗用車にこのカメラを載せて移動させてみようと思った。電源供給のために車のシガーの12Vが利用できるからである。手持ちの定電圧電源で測定したところ、ウェブカメラの稼動に関係なく消費電流は640mAぐらいだった。

DC-DCコンバータやDC-ACインバーターを使う方法などもあると思うが、今回の実験のためだけの電源と考えると、私にとって最も簡単で手持ちのもので実現できる方法は3端子レギュレータICを使って12Vから5Vに電圧を落とす方法にした。

作成した電源基版。

手持ちの3端子レギュレータICはNJM317F(可変電圧タイプで定格1.5A、JRC製LM317互換品)を使った。なお、NJM317Fは基板の半田面にあるので下の写真には写っていない。ヒートシンクはジャンクのPC基板から取ったものを使った。熱設計はしていないし、保護用ダイオードも付けていない。

次はアクセスポイントの準備だ。今回はアクセスポイントとして、以前にFonera+にDD-Wrtのファームウェアを入れてアクセスポイント化したものを使った。下の写真のように、カメラ用三脚の雲台にゴムベルトでFonera+を縛り付け、2階南側のベランダに近い場所にガラス窓越しに設置した。

続いて今度は車内側の準備に移る。と言っても、カメラとFonera2.0はダッシュボードにただ置いただけだ。

電源基板はフロアに、これまた転がして置くだけ。前もって室内でテストした結果、ある程度発熱があるので念のために無難な場所として、(^^;;

さぁ、これでいよいよ実験が開始できる。実験は2人で行った。1人は車の運転を、もう1人は室内のPCの前で送られてくる映像を監視し記録する。両者は携帯電話を使って連絡を取り合った。先ずは駐車場で確認を、、、見えた!当たり前か(^^;駐車場はアクセスポイントからは見通しのきかない場所にある。フレームレートは2.74fpsだった。ただし、これはJavaScriptを使って表示した時の値であり、Javaアプレットで表示すると5fps程度の値となる。Javaアプレットの場合1フレームごとに接続するのではなく、接続しっぱなしなので速いのである。以下、フレームレートは全て遅いほうのJavaScriptで測定した。

@ 駐車場

じゃ、スタートしようかとエンジンをかけたとたん映像が止まった。多分エンジン始動のためのセルモータの回転に伴って一時的に電圧が低下したためにFonera 2.0 がリセットしてしまったのだろう。Fonera2.0のファームウェアが立ち上がるのを待って、ブラウザを更新表示するとまた表示されるようになった。

駐車場を出てゆっくりと南に向かって直線の道路を進む。アクセスポイントから約40mの場所でいったん停止する。この間映像が途切れることはなく、フレームレートも2.67fpsと出発時とほとんど変わらなかった。この地点もアクセスポイントからは見通しのきかない場所だ。

A 約40mの場所

また、ゆっくりと南に向かって車を走らせた。今度は、映像が途切れるまで走らせることにした。そして、映像が途切れたのは約160m離れた場所だった。この地点もアクセスポイントからは見通しのきかない場所だ。何回かこの場所から引き返して、映像が途切れる地点を探ったが、ほぼ同じ場所で映像が途切れた。

B 約160mの場所

以上の実験によって、Fonera 2.0を使ってウェブカメラの映像を無線で飛ばしてウェブに配信できるという見通しがついた。Fonera 2.0は6千円、ウェブカメラは安いもので2千円程度で販売されているので、既に無線LANを導入している環境なら8千円でケーブルの届かない場所の映像をウェブに配信することができるようになった。

なので、今回の実験はひとまず終わりにする。あと実験するとしたら、アンテナ周りの条件を変えることだろう。今回は使用したFoneraに付属する標準のアンテナをは無指向性だ。純正品として、La Fontennaという指向性アンテナ(技術基準適合証明シールの貼付されたLa Fonera、La Fonera+のみ利用が可能)がある。その他各社からは無線LAN用のアンテナが販売されている。紙とアルミフォイルでパラボラアンテナざるアンテナ空き缶アンテナなんてのもある。

2009年11月22日