Edited at

3GPi Ver.2とslee-Pi2を使用して、SMS着信でラズパイ遠隔起動~シャットダウン

More than 1 year has passed since last update.

3GPi Ver.2とslee-Pi2を使用して、SMS着信でラズパイ遠隔起動~シャットダウン


はじめに

今回、メカトラックスさんからslee-Pi 23GPi Ver.2をお借りすることが出来ましたので、ラズパイ3のSMS着信起動を試します。

着信起動デモ動画はメカトラックスさんがYoutubeで公開しておられます。

着信起動デモ動画

これを手元でやってみるというのが本記事のヘソです。

さて、slee-Piはラズパイ用の電源制御・RTCモジュールです。ラズパイの電源をタイマー制御したり、フリーズしたラズパイにリセットをかけたりすることができます。詳細はメカトラックスさんのサイトでご確認ください。

slee-Pi 2はRaspberry Pi3に対応し、GPIO切替等可能な最新版です。slee-Pi 23GPi Ver.2と組み合わせてSMSでラズパイを起動させてみます。

SORACOM AirのSIMを用い、ユーザーコンソール(ウェブコンソール)からSMSを送信します。


使用機材

この記事では以下の機材を用います。


準備


SIMを手配する

今回使用するSIMはSORACOMさんの"グローバル向け Air SIM"です。

SORACOM Air SIM(黒SIM):

IMG_20171228_232202.jpg

このSIMはSORACOMさんのユーザーコンソール(Web管理画面)と認証済みのAPIからのみSMSを送ることができるそうです。

IoT用途では、SMSの送信者を限定しないと使い物にならないわけですが、その辺りはSORACOMさんのプレスとブログに説明がありますので以下ご参照ください。

SMS APIのプレスリリース


この度ソラコムが提供開始する SMS 機能は、API コールで SMS を送ることができます。これにより、携帯電話通信網外のサーバーからも、Air SIM が挿入されている IoT 機器に対して SMS を送信したり、プログラムに組み込んで送信を自動化することが可能になります。なお、本機能は予め認証を行った「SORACOM」の API 経由で、お客様のアカウントが保有している SIM 宛しか利用できないため、外部からの SMS による不正アクセスを防ぎ、セキュアな SMS 機能利用が可能となります。


SMS APIの解説


1つの特徴は、デバイスにSMSを送信可能なのはそのSIMを所有するOperatorあるいはそのSAMユーザのみとしている点です。所有していないSIMを指定してAPIコールをしてもリクエストは拒否されます。また、先述のセキュリティ面の懸念を考慮し、例えデバイスの電話番号が漏れたり推測されたりとしても、外部からSMSを受信することはない設計のため、想定していないメッセージを受信して誤動作やバッテリ消耗をする心配も減らせます。


本当にIoTデバイスを遠隔管理しようとしたなら必ずぶつかるであろう壁を華麗に突破してくれるソリューションですね。例えば、"IoTデバイスのネットワーク設定をネットワークに接続せずににどうやっておこなうか、そもそもどうやって必要な時だけ電源を入れるか"のような問題です。

SMSの送信には無料枠もあり、我々のような零細試作業者は大変助かります。

グローバル向けAir SIM(plan01s)のSMS機能がPublic Betaから正式リリースとなります


IoT デバイスへの SMS 送信:0.005USD/通

IoT デバイスからの SMS 送信:0.4USD/通

・・・

SMS 機能では IoT デバイスへの SMS 送信を対象に 1 アカウントにつき毎月10通分の SMS 送信を無料でご利用いただけます。


さて、グローバルSIMはAmazon.comで買うか、SORACOMにユーザー登録済みなら、ユーザーコンソールから発注することができます。

ユーザーコンソールでの発注時の操作方法は以下のページにヘルプがあります。非常に簡単です。

Air SIM/その他商品の発注

私の場合、年末に注文したら二日ほどで届きました。SIMを受け取ったら、同じく発注画面で「受け取り」操作をしておきます。


ジャンパ設定

SMS着信起動のためには、slee-Pi 2および3GPi Ver.2それぞれのジャンパ設定を変更する必要があります。

やや見にくいですが、JP設定と設定済みの写真を張り付けておきます。ご参考にしていただければ幸いです。

表:着信起動のための3GPi Ver.2ジャンパ設定

GPIO ポート
設定
機能
備考

GPIO16 / GPIO18
OUT
着信通知
JP2 で選択

20180103180309.png

表:着信起動のためのslee-Pi 2ジャンパ設定

GPIO 名
設定
機能
備考

GPIO16 / GPIO18
IN
RI
JP1 で選択

20180103180611.png


組み立て

以下のように3階建てに組み立てます。3GPi Ver.2のSIMソケットには組み立て後にもアクセスできます。届いたSORACOMのSIMをセットしておきます。ちなみにですが、黒SIMはいわゆる標準サイズ(ミニSIM)ですが、切れ目が入っているので、マイクロSIM、ナノSIMとしても使えるようです。SIMカッターいらずです。3GPi Ver.2は標準サイズなので、そのまま使います。

slee-Pi 2

3GPi Ver.2

ラズパイ3B

20180103182013.png

電源は、3GPi Ver.2slee-Pi 2の両方に給電します。わたしは3GPi Ver.2用のACアダプタを2つ使いました。

slee-Piの内部はあまりよく分かっていませんが、先述の3GPi Ver.2のジャンパ設定により電源の系統はおよそ以下のようになっているはずです。


系統1>slee-Pi 2>ラズパイ3

系統2>3GPi Ver.2


slee-Pi 2は系統1でラズパイ3の電源を制御します。一方シャットダウン中も系統2で3GPi Ver.2は生きたままです。この際、3GPi Ver.2は低消費電力になるようです。


raspbianの準備

3GPi Ver.2付属のSDカードはjessieだったので、3GPi Ver.2のstretchからイメージをダウンロードして使います。

SDカードをラズパイ3に刺して電源を投入します。系統2→系統1の順で投入します。

まずは3GPi Ver.2slee-Pi 2のパッケージを更新/インストールします。


コンソール

$ sudo apt-get update

$ sudo apt-get install 3gpi-utils 3gpi-network-manager
$ sudo apt-get install sleepi2-firmware sleepi2-utils sleepi2-monitor

この際、ラズパイのコンソールにアクセスするには、以下の様な選択肢があります


  • HDMI出力の画面とUSBキーボード

  • シリアル端末

  • SSH

私はSDカードにイメージを焼いてから最初の立ち上げ時はHDMI/USBキーボードを使って、あとはSSHで接続しています。

その他、slee-Piのセットアップ辺りを参照してセットアップします。上記セットアップで1点補足が必要かと思います。

「1.3 時刻の反映」にhwclock コマンドでシステム時刻をRTCに反映しますが、この時ラズパイのシステム時刻は正しいものに設定されている必要があります。有線LANやWiFi経由でインターネットに接続したらntpで勝手に時刻設定されるかもしれませんが、そうでない場合は以下のようなコマンドで設定します。


コンソール

$ date

2018年 1月 7日 日曜日 01:36:38 JST
$ sudo date -s "2018-1-7 12:07:00"
$ sudo hwclock -w

最後に、バージョン組み合わせの確認です。


コンソール

pi@raspberrypi:~/sandbox $ 3gpictl -v

3gpictl version 2.0
pi@raspberrypi:~/sandbox $ sleepi2ctl -v
sleepi2ctl version 1.1
pi@raspberrypi:~/sandbox $


3GPi Ver.2の動作確認

3GPi Ver.2の公式raspbianを用い、忘れずにUSBケーブルを接続していれば、SORACOMのSIMなら勝手に接続していると思います。


コンソール

pi@raspberrypi:~ $ nmcli c

NAME UUID TYPE DEVICE
gsm-3gpi-soracom 25afee3e-fb56-41be-8e34-0169f7a98456 gsm ttyUSB3
pi@raspberrypi:~ $ ifconfig ppp0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.136.X.XXX netmask 255.255.255.255 destination 0.0.0.0
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 11 bytes 194 (194.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 208 (208.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

上記の状態なら、3GPi Ver.2の青色LEDが高速点滅しているかと思います。

さらに、SORACOMユーザーコンソールでもオンラインが確認できるかと思います。

20180106193211.png


設定ファイルの変更

ジャンパ設定に合わせて以下の設定ファイルを変更します。


/etc/default/3gpi-utils

・・・

# Power off 3GPi at shutdown
# AUTO_OFF=0: disable auto power off
# AUTO_OFF=1: enable auto power off
#AUTO_OFF=1
AUTO_OFF=0
・・・
# Enable the modem to wake up on ring during standby
# WAKE_ON_RING=0: disable Wake-on-Ring
# WAKE_ON_RING=1: enable Wake-on-Ring (AUTO_OFF=0 is required)
#WAKE_ON_RING=0
WAKE_ON_RING=1
・・・

↑↑↑こちらはSMS着信起動のために必須の設定です。

メカトラックスさんからの言付けで、以下に注意が必要だそうです。


SORACOM グローバル向け Air SIMを使用する場合はSTORE_SMS_ON_RING=0のままとすること


上記を"1"に設定すると、通信モジュール内に保存した SMS が削除できなくなってしまうそうです。

※搭載通信モジュール(SIM5320)ファームウエアの仕様だそうです

設定変更したらsudo rebootで再起動しておきます。

また、以下は必須ではありませんが、スクリプトなどでGPIOの状態を確認などするときに必要な設定です。

ジャンパ設定のメモにもなります。


/etc/default/3gpi-utils

# GPIO pins

# RI_PIN: 16 or 18
# POWER_PIN: 17(default) or 12
# STATUS_PIN: 22(default) or 13
# RESET_PIN: 27(default) or 6
# Disabled if not set
#RI_PIN=
RI_PIN=16
・・・


slee-Pi 2の挙動を確認

sudo poweroffでラズパイをシャットダウンすると、シャットダウン中にslee-Pi 2の赤LEDがしばらく点滅してから、ラズパイの赤LEDが消灯します。シャットダウン状態ですね。

その状態でslee-Pi 2のプッシュスイッチを押下すると、ラズパイの電源が入ります。以下のコマンドで起動要因を確認すると、switchと表示されると思います。


コンソール

pi@raspberrypi:~ $ sleepi2ctl -g wakeup-flag

switch

sleepi2alarm -sでタイマー起動時刻を設定して起動した場合はalaramとなり、SMS着信ではriとなります。

以上でslee-Pi 2が正常に動作し、ラズパイの電源を制御できていることが確認できます。


本題

本記事の本題です。以下をシェルスクリプトでおこないます。

Piカメラと温度センサを配線すると以下のような構成となります。

20180107001907.png

配線の詳細などは、anypiの記事を参照していただけると幸いです。

Piカメラを使用するためにraspiconfigで有効化します。


コンソール

pi@raspberrypi:~ $ sudo raspi-config


セットアップの詳細は以下がよくまとまっています。

Piカメラのセットアップ


SMS着信でラズパイ起動を確認

ラズパイをシャットダウンしておきます。


コンソール

$ sudo poweroff


この状態でSORACOMユーザーコンソールからSMSを送信します。

対象のSIMにチェックを入れて、「操作」-「SMS送信」です。

20180106234418.png

適当な文字列を入れて「SMSを送信」ボタンを押します。

20180106234854.png

数秒で3GPi Ver.2の青色LEDが点滅し、すぐにslee-Pi 2とラズパイの電源が入ります。


ラズパイ起動時に実行するスクリプトを作成する

書いたスクリプトは以下のようなものです。冒頭の起動要因のガード以外はごく普通のシェルスクリプトです。


~sandbox/smspi.sh

#!/bin/sh -

set -xv
while :
do
wakeup_flag=`sleepi2ctl -g wakeup-flag`
if [ ! $wakeup_flag = "ri" ]; then
# 着信起動でない場合は処理しない
break
fi

sleep 5
# 撮影
/usr/bin/raspistill -o /home/pi/sandbox/sentinel.jpg -w 320 -h 240
# 温度取得
/usr/bin/python3 get_temp.py >temp.txt
# 温度を撮影画像に書き込む
/usr/bin/convert -pointsize 24 -gravity southeast -annotate 0 "`cat /home/pi/sandbox/temp.txt`" -fill green sentinel.jpg sentinel-o.jpg
# ウェイト
sleep 30

# TODO: ここでメールやFTPで画像を送信

# シャットダウン
sudo poweroff
break
done


get_temp.py は、anypiの記事で使用したもので、温度センサで温度を測定します。

測定した温度はImageMagickで撮影した画像に書き込みます。

「TODO」部分には、画像のアップロード処理などをお好みで追加します。

スクリプトを実行する前に、温度センサとImageMagickを使うためのパッケージをインストールします。


コンソール

$ sudo pip3 install wiringpi

$ sudo apt-get install imagemagick

「sudo poweroff」をコメントアウトしておいて、スクリプト単体で動作確認をおこないます。

bash:コンソール

pi@raspberrypi:~/sandbox $ ./smspi.sh

以下のような画像が保存されていればOKです。

sentinel-o.jpg:

20180107002918.png


スクリプトの起動時実行

いろいろやり方はありますが、systemdで設定します。

上記スクリプトを呼び出すようにsystemdの設定ファイルを作成します。


/etc/systemd/system/smspi.service

[Unit]

Description=SMS Pi Script Service
After=multi-user.target

[Service]
Type=idle
ExecStart=/home/pi/sandbox/smspi.sh

[Install]
WantedBy=multi-user.target


そして有効化します。


コンソール

 $ sudo systemctl enable smspi



動作確認

sudo poweroffでシャットダウンした状態で、SORACOMユーザーコンソールからSMSを送信すると、ラズパイが起動して撮影をおこない、自動的にシャットダウンします。


間欠起動

slee-Pi 2にはキャパシタでバックアップされたRTCが搭載されており、時刻を指定してラズパイを起動することができます。

これを応用すると、定期的にラズパイを起動させることができます。

先に作成したスクリプトのように、起動スクリプトでシャットダウンすれば、ラズパイがシャットダウンしている間の消費電力を低く抑えることが可能となります。

そこで先ほどのスクリプトを間欠起動に対応させたものが以下です。

タイマーで起動した場合のみ「sleepi2alarm」コマンドにて3分後に起動予約します。

スクリプトの最後でpoweroffします。


~sandbox/smspi.sh

#!/bin/sh -

set -xv
wakeup_flag=`sleepi2ctl -g wakeup-flag`
echo $wakeup_flag

case $wakeup_flag in
"alarm" | "ri")
# 間欠起動 or 着信起動
echo "間欠起動 or 着信起動"
sleep 1
cd /home/pi/sandbox/
# 撮影
/usr/bin/raspistill -o sentinel.jpg -w 320 -h 240
# 温度取得
/usr/bin/python3 get_temp.py >temp.txt
# 温度を撮影画像に書き込む
/usr/bin/convert -pointsize 24 -gravity southeast -annotate 0 "`cat /home/pi/sandbox/temp.txt`" -fill green sentinel.jpg sentinel-o.jpg
# ウェイト
sleep 10

# TODO: ここでメールやFTPで画像を送信

if [ $wakeup_flag = "alarm" ]; then
# 間欠起動予約
sudo sleepi2alarm --set "+3min"
fi

# シャットダウン
sudo poweroff
;;
*)
# ほかの場合は処理しない
echo "何もしない";;
esac


間欠起動の最初の1回はコマンドで実行します。


コンソール

$ sudo sleepi2alarm --set "+3min"

$ sudo poweroff

これで約3分+アルファごとに起動を繰り返すはずです。手持ちの環境で24時間放置しましたが、ずっと繰り返していました。


まとめ

slee-Pi 23GPi Ver.2を組み合わせることで、SMS送信によるラズパイの電源投入が簡単確実におこなえることが確認できました。

SORACOMさんのグローバル向け Air SIMを用いることで、SMS送信者を限定することができますので、間違いSMSやスパムSMSによる誤作動を避けることができるでしょう。

さらに、SMS APIの解説で説明されているように、このSMSはAPIやデバイスから送信することもできるようです。

遠隔監視や遠隔保守システムの構築で非常に有用と思われます。


落穂ひろい


slee-Piの起動要因について

slee-Pi 2についてはまだいろいろ試せていませんが、起動要因について以下の点に注意が必要かもしれません。


  • rebootコマンドで再起動した場合、起動要因が前回起動時のままとなる

  • sleepi2alarmで予約した時刻までにシャットダウンしないと起動予約が消える


スクリプトで起動要因をチェックする理由

上記スクリプトでは着信起動やタイマ起動を場合分けしていますので、slee-Pi 2のプッシュスイッチや電源投入で起動した場合はスクリプトは途中で終了してpowroffしません。

このようにしておくとデバッグや動作確認が少し楽になります。


リンク

anyPi(エニーパイ)

メカトラックスさんのサイト

3GPi Ver.2

slee-Pi

SORACOM Air

SMS APIの解説

SMS APIのプレスリリース

3GPIのstretch

Air SIM/その他商品の発注

slee-Piのセットアップ

anypiの記事

3GPi Ver.2使用ポート

Pi Camera

SORACOMユーザーコンソール


脚注





  1. 3GPi Ver.2のJP1から取り外したジャンパピンは2.54mmピッチなのでジャンパ設定では使えないので別途用意します。