はじめに
下記記事で 4GPi を使うことでルータを構築する方法が紹介されています。
このルータを活用して、 4GPi ルータに IP カメラ (ネットワークカメラ) を接続してオンラインストリーミングを行う方法をご紹介します。
オンラインストリーミングのシステムをいちから構築するのは大変ですが、SORACOM Relay というサービスを使用することで手軽にストリーミングを行うことができます。
本記事ではこの SORACOM Relay を使って ストリーミングなど、IP カメラの操作をしてみたいと思います。
SORACOM Relay とは
SORACOM Relay は RTSP 対応ネットワークカメラの映像・音声を、SORACOM 経由で安全にクラウドに転送できるサービスです。
ネットワークカメラにおいて標準的な RTSP によるシグナリング、RTP プロトコルによるメディアデータ転送に対応しているため、カメラへの SDK のインストールやファームウェアの変更なくクラウド連携を実現します。
SORACOM Relay 紹介ページ より引用
このサービスを使用すると手軽かつ安全にカメラ映像をクラウドに転送したりストリーミングを行ったりすることができるようです。
SORACOM Relay は現在 Limited Preview として提供されており、利用には申し込みが必要です
機器構成
- Raspberry Pi 4 modelB
- 使用 OS: Raspberry Pi OS (64bit) Bookworm
- micro SD カード (32 GB)
- 4GPi
- 標準 SIM カード (SORACOM Air)
- Raspberry Pi 用 AC アダプター (12V/2A)
- IP カメラ
- IP カメラ用 AC アダプター (12V/2A)
- カメラに PoE で給電する場合は別途 PoE スイッチングハブをご用意ください
システムの概要
本記事で構築するシステムは以下のような流れでストリーミングが実行されます。
・SORACOM Relay セッションの開始
・SORACOM クラウドから 4GPi ルータのポートにアクセス (今回はポート 55555)
・4GPi ルータのポートから IP カメラにパケット転送
・SORACOM クラウドに対して動画の配信
また、SORACOM Relay については API が用意されています。
こちらも使用して静止画を保存できるようにします。
システムの概要図は以下のようになります。
4GPi のセットアップ
以下の記事を参考に、4GPi のセットアップを行ってください。
APN 設定を行い、LTE 通信ができる状態になると 4GPi のステータス LED (青色 LED) が点滅します。
加えて、wwan0 に IP アドレスが割り当てられます。
mtx@raspberrypi-blog:~$ ip a show wwan0
4: wwan0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1430 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/none
inet 10.***.***.***/** brd 10.***.***.*** scope global noprefixroute wwan0
valid_lft forever preferred_lft forever
ルータ機能の構築
ufw の設定
パケット転送設定
パケットの転送を行うため、 ufw をインストールします。
$ sudo apt -y install ufw
4GPi の OS イメージでは ufw があらかじめインストールされています。
パケット転送の許可を行います。
net/ipv4/ip_forward=1
外部からの通信を許可する設定とルーティングを許可する設定を行います。
sudo ufw default allow incoming
sudo ufw default allow routed
ufw のステータスを確認し、上記設定が反映されていることを確認します。
mtx@raspberrypi:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), allow (routed)
New profiles: skip
To Action From
-- ------ ----
22 ALLOW IN Anywhere
22 (v6) ALLOW IN Anywhere (v6)
IP マスカレード設定
NAPT の設定を行い、wwan0 の IP アドレスへの書き換えを行うテーブルを追加します。
/etc/ufw/before.rules
に以下の記述を追加します。
# NAT Table rules
*nat
:POSTROUTING ACCEPT [0:0]
-F
-A POSTROUTING -s 10.20.0.0/24 -o wwan0 -j MASQUERADE
COMMIT
DHCP サーバーの設定
dnsmasq をインストールして DHCP サーバーの設定を行います。
sudo apt install dnsmasq
インターフェース eth0 から有線 LAN で接続したデバイスに対して IP アドレスを割り当てるようにします。
まずは eth0 の IP アドレスを固定します。
sudo nmcli c add type ethernet ifname eth0 ipv4.method manual ipv4.addresses 10.20.0.1/24
ethernet-eth0
というコネクションが作成されるのでこれを有効にします。
デフォルトの Wired connection 1
などのコネクションがある場合は削除もしくは無効化します。
sudo nmcli c delete "Wired connection 1"
sudo nmcli con up ethernet-eth0
eth0 が割り当てる IP アドレスの範囲を設定します。
/etc/dnsmasq.conf
に以下の記述を追加します。
interface=eth0
dhcp-range=10.20.0.2,10.20.0.40,255.255.255.0,24h
編集が終わったら dnsmasq を再起動します。
sudo systemctl restart dnsmasq
ポートマッピングの設定
外部から Raspberry Pi のグローバルアドレスの特定のポートにアクセスしたときにカメラの IP アドレスに転送するようにポートマッピングの設定を行います。
今回は Raspberry Pi の wwan0 のアドレスのポート 55555 にアクセスしたときに、カメラの IP アドレス 10.20.0.11 のポート554 に対して転送するような設定を行います。
iptable コマンドを使用して設定を行います。
sudo iptables -t nat -A PREROUTING -i wwan0 -p tcp --dport 55555 -j DNAT --to-destination 10.20.0.11:554
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
以上の設定でポートマッピングが行われるようになります。
ポートマッピングの動作確認
ポート55555 にアクセスしたときに 10.20.0.11:554 まで転送されているかの確認を行います。
SORACOM のオンデマンドリモートアクセスの機能を使用します。
オンデマンドリモートアクセスでデバイス (4GPi ルータ) のポート55555にアクセスする設定を作成します。
保存ボタンをクリックすると 4GPi ルータのポート55555 にアクセスするための IP アドレスとポートが発行されるのでそれをコピーします。
発行された IP アドレスとポートを使用して VLC でストリーミングが開始されるか確認します。
VLC media player から、ネットワークストリーミングを開くを選択します。
IPカメラの認証情報とIPアドレスを指定します。
ポートマッピングが正常にできていると カメラのIPアドレス:554
に転送され、VLC でも映像を確認することができます。
SORACOM Relay での動作確認
実際に SORACOM Relay を使用してストリーミングを開始します。
データの送信先には SORACOM が管理している Amazon Kinesis Video Streams があり、これを選択するとカメラの映像をリアルタイムで確認することができます。
今回はこれを使用してみます。
まずは Relay の画面から新規セッションを作成します。
次に映像配信に必要な情報を入力します。
接続先 SIM
: 4GPi ルータに使用している SIM の ID
ポート番号
: カメラのアドレスに転送するためにルータで待ち受けているポート、今回は 55555
ユーザー名
: IPカメラの RTSP サーバーに接続するためのユーザー名
パスワード
: IPカメラの RTSP サーバーに接続するためのパスワード
パス
: RTSP サーバーのパス、今回は /live/sub
転送先サービス
: 映像の転送先、今回は Amazon Kinesis Video Streams (ソラコム管理)
入力が終わったら作成ボタンをクリックしてセッションを開始します。
開始してしばらく待つとカメラの映像が表示されます。
SORACOM Relay API での操作
SORACOM Relay では API が提供されています。
カメラの映像のスナップショットをローカルに保存したり SORACOM Harvest Files に送信したりすることができます。
ストリーミングを続けていて通信容量が気になる場合などに便利です。
実際にこの API を使ってスナップショットを SORACOM Harvest Files に送信してみます。
このドキュメント を参考に事前に SORACOM API キーとトークンを発行しておきます。
発行した API キーとトークンを使用して API を実行します。
パラメータは先ほど Relay のセッションを作成したときと同じものを使用します。
IP カメラの認証も先ほどと同じく Basic 認証を使用します。
curl -X POST "https://api.soracom.io/v1/sims/<SIM ID>/downlink/rtsp" \
-H "X-Soracom-API-Key: <API キー>" \
-H "X-Soracom-Token: <トークン>" \
-H "Content-Type: application/json" \
-d '{
"command": "snapshot",
"port": 55555,
"path": "/live/sub",
"authentication": {
"type": "basic",
"username": "admin",
"password": "12345"
},
"options": {
"destinations": {
"harvestFiles": {
"filePath": "/relay/snapshots/{sim_id}_{time}.jpg"
}
}
}
}'
これを実行すると実行タイミングのカメラの映像が Harvest Files に保存されます。
上記コマンドだと /relay/snapshots
以下に SIM ID とタイムスタンプ付きのファイルで保存されます。
おわりに
SORACOM Relay サービスを使用することでIPカメラを手軽に扱えることが確認できました。
動画ファイルを Harvest Files や S3 に転送して画像解析などにも活用できると思うので参考にしていただければ幸いです。