ラズパイZEROとモーションセンサーで見守りシステムをつくる(その5 プログラムを動作させるまで) | そう備忘録

ラズパイZEROとモーションセンサーで見守りシステムをつくる(その5 プログラムを動作させるまで)

前回からのつづき

ラズパイとモーションセンサーで実家用の見守りシステムを構築した時の5回目。

モーションセンサーで検知した件数をLINEを通して見守り元に通知する。

また各種設定値をGoogleスプレッドシートから読み込んで通知時間などを変更することができる。

  • 初回の「全体構成とハードウェア編」はこちら
  • 2回目の「事前設定編」はこちら
  • 3回目の「AWS IoT CoreとDynamoDBの設定」はこちら
  • 4回目の「プログラムの説明」はこちら

プログラム作成まで終了したので今回はプログラムを動作させるまでの環境の設定についての記事とする。

具体的には、

  • プログラムのファイル・ディレクトリ構成
  • ファイルのアクセス権
  • ラズパイゼロをデスクトップからCLI(Command Line Interface)に変更
  • プログラムの自動起動
  • sshで外部から遠隔操作できるような設定

などについての記事とする。

尚、記事の最後に動画で説明をしているので参考にしてみてほしい。

第5回 今回の記事の範囲

プログラムのファイル・ディレクトリ構成

プログラムのファイル・ディレクトリ構成は以下の通り。

├─opt
│  │      
│  ├─WatchOver
│  │  │  WatchOver.py
│  │  │  initial.json
│  │  │
│  │  ├──cert
│  │  │    XXXXXXXXXX-certificate.pem.crt
│  │  │    XXXXXXXXXX-private.pem.key
│  │  │    AmazonRootCA1WatchOver.pem
│  │  │    watchoverproject-2019-XXXXXXXXXXXX.json
│  │  │
│  │  ├──csv
│  │  │    count_data.csv
│  │  │
│  │  └──log
│  │       error.log
│  │

/opt/WatchOverディレクトリ

プログラムをこのディレクトリに格納した。

ubuntuの説明で「主にサードパーティー製アプリのインストール先」で「自分で作成したアプリをインストールしてもOK」とあったのでここにディレクトリを作成してインストールすることにした。

2021年04月29日 追記

今回は /opt/ 配下に格納したが、特定のユーザからしか起動しないプログラムなので /usr/local/ への格納でも良かったのかも知れない。

WatchOver.py

プログラム本体

プログラム内容の説明はこちらの記事を参照

initial.json

初期設定ファイル

{
	"client_id": "RTRPZ0003",
	"awsport": 8883,
	"awscert": "./cert/XXXXXXXXXX-certificate.pem.crt",
	"awskey": "./cert/XXXXXXXXXX-private.pem.key",
	"awsroot_ca": "./cert/AmazonRootCA1WatchOver.pem",
	"awsend_point": "XXXXXXXXXXXXXX-ats.iot.ap-northeast-1.amazonaws.com",
	"gskey_name": "./cert/watchoverproject-2019-XXXXXXXXXXXX.json",
	"gssheet_name": "WatchOverSetting",
	"line_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

client_id

端末を一意に識別するClinet IDを指定する

awsport

AWS IoT Coreに接続時のポート番号

awscert

IoT Coreに接続するためのモノの証明書の保存先のPath

証明書等の取得方法は過去記事を参照

awskey

IoT Coreに接続するためのプライベートキーの保存先のPath

awsroot_ca

ルート CA 証明書の保存先のPath

awsend_point

AWSのエンドポイント

エンドポイントの取得方法は過去記事を参照

gskey_name

Googleスプレッドシートのサービスアカウントキーの保存先のPath

サービスアカウントキーの取得方法は過去記事を参照

gssheet_name

Googleスプレッドシートのシート名

line_token

LINE Notifyで発行されたアクセストークン

アクセストークンの取得方法は過去記事を参照

cert ディレクトリ

証明書類を格納するディレクトリ

XXXXXXXXXX-certificate.pem.crt

モノの証明書

XXXXXXXXXX-private.pem.key

プライベートキー

AmazonRootCA1WatchOver.pem

ルート CA

watchoverproject-2019-XXXXXXXXXXXX.json

Googleスプレッドシートのサービスアカウントキー

csvディレクトリ

CSVデータ保存用ディレクトリ

count_data.csv

過去30日間の10分間隔での検知件数のCSV

logディレクトリ

ログファイルを格納するディレクトリ

error.log

何らかの原因でプログラムが異常終了した時にエラー原因を書き出すCSVファイル

ファイルのアクセス権

プログラム類

ファイルのアクセス権は最小にしておいた方がリスクが少なくなる。

プログラムと初期設定ファイルをchmodコマンドで最小のアクセス権に変更した。

sudo chmod 400 initial.json
sudo chmod 400 WatchOver.py

プログラムのアクセス権

証明書など

certディレクトリに移動して証明書類も全て権限を変更した。

cd cert
sudo chmod 400 *.*

証明書のアクセス権

ラズパイゼロをデスクトップからCLIに変更

OSの初期設定はデスクトップだったが、そのままにしておくとリソースも余計に消費するのでブートオプションをCLI(Command Line Interface)に変更してインターフェースのVNCも無効にする。

この後はコマンドラインベースでの操作になる。

ブートをCLIに変更する

RaspberryPiのメニューから”Raspberry Piの設定”でシステムタブから、

  • ブートをデスクトップからCLIに変更する
  • 現在のユーザとしてログインするのチェックを外す

ブートをCLIに変更する

VNCを無効にする

インターフェースタブに移動してVNCを無効にする。

SSHは使うので有効のままにしておき、再起動を行えば次回からはCLIベースのラズパイになる。

VNCを無効にする

プログラムの自動起動

ラズパイのOSが起動した時に見守りシステムのプログラムが自動起動されるようにsystemdに設定する。

systemdの細かい設定については以前の記事を参照

Serviceファイルの作成

watch-over.serviceファイルを/etc/systemd/system/配下に作成する。

sudo vi /etc/systemd/system/watch-over.service
[Unit]
Description = WatchOver
After=network-online.target

[Service]
ExecStart=/usr/bin/python /opt/WatchOver/WatchOver.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

サービスのスタート

以下のコマンドでサービスをスタートする。

※スタートと自動起動は別

sudo systemctl start watch-over.service

ステータスの確認

以下のコマンドでサービスのステータスを確認する。

sudo systemctl status watch-over.service

この時、何らかのエラーが出ているときには/var/log/syslogを確認する。

今回はgspreadのModule Not Foundのエラーが出ていたのでプログラム中で明示的にPathを指定する様に修正を行っている(以前の記事参照

自動起動の設定

以下のコマンドでOS起動時にプログラムを自動起動するようにする。

また前述のServiceセクションで”Restart=always”としているので何らかの原因でプログラムが終了してしまったとしてもプログラムは再起動される。

sudo systemctl enable watch-over.service

プログラムの自動起動

sshで外部から遠隔操作できるように設定

ラズパイゼロは実家の両親の見守りに使おうと思っているので他県に設置する。

また両親にラズパイの操作は全く期待できないので遠隔で操作が出来る様に設定をしておく必要がある。

VPNの構築も考えたが両親の住居のルーターの機種の対応状況が分からないのでsshのポートフォワード(トンネリング)を使って遠隔ログインする事にした。

インターネット経由でssh接続できるサーバーを用意する必要があるがこのブログが入っているAWS EC2があるのでそれを使おうと思う。

sshポートフォワードによる遠隔操作

ラズパイからsshでポートフォワーディング

まずはラズパイ側からAWS EC2にsshで接続する。

この際に-R ‘port番号2:localhost:port番号3’とパラメーターを設定して接続すると接続先側(AWS EC2)で自分自身(localhost)にport番号2で接続すると接続元(ラズパイ)へport番号3で接続ができる。

つまりAWS EC2→ラズパイへの逆方向への接続が可能になる(トンネリング)。

プライベートキーのコピー

AWS EC2はセキュリティの為、パスワード認証によるssh接続は不可にしており秘密鍵、公開鍵を使う公開鍵暗号方式にしている。

AWS EC2に接続するための秘密鍵(privatekey_to_ec2.pem)をラズパイの/home/login名/.ssh/配下にコピーする。

.sshディレクトリが無い場合は作成する。

cd ~/
mkdir .ssh

privatekey_to_ec2.pemを.ssh配下にWinSCP等でコピー

権限を最小限に変更する。

cd .ssh
sudo chmod 400 privatekey_to_ec2.pem

sshで接続

下記のコマンドでラズパイからAWS EC2にssh接続する。

ラズパイ起動時に自動的にコマンドを自動実行する設定(systemd)は後述する。

ssh -o ExitOnForwardFailure=yes -o ServerAliveInterval=20 -o TCPKeepAlive=yes -N -p port番号1 -i /home/login名/.ssh/privatekey_to_ec2.pem -R 'port番号2:localhost:port番号3' login名2@52.197.230.xxx

-o ExitOnForwardFailure=yes

フォワード接続に失敗したら終了する

後ほど、systemdで終了時には再接続するように設定するので問題ない

-o ServerAliveInterval=20

20秒以内に接続確認ができないと終了する

デフォルトは0で「応答確認しない」なので明示的に秒数を指定して指定した秒数での接続確認を行うように設定する

-o TCPKeepAlive=yes

デフォルトはyesだが明示的に指定した

TCPKeepAliveメッセージをサーバーに送信するかどうかの指定。

Yesの場合、何らかの接続の切断があった時にサーバーに通知されのだが一時的なダウンでも接続が切断されてしまうので、あえてnoで運用しているケースもある模様。

一方、TCPKeepAliveメッセージが送信されない場合はセッションがサーバー上で無期限にハングしてゴーストユーザーが残ってサーバーリソースが消費されてしまう可能性がある

とりあえずyesで様子を見ることにした。

-N

対話シェル画面を出さない

-N無しで接続するとシェルが表示されて対話形式でコマンド入力を受け付ける画面になる

今回は裏で接続していれば良いだけなのでシェルを表示させない-Nを指定した

対話シェル

-p port番号1

AWS EC2にsshで接続する時のポート番号を指定する

EC2ではセキュリティの為、デフォルトの22からは変更している

またこのポート番号をAWSのセキュリティグループの設定で開けておく必要がある

-i /home/login名/.ssh/privatekey_to_ec2.pem

-iで秘密鍵を指定する

AWS EC2に接続する為の秘密鍵(事前にコピーしておく)

-R ‘port番号2:localhost:port番号3’

ポートフォワード接続

AWS EC2上でlocalhostに対してport番号2でssh接続をするとport番号3でラズパイにssh接続される

尚、ラズパイ側もデフォルトの22からポート番号3に変更している(変更した時の記事はこちら)

ポート番号はユーザが自由に使える49152~65535番の任意の番号を割り当てている

login名2@52.197.230.xxx

login名2:AWS EC2のログイン名

52.197.230.xxx:AWS EC2のIP Address

名前解決をしていればドメイン指定でもOK

AWS EC2にpuTTYで接続する

まずはAWS EC2にターミナルソフト(puTTY)で接続する。

その後、AWS EC2上で自分自身(locahhost)にポート指定で接続する以下のコマンドを実行するとラズパイに接続することになる。

自分のパソコン→AWS EC2→ラズパイと接続される。

尚、ラズパイ側も公開鍵暗号方式にしているので接続時にパスフレーズを聞かれるので入力する。

ssh -p ポート番号2 -i /home/login名/.ssh/privatekey_to_rasppizero.pem login名@localhost

-p ポート番号2

前述のポート番号2を指定する

EC2のlocalhostのポート番号

-i /home/login名/.ssh/privatekey_to_rasppizero.pem

AWS EC2上の.sshディレクトリにラズパイの秘密鍵ファイル(privatekey_to_rasppizero.pem)を保存しておく

Raspbianはデフォルトでは公開鍵暗号方式では無くパスワード認証なのでデフォルトの設定のままであればこのパラメーターは不要

セキュリティを高めるためにラズパイゼロのsshを公開鍵暗号方式に変更している

変更方法に関する記事はこちら

login名@localhost

ラズパイへのログイン名

デフォルトのpiからは変更している

変更方法の記事はこちら

ラズパイゼロへ接続

ラズパイゼロへ接続される。

ラズパイゼロへの接続

自動起動の設定

ラズパイからAWSへのssh接続は常時接続させておく必要がある。

何らかの原因でssh接続が切れてしまった時やラズパイを遠隔で再起動した時に自動的にssh接続されるようにしておきたい。

前述のプログラムの自動起動と同様にsystemdのserviceを登録する。

Serviceファイルの作成

ssh-to-ec2.serviceファイルを/etc/systemd/system/配下に作成する。

sudo vi /etc/systemd/system/ssh-to-ec2.service
[Unit]
Description = Connect to EC2 with ssh
After=network-online.target

[Service]
ExecStart=/usr/bin/ssh -o ExitOnForwardFailure=yes -o ServerAliveInterval=20 -o TCPKeepAlive=yes -N -p port番号1 -i /home/login名/.ssh/privatekey_to_ec2.pem -R 'port番号2:localhost:port番号3' login名2@52.197.230.xxx
User=login名
Restart=always
Type=simple
RestartSec=30s

[Install]
WantedBy=multi-user.target

User=login名としているのは秘密鍵ファイルのアクセス権を400に変更しているので特定のlogin名でしか読み取ることができないので指定している。

自動起動

プログラムの時と同様にスタートしてステータスを確認して問題がなければ自動起動の設定をする。

また”Restart=always”としているので何らかの原因でsshが切断されてしまっても再接続される。

sudo systemctl enable ssh-to-ec2.service

続く

以上でプログラム周りの環境設定は終了する。

次回はラズパイゼロ、モーションセンサーを納める外箱を100均のMDF材で作る記事とする。

動画

この記事の内容を動画で説明している。

systemdによる自動起動

まずはsystemdによる自動起動。

遠隔操作の為のポートフォワードsshの設定

自宅からプライベートネットワーク内のラズパイを遠隔操作する為にsshのポートフォワード設定を行った時の動画。

セッションが切れても自動的に再接続するようにsystmdの設定も行っている。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。