|||||||||||||||||||||

なんぶ電子

- 更新: 

専用アプリを使わずにスマモッチャーを操作

スマモッチャー

ドン・キホーテでスマモッチャーを購入しました。

で起動しようと思ったら、専用のアプリのインストールが必要でそれはどこか知らないサーバーに接続されている模様で、セキュリティ的に心配です。

ただメーカ側からしたらそういった構造にするのが「ユーザーフレンドリー」というものなのかもしれません。スマホで外から家のカメラをみようとする要求を、筆者が以前購入したIOデータ製のWebカメラではDDNSという初心者には少しとっつきにくい方法で実現していました。

「安物買いの銭失い」で諦めるべきところですが、なんとか方法がないか調べたらサーバーを利用しないカスタムプログラムがあるようです。

ただ、それをそのまま使うと、今度は家のネットワークに組み込めない問題があったり、近く人いる人にカメラに接続されたりする危険があります。筆者はそこを改善してみました。

カスタムの方法

カスタムプログラムのロジックは、はmountの--bindオプションを使って、本来のファイルやディレクトリをSDカード内のデータに差し替えているようです。

これはパーティションにRead-Only属性がついているためでです。ただ全てがread onlyと言うわけではないようで、/etcディレクトリは書き込みができませんでしたが、/tmpや/var/runディレクトリには書き込みができました。ただし、ここで書き込んだものは電源が切れると削除されるようです。

カスタムの方法は動かざることバグの如し:「ドンキのWiFiカメラで遊ぶ」を参考にさせていただきました。

GitHub:「zsgx1hacks」のページから、「readonlyhack-v0.1.zip」をダウンロードして展開します。

展開して出てくるhackフォルダとdebug_cmd.shファイルをMicroSDカードのルートフォルダにコピーします。

スマモッチャー(IP001-WH)にSDカードを差して起動すれば、作業完了です。うまくいっていればSSHでアクセスができます。

状態の確認

SSHって?って人がいたら、Tera Termをダウンロードしてみてください。執筆時点でTera Term 4.105が最新でした。zip版をダウンロードして展開し「ttermpro.exe」をダブルクリックして起動するとSSHが選択された状態でTera Termが起動します。

IP001-WHは初期状態ではWi-Fi親機モードでパスワードなしの状態(オープン)で稼働していますので、接続します。おそらくCLOUDCAMから始まるSSIDです。

おそらくサーバ(スマモッチャー)のIPアドレスは、192.168.200.1ですので、先のTera TermのHostの欄にそれを入力して、OKを押します。サーバーのIPを確認したい場合はコマンドプロンプトからipconfigと入力するとWireless LANの項目のデフォルトゲートウェイの値として表示されます。

最初に出てくる警告はそのままOKを押して進み、User name(ユーザー名)に「root」、Passphrase(パス―ワード)は空白のままOKを押します。

スマモッチャーSSH
SSHログイン結果

中身は

SSHで気になる中身を見ていきます。早く設定に進みたい方は読み飛ばしてください。

まず、dmesgでシステム起動時のログを見てみます。

# dmesg
[    0.000000] Booting Linux on physical CPU 0
[    0.000000] Linux version 3.4.43-gk (rd@ubuntu) (gcc version 4.6.1 (crosstool-NG 1.18.0) ) #45 PREEMPT Mon Jun 17 17:06:05 CST 2019
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: VIPT aliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: Goke IPC Board

ubuntuの文字が見て取れました。なじみのあるOSでちょっとハードルが下がった気がします。

続いてバイナリを確認してみます。筆者にはあまりなじみがないのですが、複数の基本的なコマンドが詰まった、組み込み界では有名なBusyBoxがあります。

他にネットワーク系のコマンドには次のようなものがありました。こうして接続できているのはこの中のhostapdが起動しているからです。

...
-rwxr-xr-x    1 root     root        555004 Aug 23  2018 hostapd
-rwxrwxr-x    1 1000     default      19376 Apr 21  2017 iwconfig
...
-rwxrwxr-x    1 1000     default      31304 Apr 21  2017 wpa_cli
-rwxrwxr-x    1 1000     default     501252 Nov 29  2017 wpa_supplicant
...

スマモッチャーをWi-Fiクライアントモードに

通常の使い方でも初期設定の後はWi-Fiはクライアントモードしとして動きます。おそらく先のコマンドリストで見つけた、wpa_supplicantを使っているのでしょう。これを使ってローカルに設定します。

以前、同系列のOSであるDebianにWi-Fiを設定した時はサービスとしてwpa_supplicantを設定しましたが、ここでは直にコマンドをたたいています。-iオプションでインターフェース、-cオプションで設定ファイルを指定します。この時空白はいらないそうです。-Bはバックグラウンドオプションです。

通常のスマモッチャーは、dhcpクライアントとしてIPアドレスの割り当てを受けるのですが、その操作方法が見つかりませんでした。dhclientがあればいいのですが……。

SSIDとパスワード、ifconfigの後のIPアドレスは自身のwi-fi環境に合わせてください。

これを先のSDカードに同梱させて、起動時に読み込みます。

debug_cmd.sh


...
既存のスクリプトの最後に次の1行を追加します
...
(sleep 30 && /media/changewifi.sh ) &

次のファイルを作成して、MicroSDのdebug_cmd.shと同じ場所に置きます。改行コードはLFになるので注意してください。

スマモッチャー側のネットワークで動くDHCPサーバのudhcpdと、Wi-Fiの親モードであるhostapdを停止した後、IPアドレスを変更し、wpa_supplicantを起動します。スマモッチャーOS内では日本語のコメントが使えないので、(つたない)英語で書いています。

changewifi.sh


#!/bin/sh

# add wpa_supplicant.conf
cat << EOS >> /tmp/wpa_supplicant.conf
update_config=1
network={
        ssid="SSID"
        psk="wi-fi password"
}

EOS

# kill dhcpd
pkill udhcpd

# kill hostapd
pkill hostapd

# down wlan0
ip link set wlan0 down

# not found dhclient, so change ip address manually
ifconfig wlan0 10.8.102.200

# wlan0 up
ip link set wlan0 up

sleep 5

# wpa_supplicant start
wpa_supplicant -Dwext -iwlan0 -c/tmp/wpa_supplicant.conf -B

これで起動30秒後にプライベートネットワークに接続されます。初期化処理後に実行しないといけないので少しウェイトを入れています。

セキュリティ関連の再設定

カスタムでスマモッチャーは外部への通信をしないようになっていますが、念のためルーターのファイアウォールで、スマモッチャーのIPから発信されるインターネットに向けた発信を停止しておきましょう。送信元IPアドレスの詐称を考慮するなら、別のネットワークに閉じ込めたうえ送信先アドレスがローカルへの通信のみ許可するようにします。

スマモッチャーの機能でIPv6通信するのかどうかは不明ですが、IPv6で外部に抜けられることを先の設定は考慮していない様子です。仮にスマモッチャーが何もしなくても、カメラのIPv6のアドレスがわかれば第三者からのパスワードのないrootアクセスをSSHで許してしまいます。

IPv6環境が家にある場合は次のようにしてスマモッチャーのIPv6環境を止めておきます。LinuxでIPv6を無効にするを参考にさせていただきました。


cat << EOS > /tmp/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

EOS

sysctl -p /tmp/sysctl.conf

# 確認
#sysctl -a | grep disable_ipv6

もともと、見えないところで外部のPCと接続されるのが怖いという理由でここまでの作業をしてきたのですが、この状態で外部と通信したいなら、中継用のVPNサーバーを設けて、スマモッチャーは直接インターネットにはさらさないようにしましょう。

カメラ画像の受信と、操作、保存

カメラの操作は、ツールの中のWebサーバー経由で行えます。ウェブブラウザ次のアドレスに接続することで操作が可能です。

http://カメラに設定したIPアドレス:8080/cgi-bin/webui

動画はRTSPによって公開されています。それらのアドレスは次の通りです。上から高画質、低画質、デフォルトのRTSPとなっています。

rtsp://カメラに設定したIPアドレス:8001/0/av0
rtsp://カメラに設定したIPアドレス:8001/0/av1
rtsp://カメラに設定したIPアドレス:554

RTSPはVLC media playerや、スマホアプリなどから再生できますが、今回は以前このブログでも紹介したffmpegを使ってみたいと思います。

再生はffmegに同梱されているffplayで可能です。

ffplay -i rtsp://カメラに設定したIPアドレス:8001/0/av0

動画の保存は次のようにします。

ffmpeg -i rtsp://カメラに設定したIPアドレス:8001/0/av0 -f mp4 out.mp4

データを動画でなく写真にするには次のようにします。rオプションの後には、1秒毎の枚数を設定します。

ffmpeg -i rtsp://カメラに設定したIPアドレス:8001/0/av0 -vcodec png -r 0.1 image_%04d.png

動画保存の方法はネットワークカメラ(RTSPで配信)の映像をFFmpegで録画する、静止画への変換の方法は、ffmpeg 動画から連番画像を作成するを参考にさせていただききました。

日時の修正は先ほどのsshでログインした状態で「date」コマンドを実行します。たとえば2021年11月04日なら次のようにします。

# date 110414462021
Thu Nov 4 14:46:00 GMT 2021

これでスマモッチャーがかなり便利なツールになった気がします。


ツールの作成者様、参考にさせていただきましたサイトの皆様、ありがとうございました。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告