アムニモ の エッジゲートウェイで Nx Witness と remote.it を使った監視カメラシステムを構築

# はじめに
Nx Witnessを使用して自宅に監視カメラシステムを構築します。自宅外から自宅のネットワーク機器に接続してカメラ映像を確認するには「NAT越え」が必要になります。[Nx Witness Cloud](https://nxvms.com/) のサービスを利用することでルータのDNAT設定が不要となり比較的簡単に「NAT越え」を実現できますが、ポート開放などは必要で構築が少々面倒でした。
そんな中、ポート開放が不要でセキュアなP2P接続が行える remote.it というサービスを教えてもらいました。Nx Witnessにも対応しているとのこと。アムニモ の エッジゲートウェイとこちらを組み合わせて試してみました。
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/a21a405e-0ff9-e6de-764b-e049c70a43fc.png)
``エッジデバイス``：ネットワークカメラ映像の保存、検索、イベント処理などを行う。
``ネットワークカメラ``：ネットワークに接続されたPoEカメラ。
``閲覧用PC``：エッジデバイスの映像閲覧用。(Windows/Ubuntu Linux/Mac OS など)
``スマートフォン``：エッジデバイスの映像閲覧用。(iPhone/Android)


## アムニモ の エッジゲートウェイ とは
[Edge Gateway amnimo Gシリーズ AG10](https://amnimo.com/service/edge_gateway/) は、amnimo(アムニモ)社が販売する 高性能で堅牢性に優れた産業用LTEゲートウェイ です。特に監視カメラのシステム構築に適した設計になっています。以下、[amnimo ウェブページ](https://amnimo.com/service/edge_gateway/)からの抜粋。

- ARM製DualコアCPU（1GHz）／大容量なRAM（2GB）／eMMC（32GB）を搭載
- Ubuntu Linux OSを採用（カスタムアプリを容易に開発可能）
- Ethernetポートを5ポートもち、うち４ポートはPoEに対応
- USB 2.0、RS-232、デジタルI/O（入力4点、出力2点）のインターフェイスを装備
- 最大2TBのSSDを搭載（長時間大容量ビデオデータを保存可能）

``エッジデバイス``には Windows、Ubuntu Linuxなど、様々なOSのデバイスを使用することができますが、今回はこの [Edge Gateway amnimo Gシリーズ AG10](https://amnimo.com/service/edge_gateway/) の他に、[Jetson Nano Developer Kit](https://developer.nvidia.com/embedded/jetson-nano-developer-kit)、[Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) を加えた3種類のボードで試してみます。
(Edge Gateway amnimo Gシリーズ AG10 は LTEゲートウェイ としてもインターネットに接続可能ですが、今回は他のボード同様、ルータ経由でインターネットに接続します)


## Nx Witness とは
[Nx Witness](https://www.networkoptix.com/nx-witness/) は NetworkOptix社が提供するビデオマネージメントシステム(VMS)です。
VMSはカメラで撮影した映像の表示、録音、再生、検索を制御するソフトウェアです。「映像監視ソフトウェア」、「録画映像統合管理システム」などと呼ばれることもあります。

VMSを使うことで、例えば以下のようなことができるようになります。

- 各拠点に設置してあるカメラの映像を一括管理して中央管理システムを構築する
- センサーやアラームと連携して、映像データと紐づけを行う
- 画像解析システムと連携して、顔認証を行う
- 保存された映像データの中から必要な情報を検索する

**Nx Witness Server** ： カメラ映像の保存や、イベントの発生を検出するソフトウェアです。30日の無料トライアルライセンスで全機能を使うことができます。また、録画機能が不要な場合(Live映像の閲覧で使うなど)はライセンス無しで試すこともできます。``エッジデバイス``にインストールして使用します。

**Nx Witness Client** ： カメラ映像の閲覧や、Nx Witness Server を操作するためのソフトウェアです。無料で使用できます。``閲覧用PC``にインストールして使用します。``スマートフォン``向けには Nx Witness Mobile が用意されています。

ソフトウェアは [こちら](https://nxvms.com/download/windows) からダウンロードできます。


## remote.it とは
[remote.it](https://remote.it) はグローバルIPアドレスやポート開放を必要としないセキュアなP2P接続を提供するサービスです。

以下、オフィシャルサイトです。英語サイトの方が情報量が多いので、必要な情報が見つからない場合は英語サイトも覗いてみてください。
https://remote.it/  (英語サイト)
https://remote.it/jp/  (日本語サイト)

remote.it は個人使用目的で10台以下のデバイス接続であれば誰でも無料で使用できます。詳しくは [フェアユースポリシー](https://remote.it/fairuse/) を参照ください。

remote.it は ``エッジデバイス``にインストールして使用します。

ソフトウェアは [こちら](https://remote.it/downloads/) からダウンロードできます。


# 環境構築
では、[Edge Gateway amnimo Gシリーズ AG10](https://amnimo.com/service/edge_gateway/) 、[Jetson Nano Developer Kit](https://developer.nvidia.com/embedded/jetson-nano-developer-kit)、[Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) を使って、実際に環境を構築していきましょう。

## Nx Witness Server のインストール
``エッジデバイス``に Nx Witness Server をインストールします。使用するボードに合ったソフトウェアをインストールしてください。

### Edge Gateway amnimo Gシリーズ AG10 の場合
Nx Witness Server がプリインストールされているため、インストールは不要です。
もし Nx Witness Server をアインインストールしてしまった場合は下記コマンドで再インストールできます。

``` bash
$ sudo apt install networkoptix-mediaserver
```

### Jetson Nano Developer Kit の場合
[こちら](https://nxvms.com/download/arm) から「NVIDIA Jetson / ARM64 - Server installer」をダウンロード&インストールします。以下は``エッジデバイス``上でのコマンド実行例です。(URLやソフトウェアバージョンは最新のものを使用してください)

``` bash
$ curl -LkO https://updates.networkoptix.com/default/31398/arm/nxwitness-server-4.1.0.31398-linux_arm64.deb
$ sudo apt install ./nxwitness-server-4.1.0.31398-linux_arm64.deb
```

### Raspberry Pi 4 の場合
Raspberry Pi 4 を使用する場合は、使用しているOSによってインストールするソフトウェアが異なるので注意してください。32bit版を使用している場合は、[こちら](https://nxvms.com/download/arm) から「Raspberry Pi / ARM32 - Server installer」をダウンロード&インストールします。以下は``エッジデバイス``上でのコマンド実行例です。(URLやソフトウェアバージョンは最新のものを使用してください)

``` bash
$ curl -LkO https://updates.networkoptix.com/default/31398/arm/nxwitness-server-4.1.0.31398-linux_arm32.deb
$ sudo apt install ./nxwitness-server-4.1.0.31398-linux_arm32.deb
```


## Nx Witness Client のインストール
``閲覧用PC``に Nx Witness Client をインストールします。使用するPCに合ったソフトウェアを下記リンクからインストールしてください。

- [Windows](https://nxvms.com/download/windows)
- [Ubuntu Linux](https://nxvms.com/download/linux)
- [Mac OS](https://nxvms.com/download/macos)
- [ARM](https://nxvms.com/download/arm)

注意：[Jetson Nano Developer Kit](https://developer.nvidia.com/embedded/jetson-nano-developer-kit) に Nx Witness Client をインストールする場合は、Ubuntu Linux ではなく、ARM のリンク先から「NVIDIA Jetson / ARM64 - Client installer」を選択してください。([Jetson Nano Developer Kit](https://developer.nvidia.com/embedded/jetson-nano-developer-kit) に Nx Witness Server と Nx Witness Client の両方をインストールすることも可能)


## Nx Witness の設定
``エッジデバイス``にインストールした Nx Witness Server は、「新しいサーバー」の設定をするまで使用できません。
「新しいサーバー」の設定は``閲覧用PC``にインストールした Nx Witness Client から行います。

### 言語設定
最初に Nx Witness Client を起動し、日本語設定に変更します。左上のメニューから日本語への言語設定変更可能です。
![言語設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/7a91d047-f55b-5207-7bd0-dfeaa4ca9fb9.png)

### 「新しいサーバー」の設定を行う
``閲覧用PC``と``エッジデバイス``が同一ネットワークにいる場合、``エッジデバイス``は以下のように「新しいサーバー」として見えます。
![新しいサーバーの設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/d48240d4-0ddc-1d6a-af9c-7de54566c0fe.png)

「新しいシステムをセットアップします」を選択。
![新しいサーバーの設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/4c055106-067e-ffc8-65c3-944c2de27376.png)

システム名を入力します。(好きな名前を入力してOKです)
![新しいサーバーの設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/e0275d76-9851-e714-96fc-1a345178eda9.png)

Nx Witness にログインする管理者パスワードを設定します。
![新しいサーバーの設定4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/f4c53ef0-9560-ac59-3c12-89798039a5d4.png)

設定が完了すると以下の完了画面が表示されます。
![新しいサーバーの設定5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/241206f3-24a1-7e48-836e-ee5d3c9fa29a.png)

この画面が表示されたら設定完了です。
![新しいサーバーの設定6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/419b5ff0-1f02-da68-e631-0acf1a57e279.png)

### カメラ設定
画面左に同一ネットワーク上の``ネットワークカメラ``の一覧が表示されます。カメラ設定から``ネットワークカメラ``にログインするためのログイン名とパスワードを入力します。(ネットワークカメラ側のログイン名、パスワードがデフォルト値のままの場合、そのまま映像が見れる場合があります)
![カメラ設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/da2177a5-0636-ba1e-8855-8f62de3b5c72.png)


少し待つとカメラアイコン上の鍵マークが外れ、カメラ映像が見れるようになります。
![カメラLIVE画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/8d512afc-3845-dae9-0ff1-f4a153f53803.png)

これで、同一ネットワーク上(自宅ネットワーク内)からは Nx Witness を使ってカメラ映像が確認できるようになりました。
次は、remote.it を使って、自宅外からも Nx Witness Server にアクセスできるようにしていきます。


## remote.it アカウント取得
先ずは remote.it のアカウントを取得します。下記URLの画面右上にある「Sign up」をクリックし、アカウントを作成してください。
(@masa-e さんの [こちら](https://qiita.com/masa-e/items/f8fb6ae5c79142657a8a) の記事が参考になります。)

https://remote.it/
![remote.it_sign_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/acb1cde4-037b-0bc1-ab51-108138af65c9.png)


## remote.it のインストール
``エッジデバイス``に remote.it をインストールします。使用するボードに合ったソフトウェアをインストールしてください。

### Edge Gateway amnimo Gシリーズ AG10 の場合
remote.it がプリインストールされているため、インストールは不要です。(FW 1.2.0よりプリインストールされるようになりました。)

### Jetson Nano Developer Kit の場合
[remote.it のダウンロードページ](https://remote.it/downloads/) から、CLI の「remote.it CLI Debian ARM64」をダウンロード&インストールしてください。

![remote.itインストールARM64_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/f7c9a1fe-4dfe-4ec1-0a8d-48ffc57f7fc0.png)

以下は``エッジデバイス``上でのコマンド実行例です。(URLは最新のものを使用してください)

``` bash
$ curl -LkO https://downloads.remote.it/cli/latest/remoteit_linux_arm64
$ sudo cp ./remoteit_linux_arm64 /usr/bin/remoteit
$ sudo chmod +x /usr/bin/remoteit
```

remote.it が正しくインストールされたことを確認します。

``` bash
$ sudo remoteit version
1.6.36
```

### Raspberry Pi 4 の場合
Raspbian / Raspberry Pi OS Buster以降（32ビットまたは64ビットバージョン）を使用している場合は、以下の手順でインストールできます。

``` bash
$ sudo apt update 
$ sudo apt install remoteit
```
詳しくは [こちら](https://support.remote.it/hc/en-us/articles/360047542051-Installing-remoteit-on-a-Raspberry-Pi-running-Raspbian-or-Raspberry-Pi-OS) を参照ください。


## remote.it の設定
``エッジデバイス``上でコマンドを実行します。
最初に必要なツールをインストールします。(Edge Gateway amnimo Gシリーズ AG10 の場合はFW 1.2.0よりツールのインストールは不要になりました。)

``` bash
$ sudo remoteit agent install
$ sudo remoteit tools install
```

次に remote.it へのサインインを行います。「remote.it アカウント取得」で入手したアカウント情報を入力します。

``` bash
$ sudo remoteit signin --user <remote.it username> --pass <account password>
```

続いて、デバイスの登録を行います。デバイス名には何を設定してもOKです。後で見たときに分かりやすい名前にしましょう。

``` bash
$ sudo remoteit register --name <name of your device>

# 設定例
#  今回は分かりやすいように Nx Witness に設定したシステム名と同じ名前にする。
$ sudo remoteit register --name amnimo_GW_d-kato
```

必要なサービスを追加します。今回は Nx Witness 用のサービスを追加します。Nx Witness の \<connection type\> は``37``です。

``` bash
$ sudo remoteit add --name <service name> --port <port> --type <connection type>

# 設定例
#  <service name> の名前は何でもOK。今回は分かりやすいように nx-witness にしておく。
#  <port> には Nx Witness で使用するポート番号を設定。デフォルトは7001。
#  <connection type> には Nx Witness のIDである 37 を設定。
$ sudo remoteit add --name nx-witness --port 7001 --type 37
```
その他サービスのを登録したい場合は、下記を実行すると対話式でサービスを選択できます。

``` bash
$ sudo remoteit add
```

これで設定は完了です。


# remote.it を使って NAT越え
remote.it を使って``エッジデバイス``にインストールした Nx Witness Server に接続してみます。

## デスクトップアプリを使って接続
``閲覧用PC``が Windows または Mac OS の場合、デスクトプアプリを使用するのが便利です。
[remote.it のダウンロードページ](https://remote.it/downloads/) の Desktop Applications から、使用するPCに合ったソフトウェアをインストールしてください。

![remote.itインストール_デスクトップアプリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/f13f84dd-f1ee-bb38-4a87-6f6395134844.png)

以下、Windows版デスクトップアプリの画面で操作説明します。
remote.it デスクトップアプリを起動します。初回起動時は remote.it のアカウントでサインインが必要です。(以降は設定画面からサインアウトするまで入力不要)
![デスクトップアプリ_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/50e04d12-0a0e-2d1d-0ae0-c87ecf8b40bd.png)

画面に登録済みのデバイスが表示されます。
![デスクトップアプリ_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/47f63b8b-fd74-8b82-c9db-a40b1a3ff1a4.png)

デバイスを選択すると、サービスの一覧が表示されます。nx-witness の CONNECT をクリック。
![デスクトップアプリ_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/6cda55e4-ae6e-a31e-a339-488e8909ced8.png)

接続が完了すると以下のように画面が変わります。サービス名の下に表示されているのが接続に必要なアドレスとポート番号です。サービス名の隣に雲のマークがついている場合は Connection type が proxy 接続であることを意味します。(マークが無い場合は Peer to peer 接続です)
![デスクトップアプリ_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/64bccf5f-4bb5-c599-64e3-27e43432e8d2.png)

Connection type は、[Edit device] -> [Edit service] から変更することができます。デフォルトは「Peer to peer with proxy failover」となっており、Peer to peer 接続失敗時に Proxy 接続を試みます。
![デスクトップアプリ_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/cf0a8108-928a-527b-5631-1fd82fa1e84a.png)

次に、``閲覧用PC``の Nx Witness Client を起動し、「他のサーバーに接続...」をクリックします。
![他のサーバに接続1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/2de1078f-72ff-a113-1ac4-4eab947fddee.png)

先ほど表示されたアドレスとポート番号を入力。「新しいサーバーの設定」時に設定した Nx Witness のパスワードを入力して「OK」ボタンをクリック。
![他のサーバに接続2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/68e46100-5555-e578-b7d3-d6519ff04118.png)

以上で自宅外からでもアクセスが可能になりました。


## ウェブページを使って接続
デスクトップアプリを使用せずに、ウェブページを使って接続することもできます。
remote.it のウェブポータルからサインイン。
https://remote.it/
![remote.it_sign_in.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/1387bf81-d4f3-57fd-c249-dad6fd03acc4.png)

登録したデバイスの名前が表示されるので、「Connect」ボタンを押します。登録済みのサービスのリストから nx-witness を選択します。
![remote.itポータル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/0a028edd-a69c-d411-1ad4-c93c5d62102a.png)

サービス接続に必要なアドレスとポート番号が表示されます。デスクトップアプリでの接続と同様、Nx Witness Client の「他のサーバに接続...」からアドレスとポートを設定してください。(アドレスとポート番号はConnect毎に生成されます。使用していないコネクションは時間が経過すると自動的にクローズされます。)
![remote.itポータル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/854b9087-62ed-6629-fb16-9ba064088e4e.png)


## モバイルアプリを使って接続
スマートフォンから接続する場合、モバイルアプリを使用するのが便利です。下記2つのアプリをインストールしてください。

- Nx Witness Mobile ([iOS版](https://apps.apple.com/jp/app/nx-witness-mobile/id1050899754)、[Android版](https://play.google.com/store/apps/details?id=com.networkoptix.nxwitness))
- remote.it ([iOS版](https://apps.apple.com/jp/app/remote-it/id1437569166)、[Android版](https://play.google.com/store/apps/details?id=com.remoteit))

以下、iOS版アプリの画面で操作説明します。
remote.it アプリを起動します。初回起動時は remote.it のアカウントでサインインが必要です。(以降は設定画面からサインアウトするまで入力不要)

|![remote.itアプリ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/578409ce-47ae-675e-2cc6-c1282785baed.png)|
|:-:|

画面下のDevicesボタンをタップすると、登録済みのデバイスが表示されます。

|![remote.itアプリ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/bbf7576e-6b27-6752-f2ee-969d7d665b98.png)|
|:-:|

デバイスを選択すると、サービスの一覧が表示されます。作成したサービスの nx-witness を選択。

|![remote.itアプリ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/7394ce8d-ca8e-91c0-7505-dcc83af2832a.png)|
|:-:|

Connectボタンをタップ。(ここで右上の☆のマークをタップしておくと、ショートカットに登録され、次回からの接続が楽になります。)

|![remote.itアプリ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/50cd2c47-05d8-82b3-0bad-fe9f8f0c191f.png)|
|:-:|

初めて接続する際はパスワードを要求されるので、Nx Witness Server に設定した username(admin)とパスワードを入力し、Launch をタップ。(次回からは入力不要。Launch せずに、アドレスとポート番号を表示させることも可能)

|![remote.itアプリ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/917ee63a-33e4-3b89-c8e0-bcab05bbe6ee.png)|
|:-:|

Nx Winess Mobile が自動的に起動し、カメラ映像を見ることができます。

|![NxWitnessアプリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776740/375a7a90-c3eb-188b-cd7c-6d2a2570e125.png)|
|:-:|

以上、とても簡単にアクセスできました。
2回目からはショートカットに登録したボタンを押すことで、さらに簡単に接続できます。

# 使ってみた感想
**Edge Gateway amnimo Gシリーズ AG10**
- PoE給電のネットワークカメラを直接接続できるのが便利。(PoEハブが不要)
- ファンレスなのに長時間動作させても熱くならない。
- 内蔵のSSDがあるので映像の保存先に困らない。
- 個人で使用するのは難しい。企業向け。

**Jetson Nano Developer Kit　&　Raspberry Pi 4**
- 入手が容易。気軽に監視カメラシステムを試せる。
- PoEカメラを使うなら、別途PoE給電用のハブが必要。USBカメラならいけそう。
- 映像の保存先がSDだと長期使用時に心配。録画するなら別ストレージが必要かも。
- Jetson Nano はAIと絡めると面白そう。その場合は別途熱対策が必要。
- Raspberry Pi 4 は長時間使用するなら別途ファンや放熱ケースが必要。

録画をせずに個人用途で使うなら Jetson Nano Developer Kit、Raspberry Pi 4 。ビジネス用途なら Edge Gateway amnimo Gシリーズ AG10 といった感じ。

**Nx Witness**
- 直感的に操作できるユーザーインターフェイスで、マニュアルを読まずに操作できた。
- 複数のカメラ映像を分割表示可能。レイアウトも自由で自分好みの表示画面が作れる。
- モーション検知の機能で録画データの中から特定エリアの変化を検索できる。
- イベントルールを自分で作成でき、特定の条件下で実行したい処理を設定できる。(メール送信など)

**remote.it**
- 特別な機器やポート開放も不要なので環境の構築がとても簡単。
- P2P接続失敗時は自動でProxy接続に切り替わるのでほとんどの環境で接続可能。(設定変更可能)
- 個人利用や企業での導入検討の用途だと無料のため、気軽に試せる。(無料すごい)
- モバイルアプリのアプリ間連携(Launch)が便利。(アドレス等のコピペが不要)