IoT用通信SIMの購入について

# はじめに
IoTを始めるに当たり、SIMを使った通信が必要になるケースが考えられます。社内にラズパイやArduino, M5 Stackを接続できるネットワーク環境が整っている場合、とくに気にしなくてもよいです。しかしながら、いきなりこれらの機器を社内ネットワークに接続するのは話が飛びすぎます。どのようなリスクがあるのか、リスクを検証するために時間を使うのですが、それに見合うリターンは本当に存在するのかわからないです。
ですので、まずは簡単にはじめて、どのようなデータを取得し、どのような結果を得られるかどうか、自分たちに合ったデータを得られることができるのか、というような検証を行いたいです。そこで登場するのがIoT用のSIMです。
[Soracom](https://soracom.jp/)さんというIoT用のネットワーク機器やサービスを販売している会社がありますので、Soracomさんのラインナップから自身の要件に合うものを探した結果の記事です。

https://soracom.jp/

:::note alert
今回のデータ容量の試算は実測と大きく異なっていました。
下記に実測した結果を載せましたので、興味がある方はご確認ください。
https://qiita.com/f-mio/items/b7329a30dcb8f41931f6
:::


# 要件

## やりたいこと
製造設備のシグナルライト(緑, 黄, 赤)にそれぞれセンサーを取り付け、光量の測定結果と時刻データをMQTTブローカに送信したいです。

## 制御器に関する要件
制御器はM5 Stickで、これに関わる要件は下記を考えています。

| 内容 | 数値 | 備考 |
| --- | --- | --- |
| デバイス数 | 3 | 増えるかも？ |
| 送信間隔 | 1min間隔 |
| メッセージ容量 | 143 (byte) | (計算は下記参照) |


## メッセージ送信に関わる検討項目
検討したい内容は下記です。

| 検討内容 | 確認したいこと | 備考 |
| --- | --- | --- |
| 送信容量 | 理論値が月の容量を上回らないこと | - |
| 通信速度 | 想定しているインターバルで処理が完了するか | 1min間隔なので実は心配していない |
| 接続エリア | 設置予定場所で繋がるか | - |
| コスト | 可能な限り下げられること | - |


## データ容量
送信データの容量を計算するために、jsonの構造を定義します。
私が考えているjson構造は下記の通りです。

### json構造
| キー | キー2 | 内容 | 備考 |
| -- | -- | -- | -- |
| status |  | string | success or error |
| payload | timestamp | string | 測定時刻 |
| | g | integer | 緑色信号 (0〜4095) |
| | y | integer | 黄色信号 (0〜4095) |
| | r | integer | 赤色信号 (0〜4095) |

### 送信json例
上記のjsonは下記のようなデータになります。

```json
{
  "status": "success",
  "payload": {
    "timestamp": "2024/01/23 12:34:56",
    "g": 1400,
    "y": 3900,
    "r": 3800
  }
}
```

### メッセージサイズ
一回のメッセージのbodyは129文字(本当はスペースが入らないのでもう少し小さい)で、サイズが129 byteです。
あとはmqttのヘッダです。IBMのページでは、ヘッダの容量について下記の記載があります。

> ヘッダーは、2 バイト固定ヘッダーと、最大 12 バイトの追加可変ヘッダーから成ります。 

https://www.ibm.com/docs/ja/ibm-mq/8.0?topic=telemetry-mqtt-protocol

一方、下記の仕様書では、可変長部分はtopic name部に固定で2byteとidentifier 2byteの4byteが発生するようで、そこにプラスしてtopic名が入る模様。

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718037

上記では【a/b】とtopic nameをつけています。
自分が使う場合は、6〜7文字あれば十分で、$11 = 7 + 4 < 12$なので12byteで計算しても問題ないと考えます。

よって、今回の内容ではメッセージは最大143 byteになります。

また、1日に1回時刻合わせをしたいと思います。
```bash
$ curl "nict.go.jp" -o ./aaaa.txt
$ ls -la ./aaaa.txt
```
でサイズを確かめたところ1871(byte)でした。これを月に換算すると下記になります。
（nict.go.jpへのcurlでよかったのかは疑問に残りますが、多く見積ったということで良しとしましょう。苦笑）
```math
\begin{align}
0.17 \verb|(MB/month)| \quad \risingdotseq & \quad
  1871 \verb|(byte/day/設備)|
  \times 31 \verb|(days/month)| \\
  & \qquad
  \times 3 \verb|(設備)| 
  \div 1024 \div 1024
\end{align}
```

月あたりの使用量を考えると、おおよそ18.4MBとなります。

```math
\begin{align}
18.4 \verb|(MB/month)| \quad \risingdotseq & \quad
  143 \verb|(byte/min/設備)|
  \times 31 \verb|(days/month)| \\
  & \qquad
  \times 24 \verb|(h/day)|
  \times 60 \verb|(min/h)|
  \times 3 \verb|(設備)| \\
  & \qquad
  \div 1024 \div 1024 \\
  & \qquad
  0.17 \verb|(MB/month)|
\end{align}
```

## 通信速度
$143 \times 3 \verb|(byte)|$のデータを1min内に処理が終了すればOK。



# Soracomさんプラン

容量がわかってきたので、実際のプランを選択してみようと思います。

## 通信プラン選定と発生金額
SoracomさんのHP（20244.1.30現在）から通信プランを抜粋して、私の要件に当てはめたものが下記の内容です。

| | plan01s | plan01s LDV | planX3 | planP1 | plan-D | plan-K2 | plan-DU | plan-KM1 | plan-K |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
|基本料金|0.06 USD/日〜|0.40 USD/月|1 USD/月|1.8 USD/月|330 円/月|330 円/月|1,320円/月〜|110 円/月|11 円/日|
|データ通信料|0.02 USD/MB〜|0.50 USD/MB|0.02 USD/MB〜|0.02 USD/MB〜|110 円/500MB|110 円/500MB|1,000円/上り10GB or 下り1GB|0.55 円/KB|0.22 円/MB〜|
| USD/月 | 2.228 | 9.5 | 1.264 | 2.164 | - | - | - | - | - |
| 円/月 |334.2|1440|190.2|325.2|330|330|1320|10472.88|345.048|


https://soracom.jp/services/air/cellular/


この中では、下記のものが候補になります。

| | plan01s | planX3 | planP1 | plan-D | plan-K2 |
| -- | -- | -- | -- | -- | -- |
| 円/月 |334.2|190.2|325.2|330|330|

## 対応エリア
各プランと通信事業者、通信方式を下記に記載します。

| | plan01s | planX3 | planP1 | plan-D | plan-K2 |
| -- | -- | -- | -- | -- | -- |
| エリア | 150ヶ国（日本含） | 90ヶ国（日本含） | 50ヶ国（日本含） | 日本国内 | 日本国内 |
| 通信方式 | 2G,3G,LTE,<br>LTE Cat.M1 | 2G,3G,LTE,<br>LTE Cat.M1 | 2G,3G,LTE | 3G,LTE,LTE Cat.M1 | LTE,5G |
| 通信事業者 | DOCOMO (3G,LTE)<br>SoftBank(3G,LTE) | DOCOMO (3G,LTE)<br>SoftBank(3G,LTE) | SoftBank(3G,LTE)| DOCOMO回線 | au回線 |

使用するDOCOMO回線を使用しようと思い、使用するエリアでネットワークが通っているのかを下記のサイトで確認しました。


https://www.docomo.ne.jp/area/


https://www.docomo.ne.jp/area/servicearea/?rgcd=04&cmcd=5G&scale=64000&lat=35.176962&lot=136.909522



## 通信速度
通信速度は記載している箇所が見つからなかったのですが、特に大きな容量ではないので問題ないと考えて先に進もうと思います。
強いて言えば、下記箇所に速度制限の話が記載してありました。

https://soracom.jp/services/air/cellular/pricing/price_iot_sim/#speedclass

この記載の中で最も低いものが32kbpsした。実測が理論値の1/10だとしても1秒間に400byteを処理できます。
想定している143byteを処理するのに、この数値でも十分すぎると思います。




# 通信SIMの選定

## ここまでのまとめ
今までの内容を一旦まとめます。

| | plan01s | planX3 | planP1 | plan-D | plan-K2 |
| -- | -- | -- | -- | -- | -- |
| エリア | 150ヶ国（日本含） | 90ヶ国（日本含） | 50ヶ国（日本含） | 日本国内 | 日本国内 |
| 通信方式 | 2G,3G,LTE,<br>LTE Cat.M1 | 2G,3G,LTE,<br>LTE Cat.M1 | 2G,3G,LTE | 3G,LTE,LTE Cat.M1 | LTE,5G |
| 通信事業者 | DOCOMO (3G,LTE)<br>SoftBank(3G,LTE) | DOCOMO (3G,LTE)<br>SoftBank(3G,LTE) | SoftBank(3G,LTE)| DOCOMO回線 | au回線 |
| 円/月 |334.2|190.2|325.2|330|330|


## SIM選び
ここまでの結果で私の要件に合うSIMのプランは、【planX3】となりました。
しかしながら、初めての購入で何かしらのトラブルでデータが一時的に大きくなることも考えられます。そうなったとしても安心できるように、今回は定額で300MBついてきて比較的安価な【Plan-D】にしました。

## その他機器
SIMを入れる機器は、下記のルータを購入することにしました。

https://soracom.jp/support_partners/certified_device/wn-cs300fr/


# 最後に
IoT用途でSIMカードを選定してみました。
はじめての試みなので、途中計算が間違っている箇所もあるかと思いますが、思考を残してみたいと思い記事にしてみました。どなたかの参考になれば幸いです。
また、ところどころ怪しい部分があると思います。認識が違っている箇所があれば、お手数ですがご指摘いただけますと助かります。
2月にはAWS IoT Coreにデータを上げることをやってみようと思います！

## 失敗したこと
先日、注文したSIMとルータが届きました。
ただ、ルータがマイクロSIM対応なのにナノSIMを買ってしまい、結局SIM用のアダプタを追加で購入しなくてはいけなくなったという失敗をしてしまいました...