約6か月前、ミニチュアビデオサーバーを入手しました。このアプリケーションは、オートバイ用のレンタルガレージで見つけました。このアプリケーションは、2台の中国のNoName IPカメラと連動し、ONVIFを何らかの形でサポートしています。幸運なことにこれまでガレージに到着したときだけだった動き検出アラートを備えたカメラからビデオを見る。 私自身、このマイクロサーバーを静かに動作させることはしませんでした。手に取ったばかりのとき、私はそれを好奇心から解き放ち、シングルボードのオレンジPi PCに組み込まれていることを思いがけず発見しました。 Geektimesを含むインターネット上で、その機能を大まかに想像しました。
実際、6か月使用した後、ビデオサーバーの主な機能に加えて、ボード上のGPIOコームを使用して、煙センサー、ドアオープンセンサー、およびリレーを接続してサイレンをオンにしたかったのです。 私の意見では、この趣味のプロジェクトで最も興味深く、困難な段階であり、私はコミュニティと共有することを決定し、さらなる開発に関するアドバイスを得ることを望んでいました。 注意:以下に説明するアクションは、ほとんどの場合、デバイスの保証を奪い、自分の危険とリスクでそれらを作成し、心の糧としてのみ引用しましたが、アクションのガイドではありません。
ファームウェアの研究
まず第一に、ビデオサーバーがフルディストリビューションを使用することを期待して、モニターとキーボードをボードに接続しようとしましたが、HDMI出力に信号がありませんでしたが、ポートはファームウェアに単に関与していなかったようですが、開発者は言っていますこれはMicroNVR(Network Video Recorder)クラスのデバイスであり、リモートアクセス以外のサーバーとのユーザーの対話を意味しません。 2番目の目標はsshで、デバイスのポートは開いていますが、サーバーはキーによる認証のみをサポートしています。
幸いなことに、このデバイスはeMMCなしのシングルボードバージョンに基づいており、ダウンロードはボードの端から突き出ている通常のMicroSDカードから行われます。 実際、ファームウェアの内容にアクセスするために必要なことは、カードをカードリーダーに挿入することだけです。 8Gb SanDiskには3つのセクションがあります。
/dev/sdb1 on /media/user/disk type squashfs /dev/sdb2 on /media/user/UBOOT type vfat /dev/sdb3 on /media/user/07836191-ddf8-45ab-b02b-1103320c2e5b type ext4
パーティションサイズ:
/dev/sdb1 25M 25M 0 100% /media/user/disk /dev/sdb2 16M 2.2M 14M 14% /media/user/UBOOT /dev/sdb3 58M 9.4M 45M 18% /media/user/07836191-ddf8-45ab-b02b-1103320c2e5b
UBOOTセクションは、明らかにU-Bootローダーによってのみ使用されます。 ext4セクションには、メインサブシステム(kern、lighttpd、line、netcfgd、syslog)のログ(/ log)と、ユーザーがアクセスできるビデオ監視サーバーの設定(/ lib / line)が含まれます。 また、squashfs(圧縮された読み取り専用)を使用したディスクセクションには、OSとプログラムのすべてのファイルが既にあります。 オペレーティングシステムと、すべての「アナリスト」と「クラウド」を含む論理部分が25 MBで開発者に適合していることがわかります。これは、Webサイトの更新のサイズ、つまり、 監視ソフトウェアだけでなく、ファームウェア全体が置き換えられます。
メインセクションには、通常のディレクトリセットが含まれています。
bin dev factory media root sbin tmp var boot etc lib proc run sys usr
一般に、ディレクトリツリーに異常はなく、すべてがその場所にあります。 起動されたrunitサービスは/ etc / serviceにあります:
dropbear hwclock-fix lighttpd line netcfgd socklog-klog socklog-unix
リストにlighttpdがあるのを見て、自分の目的で使用できるかどうかを確認することにしました。 設定から始まります:
server.modules += ( "mod_cgi" ) $SERVER["socket"] == ":19587" { include_shell "/usr/share/adm/lighttpd-gencert" server.document-root = "/usr/share/adm/www" cgi.execute-x-only = "enable" cgi.assign = ( "" => "" ) }
内容/ usr / share / adm / www:
datetime firmware password profiles sysinfo timezones factory-reset locale profile settings timezone
スクリプトのセットにより、HTTPサーバーがデバイスのシステム設定の変更とファームウェアの更新を可能にするユーティリティの機会を提供することは明らかです。これはすべて、HTTPプロトコルを介して参加しなくても実行できることがわかります。 たとえば、ブラウザからシステムに関する情報を含むアーカイブを取得することもできます。
https://192.168.1.2:19587/sysinfo
サーバーは、生成された自己署名証明書とパスワードを変更する機能を備えた標準認証を使用します(ハッシュのみがデバイスに保存されます)。 認証済みで独自のスクリプトを追加する非常に簡単な機能を備えた既製のHTTPSサーバーは、時間を大幅に節約し、直接GPIOに進みました。
ファームウェアリビジョン
簡単なGoogleリクエスト「Orange Pi PC GPIO」により、すぐにコマンドが表示されました。
echo 0 > /sys/class/gpio_sw/PA1/data echo 1 > /sys/class/gpio_sw/PA1/data
ポート名の検索も問題ではありませんでした。
利用可能なスクリプトを見て、その例に従って、名前がalarmで内容が新しいスクリプトを作成しました。
#!/bin/sh set -e . ../lib/devline/http.sh . ../lib/devline/auth.sh is_auth || http_err_unauth [ "$REQUEST_METHOD" = "PUT" ] || http_err_method PUT value="$(head -c "$CONTENT_LENGTH" | tr -d '.')" echo $value > /sys/class/gpio_sw/PA3/data echo "Content-Type: text/plain" echo echo OK
ファームウェアの更新
新しいファイルをデバイスに追加することしかできませんでした。通常のコピーでは実行できません。 ターゲットファイルシステムは読み取り専用です。 おそらく、squashfsに変更を加えるためのさまざまな方法がありますが、私は自分の意見では最も簡単な方法で行った。 まず、ファイル内のセクションの画像を検討しました。
dd if=/dev/sdb2 of=sdb2.img
次に、squashfsを通常のディレクトリに展開します。
unsquashfs sdb2.img
アラームスクリプトをsquashfs-rootの目的のパスにコピーし、そこから新しいsquashfsイメージをコンパイルしました。
mksquashfs squashfs-root sdb2-new.img
次に、USBフラッシュドライブにアップロードし直しました。
dd if=sdb2-new.img of=/dev/sdb2
まとめ
現時点では、安全なチャネルでリレーを閉じることができます。
curl -X PUT -k --data '1' https://admin:j3ks92ls8f@192.168.1.2:19587/alarm
そしてそれを開きます:
curl -X PUT -k --data '0' https://admin:j3ks92ls8f@192.168.1.2:19587/alarm
概して、私にとって個人的には、アイデアを実装する技術的な実現可能性の評価にすぎませんでした。 評価は肯定的です。I/ Oポートにアクセスでき、デバイスファームウェアにロジックを追加できます。 おまけとして、すぐに使えるHTTPSサーバーを入手しました。
私の意見では、これは開発の最も興味深い部分であり、ほとんどの部分はルーチンのみであり、すべての計画を完全に完了するかどうかはわかりません。 いずれにせよ、誰かがこのようなことを繰り返すことに決めた場合、現在の結果をさらに発展させるためのアイデアがいくつかあります。
- センサーで入力の状態を監視し、トリガーに応答する(通知、サイレンをオンにする)サービスのスクリプトを記述します。 ここではすべてが明確であり、サービスや通知で問題が発生することは想定されていません。curl実行可能ファイルが既にデバイス上にある場合、つまり 通知にはいくつかのオプションがあります。SMTPおよびIMAPを介したメッセージの受信、既製のSMS送信サービス、独自のサーバー。
- 直接IPアドレスなしでインターネットを介して作業を開始します。 事実は、メインビデオサーバーソフトウェアのみがクラウドを介して機能し、システム設定を実装するlighttpサーバーは直接アクセスできるだけであり、もちろんそれ自体が悪くないことです。 この点については、実装の容易さについてはあまり確信がありません。これまでの私の考えは、ssh-tunnel(デバイスに公開鍵を追加する必要があります)またはサーバーとデバイスの横からの長いポーリングに限られます。
あなたのアイデアに感謝します。