remote.itを使ってRaspberry Piをネットワークカメラにする

# はじめに
本記事は[Qiita Engineer Festa 2022](https://qiita.com/official-campaigns/engineer-festa/2022)の[remote.it を使って○○に接続してみた！](https://qiita.com/official-events/8a2ab08f6fa0f093ae39)に関する記事になります。

[remote.it](https://www.remote.it/)は自宅や工場など遠隔地に存在するエッジデバイスに対して、LAN環境のネットワーク設定を変更することなく、リモート接続ができるサービスです。

前回はウォークスルーとしてremote.itを使ってベアメタルに接続してみました。
前回の記事については[remote.itを使ってベアメタルに接続する](https://qiita.com/Brutus/items/81b950119800cfd9599b)を参照。

今回は応用としてRaspberry Piにremote.itを導入して、ネットワークカメラとして使います。

## ネットワークカメラ
本記事ではRaspberry Pi + カメラモジュール + 焦電型赤外線センサーを組み合わせてネットワークカメラを構築しています。

![IMG_3996.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7e78b2b7-85bb-1d90-bb31-16e8513d2dad.jpeg)

**焦電型赤外線センサー**[^1]によって検知した人や動物などの画像を保存します。
保存された画像については、以下のようにUIを実装しているのでブラウザから確認することがでます。

また、**remote.it**を活用することによって、インターネット経由で監視可能なモニタリングシステムが実現できます。

![スクリーンショット 2022-07-18 18.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ecc45afc-aacf-4c86-fc7e-435e1da8c26d.png)

:::note
Raspberry Pi 3 Model B+や、Raspberry Pi 4はPoEに対応しています。PoE HATのパーツを使用することでPoE対応機器からLANケーブルでの給電ができるため、屋外でも利用することができます。
:::

[^1]: 周囲の人や動物から発せられる赤外線（熱）を検知します。また、動きのある熱源に反応して出力を行います。最大検知距離は気温等の環境条件により、8mほどです。

## remote.itの接続
接続するためのアプリケーションが決定していて、remote.itのアカウントも作成済みになるので必要な作業は以下になります。

- [ ] パッケージのインストール
- [ ] デバイス及びサービスの登録
- [ ] remote.itの接続

以降、Raspberry Piにremote.itを導入するための手順について記載しています。

### パッケージのインストール
remoteitのパッケージをインストールするためには以下のコマンドを実行します。

`$ sudo apt install remoteit`

<details><summary>出力例</summary>

```console
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  python-colorzero vlc-l10n vlc-plugin-notify vlc-plugin-samba vlc-plugin-video-splitter vlc-plugin-visualization
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  jq libjq1 libonig5
以下のパッケージが新たにインストールされます:
  jq libjq1 libonig5 remoteit
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 22 個。
420 kB のアーカイブを取得する必要があります。
この操作後に追加で 982 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://archive.raspberrypi.org/debian buster/main armhf remoteit armhf 4.14.1 [91.6 kB]                                                           
取得:2 http://ftp.udx.icscoe.jp/Linux/raspbian/raspbian buster/main armhf libonig5 armhf 6.9.1-1 [150 kB]                                                
取得:3 http://ftp.udx.icscoe.jp/Linux/raspbian/raspbian buster/main armhf libjq1 armhf 1.5+dfsg-2+b1 [119 kB]                                      
取得:4 http://ftp.udx.icscoe.jp/Linux/raspbian/raspbian buster/main armhf jq armhf 1.5+dfsg-2+b1 [59.3 kB]                                        
420 kB を 2秒 で取得しました (187 kB/s)
以前に未選択のパッケージ libonig5:armhf を選択しています。
(データベースを読み込んでいます ... 現在 96803 個のファイルとディレクトリがインストールされています。)
.../libonig5_6.9.1-1_armhf.deb を展開する準備をしています ...
libonig5:armhf (6.9.1-1) を展開しています...
以前に未選択のパッケージ libjq1:armhf を選択しています。
.../libjq1_1.5+dfsg-2+b1_armhf.deb を展開する準備をしています ...
libjq1:armhf (1.5+dfsg-2+b1) を展開しています...
以前に未選択のパッケージ jq を選択しています。
.../jq_1.5+dfsg-2+b1_armhf.deb を展開する準備をしています ...
jq (1.5+dfsg-2+b1) を展開しています...
以前に未選択のパッケージ remoteit を選択しています。
.../remoteit_4.14.1_armhf.deb を展開する準備をしています ...
remoteit (4.14.1) を展開しています...
libonig5:armhf (6.9.1-1) を設定しています ...
libjq1:armhf (1.5+dfsg-2+b1) を設定しています ...
jq (1.5+dfsg-2+b1) を設定しています ...
remoteit (4.14.1) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/connectd.service → /usr/lib/systemd/system/connectd.service.

--------------------- Claim this device ---------------------

Use the code xxxxxxxx to register this device to your account

--------------------- Claim this device ---------------------

man-db (2.8.5-2) のトリガを処理しています ...
libc-bin (2.28-10+rpt2+rpi1) のトリガを処理しています ...
```

</details>

### デバイスの登録
デバイスの登録を行うために「Devices」から「Linux & Raspberry Pi」を選択し、「CLAM CODE」にパッケージインストール後に出力されるコードを入力します。

![スクリーンショット 2022-06-29 1.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/18d98cf0-fba0-1911-d33a-19bf8a8a31b9.png)

正常に登録が確認できた場合、以下のように表示されます。
STATUSがOnlineと表示されているので、ターゲットについて正しく認識されていることが確認できます。

![スクリーンショット 2022-06-29 1.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/3eeb9d44-6835-b689-6792-d468c44fa3e7.png)

### サービスの登録
リモートからHTTP接続するためにサービスを登録します。
以下の例ではWeb UIから登録しています。

はじめに、「+」を押してサービスの登録画面を表示します。
Add serviceの画面に遷移後、「SERVICE TYPE」は「HTTP」を選択し、「SERVICE PORT」に使用するポート番号を入力します。
最後に設定値を確認して「SAVE」を押して保存します。

![スクリーンショット 2022-07-18 20.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/13d9775a-2e28-ce4b-1a83-7e1a785c596a.png)

### remote.itの接続（Proxy）
検証としてProxy接続を行ないます。
先ほど作成したサービスを選択した状態で、「CONNECT + LAUNCH」を押します。

![スクリーンショット 2022-07-18 20.20.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cf64556c-43e1-fde2-33ba-6c932b38f705.png)

接続用のリンクが生成されるため、コピーします。

![スクリーンショット 2022-07-18 20.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4af5da9f-4939-38fd-2b80-a3d7d9832a1e.png)

接続用のリンクをブラウザにペーストしてアクセスを行います。
以下の例ではアプリケーションに認証機能を実装しているため、認証画面が表示されていることが確認できます。

![スクリーンショット 2022-07-18 18.12.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/eaa2f6ad-d643-7cde-5f98-d0a45e653083.png)

:::note alert
Proxy接続の場合、URLが分かると誰でもアクセスできてしまうため、利用する場合は注意が必要です。そのため、本記事では登録するサービスのアプリケーションに対して認証機能を実装しています。
:::

### remote.itの接続（P2P）
上記、remote.itの接続（Proxy）を踏まえて、より安全に接続を行うためにP2Pを利用して接続します。

P2Pで接続するためためには接続するためのクライアントとなるソフトウェアが必要です。
クライアントの導入方法については以前書いた[remote.itを使ってベアメタルに接続する - クライアントのインストール](https://qiita.com/Brutus/items/81b950119800cfd9599b#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参照。

以下の例ではMacのクライアントからP2Pで接続する場合の例になります。
P2Pの場合、Connectionが**Pear to pear**と表示されていることが確認できます。

![スクリーンショット 2022-07-18 18.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6fe58e03-bdcf-65be-a44a-09acfe028d78.png)

:::note
セキュリティとパフォーマンスの観点からPeer to Peer（P2P）接続が推奨されています。
:::

再度、新規に生成されたリンクをブラウザにペーストしてアクセスを行います。
リモートからアプリケーションに接続できるため、ネットワークカメラとして機能し、検知した物体を確認することができます。

![20220718-17_57_55.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/674bc28d-24a5-28d7-b1a6-fbc2a7aec044.jpeg)

# おわりに
ネットワークカメラは育児、介護、ペットなど社会課題に対して効果的なソリューションです。
Raspberry Piなど安価なコンピュータと、remote.itのようなサービスを組み合わせることで身近な課題を解決できると思います。