ONVIF対応監視カメラをNVRサーバに登録して使用する

防犯カメラ
©いらすとや.

ONVIF対応カメラをNVRに登録する 1
ONVIF用のアプリは各種OS用にいろいろあるが、今回はAndroidのアプリをGoogle Playで検索。「onvif」でアプリを検索すればたくさん出てくるので「Onvier - オンヴィフIPカメラモニター」をインストールしてみた。Onvierに似たようなアプリは複数あるようなのでOnvierでなくてはならないということではない。

ONVIF対応カメラをNVRに登録する 2
「Onvier - オンヴィフIPカメラモニター」アプリを起動してデバイスを追加する。Androidの端末からネットワーク(インターネット含む)で届く範囲に自身の所有する監視カメラがあること。今回だと同じLANにカメラがあるとする。
カメラデバイスの追加のために「+」をタップする。

ONVIF対応カメラをNVRに登録する 3
今回はONVIF対応の監視カメラの接続情報を得るのが目的なので「ONVIFデバイス(推奨)」をタップ。

ONVIF対応カメラをNVRに登録する 4
「名前」は何かテキトーに。「アドレス(とポート)」は判っているなら入力する。「ユーザー」と「パスワード」は機器側に設定してある場合に必要なことがあるが必要ないこともあるので空白で。
Onvierを使う理由はネットワーク(Lan内)のカメラデバイスを探したいからなので「名前」だけ入力して「設定」をタップ。「IPアドレスを入力してください」が表示されるがその後にネットワーク内の検索が始まる。ただし、ネットワーク内の検索は失敗することもある(あった)ので、できれば監視カメラのIPアドレスだけ入力してから「設定」をタップする方が確実かも。

ONVIF対応カメラをNVRに登録する 5
ONVIF情報の取得が成功すれば監視カメラの映像が表示される。画面をタップするなどしてデバッグログやデバイス情報を表示させるとURLが含まれた情報が表示される。URLは幾つか表示されるかも。画像の赤い四角のようなURLがあればそれをメモする。

これで、ONVIF対応のソフトウエアで使うための接続情報を取得できた。(この記事の後半でONVIF対応NVRサーバのソフトウエアのへのカメラの登録をやる。)

監視カメラはONVIFで制御できない機能を持っていることがある。その制御のためには監視カメラのメーカーが提供するアプリケーションを使う。
今回購入した中華監視カメラはV380 Proをインストールするよう説明書に書かれていたのでそれをインストールした。

ONVIF対応カメラをNVRに登録する 6
V380 Proは(Android用であれば)Google Playからインストールできる。今回は「がとらぼ」の中の人が購入したのがV380の監視カメラなのでこのアプリだが、他の監視カメラであればそれ用のアプリをインストールする。中華監視カメラアプリはカメラと共にインターネットへの接続が必要なことが多い。中華のクラウドに監視映像を保存できるサービス(有料)が提供されているが、そのサービスを利用しなくてもアカウントを作成してカメラとアカウントを紐付けることでアプリが使用できるようになる。当然だが、このような中華監視カメラは中華クラウドにカメラの情報を流し続ける。カメラ映像を中国に流し続けるわけではないが、中華側からの操作で映像を撮られる可能性があるので注意。

ONVIF対応カメラをNVRに登録する 7
V380 ProアプリのスマホとV380中華監視カメラの両方がインターネットと通信できるネットワーク環境に置く。(同じLANである必要はない)
アカウントを作成してアプリにログインすると監視カメラ本体のバーコードを撮影するように求められる。またはバーコードと共に記載されている数字。これが監視カメラの個体ID。ONVIFで情報を取得すると個体IDが取得できる場合があるのでそれをメモするのもある。アプリでバーコードを撮影するか数字を入力すると監視カメラとアカウントが紐付けられる。
これでカメラの映像がアプリに表示されカメラを制御できるようになる。
カメラの制御はカメラ映像の右上から。ポップアップされる小窓の中の「設定」を開く。

ONVIF対応カメラをNVRに登録する 8
設定の中で特に触りたいのは「デバイスの時間」。これはタイムゾーンで日本時間に合わせておかないと(デフォルトは中国時間?)1時間ずれた時間が表示されるかも。
「ファームウエアのバージョンチェック」はカメラのファームウエアの確認と更新。新しいファームウエアがあれば更新できる。今回新しいバージョンが提供されていたようなので更新してみたが変更ログが表示されないので何が変わったのかは不明だった。(不親切)
「照明制御設定」は監視カメラのカメラレンズ近くに配置されたライトの制御。初期値は自動らしいが、夜間に可視光のライトが点いたり消えたり忙しい。可視光のライトが点灯するとカメラ映像は夜間でもカラーになる。消えると白黒の赤外線映像になる。防犯の点でいえば可視光のライトが点灯する方が良いのかもしれないがピカピカがうざいと思うなら「照明制御設定」から照明の点灯をオフにできる。
他にTFカード(カメラ本体のmicroSDカード)への録画についてなどもこのV380 Proアプリで制御できる。

アプリは1度だけ使用して必要な設定を行ってしまえばもう要らない。
カメラの設定を変更した後は、中華監視カメラをインターネットにつながらない閉鎖ネットワークなどに置くことが望ましいかと思われる。(それについては先日別の記事に書いた。)

NVRサーバにONVIF対応カメラを接続する

今回は有名処であるiSpyのAgent DVRを使うことに。このソフトウエアはWindowsやmacOS, Linux, Raspberry-Pi, Docker用が用意されている。単純にAgent DVRをインストールするだけですぐ動くWindows用が簡単かも。

ONVIF対応カメラをNVRに登録する 9
Agent DVRサービスを開始した状態でAgent(ブラウザアプリ)を起動して、左上にある「Server Menu」をクリックする。サーバ設定メニューが表示されるので「New Device」をクリックする。

ONVIF対応カメラをNVRに登録する 10
「Select Display Slot」画面で緑色の枠の中をクリックする。(何をすればよいのか解りにくいと思う)

ONVIF対応カメラをNVRに登録する 11
「New Device」の選択画面が表示されるので「ONVIF」をクリック。

ONVIF対応カメラをNVRに登録する 12
「Configure」では、「Record on Detect」(画面内の変化の検知で録画)をオンとResize(NVRサーバのパワーに余裕がなけれれば)をオフ、Record Rawはオンのままにするのがオススメ。
「OK」をクリック。

ONVIF対応カメラをNVRに登録する 13
カメラの登録画面に進むが、これがわかりにくい。
右上が「General」であることとSource TypeがONVIFであることを確認してその右のメニューボタンをクリック。

ONVIF対応カメラをNVRに登録する 14
「Service URL」に先に確認しておいたONVIF用URLを入力する。ポート番号やそれに続くPathやパラメータは監視カメラの機種によって違うかも。
Serviice URLを入力したら「Get Video URLs」ボタンを押す。これでONVIFの情報から動画用URLが自動で検知されてLive URLやRecord URLなどの欄が埋められる。(ここは便利)

ONVIF対応カメラをNVRに登録する 15
Options Foundが2以上と表示されている場合は解像度などの選択が可能。上の画像の例ではLive URLとRecord URLでVGA解像度とFHD解像度が選択できるので記録メディアやライブ動画表示環境がよほどショボくなければ高い方の解像度にする。

ONVIF対応カメラをNVRに登録する 16
監視カメラの映像が表示されるようになる。初期値は4分割(カメラ4台を同時表示用)なのでカメラが1台だけなら分割表示をやめてシングル表示にする。上の画像は夜間の道路。可視光のライトをオフにしているので赤外線の白黒表示になっている。(上の画像はぼかしています)
PTZカメラであればカメラの向きやズームを上の画像の右下のようなコントロール表示をマウスポインタで操作できる。なお、パン,チルト,ズームのどれかまたは全てに対応していないカメラはその非対応機能を操作できません。

カメラ映像に何らかの変化が生じたときだけ数十秒間〜撮影するようにしておけば記録メディア,NVRサーバの記録容量が抑えられるが日の当たり方やクルマのライト、虫が飛んだだけでも誤検知して記録することがあるみたい。逆に突然フレームインした被写体の最初の部分が撮れていないことがあるかも。(設定で変わるかもしれません)

AgentDVRは映像の閲覧がブラウザなのでAgent DVRをインストールしたPCだけでなく繋がったネットワーク(インターネット含む)のPC等のブラウザでも閲覧・操作可能です。ただし、再生映像の質については保証できません。また、スマホ等用のアプリも用意されているのでブラウザとは違う表示も可能のようです。

Agent DVRの操作UIはブラウザアプリ。触りまくってるとアレコレ何かヘンになることがある。Agent DVR(サービス本体)自体に異常があるのであれば再インストールするというのも手ではあるが、その前にブラウザキャッシュを削除して様子を見るのがオススメ。

関連記事:

2つのLANをつなぐルーター作成

前回の記事。中華監視カメラを買ってみたが、インターネットとつながるところに置くと中華クラウド等と通信しまくることが判った。
そこでNVR専用Lanを作り既存のLanとルーター(ファイアウォール付き)で接続することにした。つまり前回の記事の最後の図(↓)にする。

NVR専用Lanを作るの図

NVR Lan用ルーターのネットワーク設定

今回はルーターとしてはSBC(NanoPi NEO2)を使うことにしArmbian(Debian) Bullseyeをインストールした。これはnftablesがファイアウォールとして使える。ネットワークの設定には、今回はNetworkManagerを使うことに。
NetworkManagerの設定ファイルは /etc/NetworkManager/system-connections に保存されている。

nvr用ルーターの外向けNICの設定は特に普通に外側LANに参加する内容だけ。つまり上の図の「家庭用Lan」側を普通に設定するIPアドレス,サブネットマスク,デフォルトゲートウェイ,ネームサーバなど。デフォルトゲートウェイは「家庭用Lan」のインターネット向けのルーターのIPアドレスを指定しておけば問題なさそう。ネームサーバも同じく「家庭Lan」で使っているものを指定しておく。今回、「家庭Lan」は 192.168.0.0/24 とする。

/etc/NetworkManager/system-connections/外向けNIC.nmconnection (一部)
1
2
3
4
5
[ipv4]
address1=192.168.0.16/24,192.168.0.1
dns=8.8.8.8;8.8.4.4;
dns-search=
method=manual
上の例は、 192.168.0.16が外向けのIPアドレスでサブネットマスクは255.255.255.0 (/24)、デフォルトゲートウェイは192.168.0.1。ネームサーバは8.8.8.8と8.8.4.4(Google) という指定。 method=manualなので当然DHCPではなく手動(固定)。

「NVR用 Lan」は、「家庭Lan」とは別のネットワークにするのでここでは 192.168.128.0/24 とする。
ルーターの内向けNICが「NVR用 Lan」に向いている。

/etc/NetworkManager/system-connections/内向けNIC.nmconnection (一部)
1
2
3
4
5
[ipv4]
address1=192.168.128.1/24
dns=192.168.128.1;
dns-search=
method=manual

上の例は、192.168.128.1が内向けNICのIPアドレスで、サブネットマスクは255.255.255.0 (/24)、デフォルトゲートウェイは指定しない。ネームサーバは自身である192.168.128.1にしている。もちろん別途の設定でこのルーター上でリゾルバを動かしてやることになる。実際にはNVR Lan向けのリゾルバは無しでも良いし「家庭Lan」用のリゾルバを指定でも可。この場合はファイアウォールの設定によってはカメラが名前解決できないけど問題はない。

ルーターにするので、その指定を1行追加。

/etc/sysctl.conf (1行追加)
net.ipv4.ip_forward=1
たとえばNICのeth0でIPv6を無効にするなら
/etc/sysctl.conf (1行追加)
net.ipv6.conf.eth0.disable_ipv6=1 他のNICでIPv6を無効にするのであればeth0の部分をそのNICの名前に変更する。すべてのNICでIPv6を無効にするならeth0の部分をallにする。
ただし、USB NICなどを使っている場合は/etc/sysctl.confに書いた net.ipv6.conf.USB-NIC.disable_ipv6=1 や net.ipv6.conf.all.disable_ipv6=1 は効かないことがあるかも。

NVR Lan用ルーターでDHCPサーバを動かす

おそらくDHCPサーバのパッケージはOS標準で入っていると思われるが、もしも無ければ sudo apt install isc-dhcp-server などとしてインストールする。

/etc/dhcp/dhcpd.conf (一部)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
subnet 192.168.128.0 netmask 255.255.255.0 {

    range  192.168.128.192 192.168.128.254;
    default-lease-time 1296000; #2 weeks
    max-lease-time 2592000; # 4 weeks

    option routers              192.168.128.1;
    option subnet-mask          255.255.255.0;
    option domain-name          "nvrnet";
    option domain-name-servers  192.168.128.1;
    option time-offset          32400;  # Japan Standard Time
    option ntp-servers          192.168.128.1;
}

host camera1 {
    hardware ethernet 00:00:00:00:00:00;
    fixed-address 192.168.128.70;
}

NVR Lan用のDHCPサーバなのでデフォルトルートはルーターの内向きNICのIPアドレスになります。また、リゾルバをルーターに置くならネームサーバも内向きNICのIPアドレス、NTPサーバもルーターで動かすので内向きNICのIPアドレスにします。
rangeでリース範囲を指定。上の例だと192.168.128.192 - 192.168.128.254にしている。つまりDHCPで動的に割り当てられるIPアドレスはこの範囲のどれかになる。
しかし、カメラやNVRサーバのネットワーク設定をDHCPまかせにする予定ならアドレスが動的に変わると困るかもしれないのでhost指定でMACアドレスとIPアドレスを指定しておく。(上の例ではカメラ1のMACアドレスが00:00:00:00:00:00でIPアドレスが192.168.128.70)。固定させたいIPアドレスはできれば上のrangeで動的に割り当てられる範囲の外にしたい。つまり固定用の範囲を広めに取ってrange(動的割当)の範囲は狭めにする。(上の例では 約/26 = IP63個と広めにしているがそんなに取る必要はない筈)

複数のNICがあるホストでDHCPサーバを動かす場合は動くインターフェイスを指定しておかないと例えば外向きで動作したら意味がないというか迷惑。
インターフェイスを確実に指定する。

/etc/default/isc-dhcp-server (変更)
INTERFACESv4="eth0" これは内向きNICがeth0の場合。
DHCPサービスを動かす。
$ sudo systemctl enable isc-dhcp-server   #サービス有効化
$ sudo systemctl start isc-dhcp-server    #サービス開始
$ sudo systemctl status isc-dhcp-server   #サービス稼働を確認

NVR Lan用ルーターでNTPサービスの設定を行う

NVRサーバにしろIPカメラにしろ「監視」を行うのであれば正しい時刻を記録することが重要。時刻合わせできるようにしなければならないので「NVR Lan」内で利用可能なNTPサーバを用意する。NTPサーバだけを建てるのも良いかもしれないがSBCやPCをLinuxルーターにするのであればそいつでNTPサーバを動かしてやるのがてっとりばやい。
最近のLinuxではChronyが標準で入っていてNTPクライアントとして動いていることが多いかも。そこで、そのChronyに設定を加えてNTPサーバにする。

/etc/chrony/sources.d/local-ntp-server.sources (新規作成/編集)
server 192.168.0.1 prefer
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

この例では192.168.0.1は「家庭Lan」のインターネット向けルーターで、そこで「家庭LAN」用メインのNTPが動いていることを想定している。他の3つはMFEEDの公開NTPサーバを指定している。

NVR LanにあるNVRサーバやIPカメラからNTPサーバにアクセス可能にする。

/etc/chrony/conf.d/allow.conf (新規)
deny 0.0.0.0/0
allow 192.168.128.0/24

ファイル名は *.conf であれば何でも良さそう。allowは許可、不許可ならdeny。
上の例では先にすべてのIPアドレスを不許可にした上で「NVR Lan」である 192.168.128.0/24 からのアクセスを許可指定している。ローカルホストである127.0.0.1はallowしなくても許可されるみたい。「みたい」が心配だったらallowとして書いておく方が良いかも。

$ sudo systemctl restart chrony    #サービス再起動
$ sudo systemctl status chrony     #サービス稼働を確認
$ sudo chronyc accheck 192.168.0.1 #家庭LanのIPアドレス等を確認
209 Access denied                  #アクセス拒否になることを確認
$ chronyc accheck 192.168.128.255  #NVR Lan用のIPアドレスの何かを確認
208 Access allowed                 #アクセス許可になることを確認

# 1〜5分待ってから

$ chronyc sources                  #上位NTPサーバとの時刻同期を確認

リゾルバ

NVR Lan向けリゾルバは省略。キャッシュ機能付きDNSリゾルバであるunboundでも入れておけば良いかと思われる。

ファイアウォールnftablesの設定

最近のLinuxではiptablesを装ってnftablesが入っているかもしれないが不完全な状態かもしれない。(よくわからない)
nftablesのパッケージをインストールするなら apt install nftables

/etc/nftables.conf (ベース部分)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/sbin/nft -f

flush ruleset

table inet filter {

    chain input {
        type filter hook input priority 0;  policy accept;
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
        ip daddr 192.168.128.0/28 accept
        ip saddr 192.168.128.0/28 accept
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }

}

どのチェーンに書くのかはどうでも良い気もするが、今回はforwardチェーンをデフォルトポリシーをdrop(破棄/遮断)にした上で、192.168.128.0/28 (192.168.128.0 - 192.168.128.15)を送信元あるいは送信先とするパケットをaccept(許可/受入)するルールを2行書いた。 あくまでもベースなのでこんな2行だが実際には運用するにはもう少し足す必要があるかも。 NIC別にチェーンを分けてルールを書くのは良いことだと思うが「頭がこんがらがる」ので単純なルーターではあまり複雑にしない方が良さそう。

nftablesを起動する。

$ sudo systemctl enable nftables    #サービス有効化
$ sudo systemctl start nftables     #サービス開始
$ sudo systemctl status nftables    #サービス稼働を確認

これで、「NVR Lan」用のルーターが完成。ただし、このルーターだけ作って喜んでると上手く行かなくて悩むことに。この記事で「家庭 Lan」としている側のネットワークにNVR Lan用の「静的ルートを追加」してやる必要があるので忘れない。(判っていてもこれが意外とアタマからすっぽ抜けてて上手く行かなくて悩むことになるのよね)

既存のネットワークに静的ルートを追加

家庭LanのルーターがLinuxなら

$ sudo route add -net 192.168.128.0 gw 192.168.0.16 netmask 255.255.0.0 eth1
とか 指定方法は複数。

家庭LanのルーターがFreeBSDなら
# route add -net 192.168.128.0 -netmask 255.255.255.0 192.168.0.16

192.168.128.0/24がNVR Lan、192.168.0.16が今回作ったルーターの外向き(家庭Lan向き)のIPアドレスとする。

もちろん、上のコマンドで作ったルートはシステムを再起動したら無くなるので適切な設定ファイルに静的ルートを書いておく。
その他の「家庭Lan」にあるホストも(NVR Lanに用があれば)同様に静的ルートを追加する。

「家庭Lan」用DHCPサーバがある場合

(今回作った「NVR Lan」用ルーターのDHCPサーバではなく)「家庭Lan」用のDHCPサーバに静的ルートを追加してしまえばDHCPでネットワーク設定を行うホストについては静的ルートを個別に設定してまわる面倒が無くて済む。DHCPオプションの設定追加だが書き方がちょっと特殊なのとDHCPサーバの種類によって設定の仕方が違うかも。(今回はisc-dhcpd)

/usr/local/etc/dhcpd.conf (変更/追加)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
option rfc3442-classless-static-routes code 121 = array of integer 8; #静的ルート 非Windows用
option ms-classless-static-routes code 249 = array of integer 8;      #静的ルート Windows用

subnet 192.168.0.0 netmask 255.255.255.0 {            #既存の設定
    range 192.168.0.196 192.168.0.223;                #既存の設定
    option time-offset 32400;  # Japan Standard Time  #既存の設定
    option routers 192.168.0.1;                       #既存の設定 デフォルトルートだが効かなくなるかも
    option broadcast-address 192.168.0.255;           #既存の設定
    option ntp-servers 192.168.0.1;                   #既存の設定
    option tftp-server-name "192.168.0.4";            #既存の設定
    option rfc3442-classless-static-routes 24, 192, 168, 128, 192, 168, 0, 16, 0, 192, 168, 0, 1; #静的ルート 非Windows用
    option ms-classless-static-routes 24, 192, 168, 128, 192, 168, 0, 16; #静的ルート Windows用
}
#後略

場所を分けて4行書く感じ。ネットワークアドレスの書き方が特殊でサブネットマスクの後にIPアドレスでピリオドではなくカンマ(コンマ)並べて書くことで複数書ける。

以上で「家庭Lan」と「NVR Lan」の2つのネットワークの間で通信できるようになった。ただし、怪しい中華カメラがNVRのLan外と通信できないよう192.168.128.0/28 (192.168.128.1 - 192.168.128.15)だけが家庭LANやインターネットと通信可能。
次回は、中華監視カメラをNVRサーバ(Windowsアプリ)に接続して映像を記録するという基本的なことをやる予定。

関連記事:
Up