RaspberryPi
SMS
SORACOM
3GPI
slee-Pi

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

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ピッチなのでジャンパ設定では使えないので別途用意します。