ソラコムSIMを使ってペアレンタルコントロールを実現する


初めてのAdvent Calendarです。ちなみにQiita 投稿2回目でデビューしたてです。

さて本題。
作業効率化がテーマですが、効率化を実現する方法の一つとして、自分の作業自体の効率を上げる以外に、環境を改善して自分が集中できる時間を増やすという方法もあると考えました。
私の場合、コロナ禍の緊急事態宣言期間中、小さい子供たちが家にいる中でいかに自分が仕事に集中する時間を作るかというのが本当に頭の痛い悩みでした。
こちらが仕事している間、静かにしてもらう方法の一つにパソコンやタブレットを使ってYoutubeを見せまくるなどありますが、お互いの生活リズムをきちんと作っていくためにもメリハリをつけてタブレットを使ってもらいたいと考えています。
まだ自分で自分の行動を律するのが難しい年齢 (自分もできてるとは言い難いですが・・・)なので強制的な手段としてペアレンタルコントロール機能をもつアプリを利用して、一定時間タブレットを使用するとタブレットを停止する機能を有効にしています。

## 件名のことをしようと思ったきっかけ

先日、Google さんが風邪をひきました。

* 参考: [Google、12月14日の約45分間ダウンの原因と対策を詳解](https://www.itmedia.co.jp/news/articles/2012/21/news049.html)

おかげでペアレンタルコントロールを行っていたアプリ [`Family Link`](https://families.google.com/intl/ja/familylink/) がGoogleのサーバに接続できず、一切の制御ができなくなり困りました。寝る前だけ閲覧を許可してるアプリがあるのですがそれが起動できなくて子どもが大騒ぎ(発狂)。


## 考えた解決方法

Google 先生が風邪をひくことはたまにあるのでバックアップ手段を用意しようと考えました。
そうだ、通信の制御が簡単にできる Soracom の IoT SIM を使って、通信を制御することによって簡易的なペアレンタルコントロールを実現しようと思いました。

### やりたいこと

- 一定の通信量が発生したら通信を*自動的に*止める
- ~~1日あたり一定時間の通信が発生したら通信を自動的に止める~~
    - 設定できるルールに時間をトリガーとするものが見当たらなかったのでいったん諦めました
    - AWS Lambda と組み合わせれば簡単にできそうですが今回はスキップ

#### Soracom SIM ではできないこと


以下はできないので、これはGoogleさんにお願いします。

- タブレットのアプリごとの細かなコントロール
    - 例えば、Youtube アプリは20分のみ、将棋アプリは1時間利用可能とかの制御


### 前提

以下のものが事前に必要になります。

- Soracom IoT SIM
    - [SORACOM IoT ストア](https://soracom.jp/products/sim/plan-d/)で購入しました。日本カバレッジで良いのでplan-D を選択しました。
 
- SIMが利用できるタブレット
    - iPad とか, Android Tab とかなんでも
        - ウチにあるのは[Android のこれだと思う](https://amzn.to/2JknuAK)

### 準備

- 用意したSIM をタブレットで使えるようにしておきます。
    - SORACOM IoT SIM を有効化するのに[`SORACOM の利用を始める`](https://dev.soracom.io/jp/start/begin_soracom/)を見ながら行いました

### 対応

ソラコム ユーザコンソール上で簡単にできました。

#### 手動でする場合

止めたい時にコンソール上で `休止`を選択するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/f28de3a4-63b7-443a-d753-f69f280541d4.png)

一定量使ったら通知が欲しい場合は以下の設定を行えばできます。

ポチポチするだけで簡単にできました。ちょっとびっくり。

1. 制御したいSIMを選択して、`詳細`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/60742bc0-1906-7af3-54a0-bda8ad3d65a3.png)
2. 監視タブを設定します。
3. メールで通知 → `日次通信量がこの値を越えたら通知する` にチェックを入れて閉じます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/b9449ecf-e0b4-cb1e-b453-5da17d494226.png)



#### 自動で実行する場合



1. イベントハンドラーを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/d3d3c5c7-25f2-ff8b-ecd4-52fd7aafc8b3.png)
2. `イベント作成` を押してイベント編集画面に行きます。
3. イベント名は適当につけます。
4. 監視対象を`サブスクライバ` として、IMSIの番号を入力します
    5. IMSI は `SIM管理` > `詳細` から分かります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/a592fc1a-0afa-e67c-6a2a-dc6260b8c004.png)

    5. 余談ですが、ここで選択候補が自動で出てくると嬉しいですが今は出ません
    6. 監視対象にSIM ID を選んだ場合とかも同様な候補補間の形があると嬉しい
6. ルールに `サブスクライバの日次通信量が一定を超えたら実行`を選択して、量をセットします
7. アクションに `SIMの状態を休止中にする` を選択し、実行するタイミングを `すぐに実行` にします
8. `アクション追加` を押下して、アクションに `SIMの状態を使用中にする` 、実行するタイミングを `翌日開始時`にします
9. 最後に `作成` ボタンを押します。この時点ではこういう画面になっています
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/e76d190d-28de-60ef-85c6-a132df2f9a1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/7c1ad4dd-ffb0-559b-35ad-1987a1756513.png)

あとはタブレット上でネットサーフィンなどをして、通信が止まることおよび翌日に通信が再開するを確認すれば設定完了です。

今回は試しに1MiB に設定してテストしてみました(整数値しか指定できません)。
※詳細は省きますが、Soracom SIMを挿入したラズパイ上でコマンドラインで試した結果を記載しています。

#### (おまけ)テスト方法

イベントハンドラーが正しく設定できているのか確認するために簡単なテストをします。

- 既に書いた方法で、日次通信量を 1 Mib に設定。また、オフセットを使って10分後に再開するようにしています。
    - 余談ですが、時間設定ができるなら、50分ごとに休止して１０分後に再開という設定で１時間ごとに休憩時間を入れるというのが強制的にできそうです。(現状lambda などで実現するしかないかも)
- 1mb のファイルをダウンロード
    - [こちら`1mb-test`](https://datahub.io/datahq/1mb-test#curl)のサイトのデータを利用しました

    ```
  $ curl -L -s https://datahub.io/datahq/1mb-test/datapackage.json | grep path
  $ curl -L https://datahub.io/datahq/1mb-test/r/0.csv > hoge.csv # ここのURLは適宜変更
    ```


- しばらく待つ (通信量のカウントが反映されるまでに最大5分くらいある模様)
- 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/d9170143-2abe-78a3-d91e-8c6742718c96.png)
無事 `休止中` になりました。

- ping 打っても到達しません
- ```
$ ping yahoo.co.jp
ping : unknown host yahoo.co.jp

- 10分後、無事に通信が再開しました。 (休止中にしてしばらく経つと、ラズパイのppp0が消えてしまうので再起動しています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/2ce2cf89-6814-f18c-eab9-b51783f8dbc8.png)

イベントハンドラーの設定がうまく動いていることを確認できました。


### 今後の対応

- 自分のアプリやサービスとSoracom APIを組み合わせる時間がなかったので今回はだいぶ省きましたが、例えば子供が夕食食べ終えて、IoTボタンを押したら通信を再開するようなガジェットとの組み合わせができるとより柔軟性が増しそうです。
    - この辺の [LTM-M Button](https://www.soracom.jp/products/gadgets/)とか良さそう。


- VPG (Virtual Private Gateway) を利用して接続先を限定許可または拒否する
今年の夏に、VPG Type-E が発表され、これがなかなか安い料金で手軽に利用できるようになりました。これを設定して、アウトバウンドルーティングフィルターを設定することで実現できます。実際、手元で設定して動かしてたのですが、スペースの都合上省略しました。(あとペアレンタルコントロール目的では設定が冗長すぎるかなと思い、記事化は見送りました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1388/14493560-c075-2241-4f1f-53c8b4238c29.png)



とはいえ、SIM 経由の通信は自宅のWi-Fi経由の場合と比べると、通信量に応じたコストがかかるのであくまで一時的な代替手段です。
外出先＆Googleが落ちてる時とかに利用するかもですが、とても低い確率かなと思います。

そもそも今回取り上げたSIMは、IoT SIM という名の通り、もっとIoTデバイスに利用した方がワクワクすることできますね。


## ペアレンタルコントロール代替案

- ペアレンタルコントロールのアプリはいろいろあるんですが無料で使い勝手がまぁまぁ良いというのでGoogleアプリを使っていました。他のアプリを使えばGoogleさんが寝込んでも大丈夫かもしれません。

- Nintendo switch つなげたテレビの場合、[スマートプラグ](https://amzn.to/3hgjq0T)を使って、電源を切るという方法も可能です。これはSIM は使いません。


小さい子供と言葉だけで規則正しい生活を継続していくことが難しかったので、こうやって仕組みによって敷居を作っていくとストレスも減り、楽になりました。