-
Window / MacOS / Linux
-
githubへのアクセスできる環境
-
Dockerの実行環境
※ 以下MacOS Sonomaで確認しています。
適当なdirectoryで下記を実行します。
MacOSの場合はDocker起動にlimaを使います。
事前にlima, docker CLI, docker-composeをinstallしておいてください。
# git clone atomcam_tools
# cd atomcam_tools
# make lima <---- MacOSのみ
# make
環境に依存しますが1時間程度でatomcam_tools.zipが出来上がります。
zipの中身は
- authorized_keys
- hostname
- factory_t31_ZMC6tiIDQN
- rootfs_hack.squashfs
で、atomcam_tools/target 以下に出来ているものと同じです。
remote loginするなら、sshのpublic.keyをauthorized_keysに追加してください。
# cat ~/.ssh/id_rsa.pub >> ./target/authorized_keys
デバイス名を変更するなら、hostnameを修正してください。(default : atomcam)
# echo "hogehoge" > ./target/hostname
上記4つのファイルをSD-CardにコピーしてAtomCamに入れて起動します。
初回起動時はswap fileの作成とsshのhost-keyを作成するのに少し時間がかかるので40秒程度かかります。
build環境は一度buildするとdocker上にコンテナが起動した状態になっています。
# make login
でコンテナに入れます。 dockerコンテナが落ちてるときは
# make lima <----- MacOSの場合
# docker-compose up -d <------ linuxの場合
で起動してください。
ここで作ったイメージでATOMCamを起動すると、glibcで生成されたmipsel版のlinux環境が起動します。
この環境の中で/atom以下に本来のATOMCamのシステムを起動してchroot環境に閉じ込めています。
システム構成は
-
SoC: Ingenic T31 SoC
-
CPU: MIPS32R5 I$32K/D$32K/L2$128K
-
kernel: linux 3.10.14 mipsel
です。
initramfsの中身はinitramfs_skeleton/です。
initramfsはkernel 起動時のcmdlineで/initを実行するようにしています。
toolsのupdateがある場合はそのための処理を実行します。
その後、SD-Card上のrootfs_hack.squashfsをrootにswitch_rootしてremountの処理を行い、/sbin/init(busybox)を起動します。
rootfs_hack.squashfsはconfigs/atomcam_defconfigの設定でbuildされたイメージにoverlay_rootfsを重ねたものになります。
/sbin/initがinittabに従って/etc/init.d/rcSを起動して、rcSで/etc/init.d/S*を順番に実行します。 /etc/init.dを最後まで実行すると、serialを繋いでいればgettyでlogin promptが出ます。AtomCamの後ろ側のLEDが青点滅ー>青点灯になるとsshでloginできる状態になります。
ATOMCamのFW updateのシーケンスが実行中の場合、処理を代行します。
overlayfsが使えないので、bind mountでシステムのファイル/フォルダーの配置を入れ替えています。
/atom/以下に本来のATOMCamのシステムと幾つかのmount-pointを共通でアクセスできるようにmountします。
その後、chrootで/atomの/tmp/system/bin/atom_init.shを呼び出します。
ここまではglibcの世界で動作しています。
本来のATOMCamの初期化シーケンスを実行します。ここからuClibcの世界に入ります。 iCamera_appの実行時にlibcallback.soを噛ませて各種patchをあてて処理を追加しています。さらにwebHookのためにlogを名前付きFIFOファイル (/var/run/atomapp) に出力させています。
これを実行するとwatchdogが起動するため、assisとiCamera_appは止められなくなります。
recognition等の機能はiCamera_appにあるわけではなく、cloudから読み込まれて実行されているようです。
ATOMCamのiCloud_appが動体検知をcloudに送信後に削除する時のrmコマンド、1分ごとのSD-Cardへの記録ファイルを/tmpから移動するmvコマンドを置き換えてNASへの記録やwebHookのeventを送信するためのscriptです。
iCamera_app内部パラメータや動作を変更するためのコマンドを実行するwrapperコマンドです。
AtomSwingでのクルーズ動作を実行するためのscriptです。
Ver.upでhack_iniの互換性がない場合に引き継ぎ処理をするためのscriptです。
定期的にネットワークの健全性のチェックを行うscriptです。
WebUIのlighttpdの起動処理と認証の切り替え等の処理を行うscriptです。
定期的にメモリーの状態をlogに記録するscriptです。
AtomSwingでモーターの初期位置動作をするscriptです。
networkの接続をするための初期化scriptです。
WebUIの定期reboot設定をcrontabで指定時間に実行するためのscriptです。
syncしてrebootを実行します。
指定時間経過した録画データを削除するためのscriptです。
init.d/S58rtspserverとWebUIのRTSPのon/offから呼ばれます。
v4l2rtspserverをon/offします。
設定に従ってSambaの起動/終了をするscriptです。
reboot.shやtimelapse.shを起動する時刻をcrontabに設定するためのscriptです。
iCamera_app起動直後に設定しておくべき設定値を処理するためのscriptです。
timelapseの開始処理、終了時のファイル処理のscriptです。
/var/www/cgi-bin/exec.cgiからnamed-FIFO経由でコマンドを実行します。
cgiの実行はwww-dataアカウントでの実行なのでシステム制御系のコマンドは直接実行できないので、コマンドを受けて実行して問題ないものだけ実行する構造にしています。
iCamera_appのlogを受けてwebHookのイベントを拾っています。
iCamera_appの実行環境では制限があるため、名前付きFIFO経由でlogを受けて必要に応じてcurlでpostしています。
WebUIからのコマンドをnamed-pipe経由でwebcmd.shに投げています。
WebUIで表示するjpeg画像を取得しています。
WebUIで使用している設定値の取得、設定をします。
MobileAppからのアクセス時の要求に応答するためのcgiです。
web/以下にWebUIのソースコードがあります。
WebUIはVue.jsとElementUIで記述しています。
Target環境はmipselなのでnode.jsの最近のバージョンは未対応になります。
そのため、frontend側のみbuildして、backend側はlighttpdとcgiで対応し、frontendからaxios経由でアクセスする構造にしています。
WebUIの画面はweb/source/vue/Setting.vueに記述しています。
Docker環境では/srcがatomcam_tools/にmapされています。
以下、基本的にDocker内のコマンドは下記のDirectoryから実行します。
root@ac0375635c01:/atomtools# cd /atomtools/build/buildroot-2016.02
rootfsはglibc環境でDocker内のgccを使用します。 build時にgccも生成されます。 gccのprefixは /atomtools/build/buildroot-2016.02/output/host/usr/bin/mipsel-ingenic-linux-gnu- です。
ATOMCam本来のシステムのカメラアプリiCamera_appはuClibcの環境でbuildされています。
そのためiCamera_appのhack用のlibcallback.soのbuildにはuClibc環境が必要なので別途cross tools-ng-1.26.0を導入しています。
gccのprefixは
/atomtools/build/cross/mips-uclibc/bin/mipsel-ingenic-linux-uclibc-
です。
initramfs, kernelのconfigを変更した場合
root@ac0375635c01:/atomtools# make linux-rebuild
root@ac0375635c01:/atomtools# make
でbuildされてatomcam_tools/targetにコピーされます。
rootfs内のファイルやbusyboxのmenuconfigを修正した場合
root@ac0375635c01:/atomtools# make
でbuildされてatomcam_tools/targetにコピーされます。
rootfsに含まれるpackageの変更した場合
root@ac0375635c01:/atomtools# make menuconfig
root@ac0375635c01:/atomtools# make
でbuildされてatomcam_tools/targetにコピーされます。
個別のpackegeのrebuildの場合
root@ac0375635c01:/atomtools# make <package>-rebuild
root@ac0375635c01:/atomtools# make
です。
busyboxのコマンド等の設定変更の場合
root@ac0375635c01:/atomtools# make busybox-menuconfig
root@ac0375635c01:/atomtools# make
でrootfsがbuildされます。
kernelの設定変更の場合
root@ac0375635c01:/atomtools# make linux-menuconfig
root@ac0375635c01:/atomtools# make linux-rebuild
root@ac0375635c01:/atomtools# make
でbuildされてatomcam_tools/targetにコピーされます。