RaspberryPiをSMSで起動してみる

メカトラックスエバンジェリストのしかじろうです、こんにちは。今回はLTEモジュール4GPiと電源監視モジュールslee-Piで色々遊んでみました。[@MechaTracks](https://twitter.com/MechaTracks)「しかさん、RaspberryPiはSMSで起動できるんだよ」と聞いてワクワクが止まらないので先人の知恵を借りながら試してみました。

![PXL_20210224_152655649.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/e57e1ea8-785f-3c68-fb0a-af06eb057020.jpeg)

# 概要

RaspberryPiに4GPiとslee-Pi3を繋いでSORACOM経由でSMSを送って起動する

# 参考
先人の記事を参考にしました。
[3GPi Ver\.2とslee\-Pi2を使用して、SMS着信でラズパイ遠隔起動～シャットダウン \- Qiita](https://qiita.com/syasuda/items/26bbe73bc62ee5856188)

# 必要機材の紹介

## RaspberryPi3
[Buy a Raspberry Pi 3 Model B – Raspberry Pi](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)
![877fb653\-7b43\-4931\-9cee\-977a22571f65\_3b\+Angle\+2\+refresh\.jpg \(600×400\)](https://www.raspberrypi.org/homepage-9df4b/static/532b4c25752c4235d76cc41051baf9ab/ae23f/877fb653-7b43-4931-9cee-977a22571f65_3b%2BAngle%2B2%2Brefresh.jpg)
みんな大好きRaspberryPi。最新は4ですが、今回は知見が多い3を使いました。OSは安心と信頼の4GPi用のRaspbianを採用しました。

## 4GPi

[ラズベリーパイ用4G（LTE）通信モジュール「4GPi」 \| 製品の紹介](https://mechatrax.com/products/4gpi/)
![4gpi4@2x\.png \(800×684\)](https://mechatrax.com/wp-content/themes/mt-style2020/assets/img/products/4gpi4@2x.png)

4GPiはRaspberryPi用のLTE通信モジュールです。ドッキングするだけで使えます。例えばビニールハウスや倉庫の中など、wifi回線がない場所でもネットに繋げることができます。後述するSoracom Napterを使えばSSHでログインできるので開発が捗ります。

## slee-Pi3

[ラズベリーパイ用電源管理/死活監視モジュール「slee\-Pi」 \| 製品の紹介](https://mechatrax.com/products/slee-pi/)
![sleepi3@2x\.png \(800×684\)](https://mechatrax.com/wp-content/themes/mt-style2020/assets/img/products/sleepi3@2x.png?200731)

slee-PiはRaspberryPi用の電源管理・死活監視モジュールです。起動・停止をスケジューリングさせたり、起動サービスが止まったら再起動などができます。使わないときは電気を使わないので省エネにもなるし、システムの死活監視⇒再起動も可能です。4GPiと組み合わせることで、SMS着信で起動もできます。

## SORACOM IoT SIM

[SORACOM IoT SIM \(カード型 SIM\) \- IoTデバイス通販 \- SORACOM（ソラコム）IoTストア](https://soracom.jp/store/5259/)
![スクリーンショット 2021-02-25 0.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/7d308074-e5f9-f2fd-1f56-518c9867e994.png)

SORACOMはIoT向けの通信プラットフォームです。SMSを使う場合はSMS可のSIMを購入する必要があります。(1敗)

SORACOM Napterを使うとRaspberryPiにSSHできるので、RaspberryPiを設置した後も開発・保守ができます。



# ハードウェアの準備

## 4GPiジャンパピン

### 電源

JP1の供給ピンを両方とも抜きます。電源の供給はslee-Piに任せるためです。

### SMS

JP2にジャンパピンを刺します。他と同様にGPIO16を使うので左側と中央をつなげます。これでSMSを着信するようになります。

![4gpi\_jumper\_pins\.png \(3216×1963\)](https://raw.githubusercontent.com/mechatrax/4gpi/master/image/4gpi_jumper_pins.png)

### slee-Piジャンパピン

![sleepi3\.png \(1554×1071\)](https://raw.githubusercontent.com/mechatrax/slee-pi3/master/images/sleepi3.png)

### SMS

JP1に2mmピッチジャンパピンを刺します。4GPiと合わせてGPIO16を使うので左側・中央を繋ぐようにします。

ジャンパピンには2.54mmピッチと2mmピッチがあるので、間違えないように購入します(1敗)

## 電源
今回は以下の2系統で構成しました。
1. Slee-Pi -> RaspberryPi
2. 4GPi

Slee-Piと4GPi両方に電源を繋ぐ必要があります。RaspberryPiへの給電はSlee-Piが行います。

# ソフトウェアの準備

OSは4GPiが提供している[4gpi-buster-lite-20200902.zip](https://mechatrax.com/data/4gpi/4gpi-buster-lite-20200902.zip) を採用しました。（この記事書いてたら4gpi-buster-lite-20210204が出ました）

piユーザーのパスワードが raspberry から変更されているので、[初期ログイン情報カード](https://github.com/mechatrax/4gpi/tree/master/os#%E5%88%9D%E6%9C%9F%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%83%85%E5%A0%B1%E3%82%AB%E3%83%BC%E3%83%89)を見てログインしてください。

## ジャンパピンの設定

ジャンパピンを変更したので、設定ファイルを書き換えます。

`sudo nano /etc/default/4gpi`

```
#
# 4GPi settings
#
...
# Power off 4GPi at shutdown
#  AUTO_OFF=0: disable auto power off
#  AUTO_OFF=1: enable auto power off
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=1

# Store SMS at Wake-on-Ring (WAKE_ON_RING=1 is required)
#  STORE_SMS_ON_RING=0: do not store the sms
#  STORE_SMS_ON_RING=1: store the sms
STORE_SMS_ON_RING=0
```

設定後は再起動を忘れずに。


## slee-Pi 関連ライブラリ

4GPi関連ライブラリはインストールされていますが、slee-Pi関連ライブラリは同梱されてないので追加でインストールします。

```shell
sudo apt-get update
sudo apt-get install sleepi3-firmware sleepi3-utils sleepi3-monitor
```

## SORACOM 接続

SORACOMに接続する設定を追加します。

```shell
sudo nmcli con add type gsm ifname "*" con-name soracom apn soracom.io user sora password sora
```

## セキュリティ

ファイアーウォールにufwが同梱されています。デフォルトで wwan0とppp0が受信拒否になっています。これだと、SSH接続ができません。検証ということで一旦disableにします。(1敗)

```shell
sudo ufw disable
```

disableは再起動するともとに戻るので注意。(1敗)

## ルーティング

RaspberryPiをwifiに繋いでいる場合はルーティングをきちんと設定しないと4GPiがうまく動きません。設定は結構大変なので、とりあえず動かす場合はwifiをoffにするのがおすすめです。

# 開発環境を整える

ここまでで、RaspberryPi, 4GPi, slee-Piが起動してSORACOMにも疎通ができています。SORACOMコンソールを確認するとオンラインになっています。

![スクリーンショット 2021-02-23 17.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/0c15f731-9736-8b8b-46b2-4381b2469a4d.png)

SORACOM Napterを使うとLTE通信経由でRaspberryPiにSSH接続できます。RaspberryPiを目的の場所に設置した後も開発できます。SORACOMマジ便利。

### Napter

[SORACOM Napter](https://soracom.jp/services/napter/) を使うとSIMに対してSSHできるようになります。昔はこれができなくて修正のたびに現地に赴いたり、開発がとても大変でした。理想環境にRaspberryPiを設置して、自宅から開発ができるので、これは本当に便利です。

![スクリーンショット_2021-02-23_16_53_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/10d1f220-0762-b87a-9a0a-f4ef20be6612.png)

接続したいSIMを選んでオンデマンドリモートアクセスを選択します。

![スクリーンショット_2021-02-23_17_34_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/e99af120-dee4-e0e5-bdd7-5a0b6caebda7.png)

アクセス可能時間を選択します。無期限に開きっぱなしにはできないので、接続するたびに時間を決めてアクセスします。セキュリティ的に安心ですね。
ポート変更したり、アクセス元IPレンジ変えたりもできます。とりあえず繋ぐ分には無視でOKです。
TLSを有効にすれば、httpsサーバーを公開することもできるみたいです。
![スクリーンショット_2021-02-23_17_43_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/5d6d30ba-2059-3403-e53e-168ab672f94f.png)

SSHで接続できるようになりました。SORACOM側のportの値は都度変わります。サンプルが表示されますが、`user`では接続できないので、`pi`に変更します。

```
ssh -p 36792 pi@1-2-3-4.napter.soracom.io
```

![スクリーンショット_2021-02-23_17_48_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/6bf51363-4931-9591-2aae-5bacc4a2e627.png)

うまくいくとこんなメッセージがでてきます。🎉

# SMS起動

ここまでで、RaspberryPiの遠隔開発ができるようになりました。しかし、電源が切れていたらどうしようもありません。SMSを送ってRaspberryPiを起動してみます。

ただし、スマホのSMSのように誰からでもSMSを遅れるわけではないです。公式サイトにあるように、同じオペレーター配下のSIM同士じゃないと送受信はでき内容です。

[IoT SIM\(plan01s\)の SMS 機能を使用する \| Getting Started \| SORACOM Users](https://dev.soracom.io/jp/start/plan01s_sms/)
>IoT SIM は同じオペレーター配下の SIM 同士で SMS の送信ができます。他のオペレーター配下の SIM や SORACOM 以外の SIM、plan-D などの特定地域向け IoT SIM とは SMS の送受信はできません。

slee-Piを使って電源のon/offをやってみます。とりあえず`sudo poweroff` で電源を落としておきます。

![スクリーンショット 2021-02-23 18.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/ee74feb0-893c-4069-548d-e398ac5f38db.png)

SORACOMの画面で該当SIMを選んでSMSを送信します。

![スクリーンショット_2021-02-23_18_24_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/706fc691-2c64-ba15-1bcc-1242ac730fd8.png)


本文によって受け取ったRaspberryPi側で処理を分岐できますが、今回は適当に入れました。

slee-piの赤いLEDが点いてRaspberryPiが起動します🎉

### 起動要因の確認

[mechatrax/sleepi3\-utils](https://github.com/mechatrax/sleepi3-utils) を使うと起動要因などを確認できます。

>poweron : 電源接続が起動要因です。
>watchdog : ウォッチドッグタイマのタイムアウトによる再起動が起動要因です。
>alarm : リアルタイムクロックのアラーム発生が起動要因です。
>switch : プッシュスイッチの押下が起動要因です。
>extin : 外部入力の検出が起動要因です。
>ri : RI 信号の検出が起動要因です。
>restore : 電源復旧の検知が起動要因です。

```shell
$ sleepi3ctl -g wakeup-flag
ri
```

SMSの場合はriになるので、うまく動いています！

## API経由でSMS呼び出し
上にも書きましたが、SMSは同じオペレーター配下のSIM同士でしか送受信できないので、利用が限られます。SORACOMではAPIによる呼び出しでSMSを利用することができます。
[IoT SIM\(plan01s\)の SMS 機能を使用する \| Getting Started \| SORACOM Users](https://dev.soracom.io/jp/start/plan01s_sms/#step1)

soracomのログインIDとパスワードでtokenを取得できます。

```
$ curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d "{\"email\": \"<ログインID>\",\"password\": \"<パスワード>\"}" "https://g.api.soracom.io/v1/auth"
```
こんな感じで返ってきます。（ほとんど見せれない）
![スクリーンショット_2021-02-26_20_54_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/1a13c187-5a11-7e93-bee2-50a0a5c4e9d4.png)

取得したapi-key,token SORACOMコンソールで確認できるIMSIを指定して、SMSを送信できます。

```
$ curl -X POST  -H "content-type:application/json" -H "X-Soracom-API-Key: <apiKey>" -H "X-Soracom-Token: <token>"  -d "{\"body\":\"<メッセージ>\"}" https://g.api.soracom.io/v1/subscribers/<imsi>/send_sms
```

IMSIはSIMの詳細ページのここにあります。
![スクリーンショット_2021-02-26_20_59_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/91020bb0-14c0-8143-7d3b-ec44ef93faed.png)

こんな感じでmessageIdが返ってくれば成功です。

![スクリーンショット_2021-02-26_21_00_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16532/3476fa7a-bf6d-d711-afa1-ed973c1024f8.png)

API化することで、プログラムの中にRaspberryPiの起動を組み込むことが可能になります。

# まとめ

RaspberryPiに4GPi,SORACOM,slee-Piを連携させることで、場所・電源・省エネなどの**環境の幅**が広がりました。次回はこれらを組み合わせて実用的なアプリケーションを作ってみたいと思います。