SPRESENSE LTE拡張ボードをはじめてみよう


Spresenseボードと拡張ボードは以前から使っていたのですが、前々から気になっていたSpresense LTE拡張ボードを新たに購入しました。SIMカードの選定や初めて動かしたときのメモを導入編として書き記しておきます。結論から言うと、公式マニュアル通りに動かせば特に何もハマることなくあっさり動きました:->

# SIMカードの購入

公式サイトの[LTE-M 動作確認SIM List](https://developer.sony.com/ja/develop/spresense/specifications/spresense-lte-sim-list)を参考にしつつ、いくつか調査した上でこちらを購入しました。
IIJ アイアイジェイ IM-B281 [Japan Travel SIM 1.5GB タイプ I]
https://www.yodobashi.com/product/100000001005357527/
ヨドバシ.comで2-3日で届きます。ナンカガイコクジンニナッタキブンデース。

![SIM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/2a9a8cfe-aad9-a4a1-873c-a1a692fdc59d.jpeg)
 
# SIMカードの登録

https://tr.iijmio.jp/login/
SIMカードに同封のPASSCODEを入れてログインします。トラベルSIMなので、登録にはパスポート番号が必要です。

# 早速動かしてみる

LTEチュートリアルにまとまっているのでこれをなぞるだけですぐに使えました。
https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_tutorial_lte

|examples|内容|
|--------|---|
|LteTestModem|バージョン表示|
|LteScanNetworks|ネットワーク開通確認 |
|LteWebClient|HTTPクライアント |
|LteHttpSecureClient|HTTPSクライアントTLS通信 |
|LteNtpClient|NTP通信 |
|LteGnssTracker|MQTT通信 |

### モデムの情報を取得する(LteTestModem.ino)

スケッチそのままビルドして動かすとIMEIとVersionが繰り返し表示されます。

### ネットワークの情報を取得する(LteScanNetworks.ino)

SIMカードに合わせてLteScanNetworksスケッチのAPN情報を書き換えます。

``` cpp:LteScanNetworks.ino

// APN data
#define LTE_APN       "iijmio.jp"
#define LTE_USER_NAME "mio@iij"
#define LTE_PASSWORD  "iij"
```

初回の接続には1分ぐらいかかりました。(2回目以降は20秒ぐらい)
LTE拡張ボードのLED(D3)がゆっくり点滅-->その後点灯-->その後`attach succeeded.`のログが現れます。

シリアルモニタに以下のように表示されました。正しく接続できているようです。

```
IP address: 100.79.9.54
Current carrier: IIJ
Signal Strength: -104 [dBm]
```

### HTTP GETメソッドをサーバに送信してデータを取得する(LteWebClient.ino)

さきほどと同様にLteWebClientスケッチのAPN dataを書き換えます。

```cpp:LteWebClient.ino
// APN data
#define LTE_APN       "iijmio.jp"
#define LTE_USER_NAME "mio@iij"
#define LTE_PASSWORD  "iij"
```

シリアルモニタに[ココ](http://www.arduino.cc/asciilogo.txt)と同じArduinoロゴが表示されたら成功です！(あっさり)

### TLSプロトコルを使用したHTTP Clientの動作を確認する(LteHttpSecureClient.ino)

Arduino HTTP Clientライブラリをインストールします。
さきほどと同様にLteHttpSecureClientスケッチのAPN dataを書き換えます。

```cpp:LteHttpSecureClient.ino
// APN data
#define LTE_APN       "iijmio.jp"
#define LTE_USER_NAME "mio@iij"
#define LTE_PASSWORD  "iij"
```

https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#lte_howtoexport_cert
ここの手順通りにルート証明書を取得してSDカードのCERTSフォルダに保存します。
`CERT_FILE` と `KEY_FILE` はデフォルトでは使用しないので `ROOTCA_FILE` のみ以下の通りに書き換えます。

```cpp:LteHttpSecureClient.ino
#define ROOTCA_FILE "CERTS/httpbin-org.pem"   // Define the path to a file containing CA 
                                       // certificates that are trusted.
#define CERT_FILE   "path/to/certfile" // Define the path to a file containing certificate
                                       // for this client, if required by the server.
#define KEY_FILE    "path/to/keyfile"  // Define the path to a file containing private key
                                       // for this client, if required by the server.
```
mbedTLSが裏で動いているようです。これもあっさり動作します。

### UDPプロトコルを使用したNTP Clientの動作を確認する(LteNtpClient.ino)

Arduino NTP Clientライブラリをインストールします。
さきほどと同様にLteNtpClientスケッチのAPN dataを書き換えます。

```cpp:LteNtpClient.ino
// APN data
#define LTE_APN       "iijmio.jp"
#define LTE_USER_NAME "mio@iij"
#define LTE_PASSWORD  "iij"
```
NTPから取得された時刻が秒単位で表示されます。時報(117)と比べると表示が1秒近くズレているような気がします。loop()関数のsleep(1);をコメントアウトすれば1秒ほどのズレはなくなりますが、それでも若干表示されるまでのタイムラグがありそうです。

### AWSサーバにGNSS位置情報をPublishする(LteGnssTracker.ino)

AWSアカウントの作成は後日にします。

## その他

ボードのハードウェア情報はこちらにまとまっているようです。
https://developer.sony.com/develop/spresense/docs/hw_docs_lte_ja.html

IIJのサイトにログインすればデータ利用料/残量などを確認することができます。従量課金ではなく容量制限付きなので使いすぎることもなくて安心ですが、1.5GBでどれくらい使えるのか検証していきたいと思います。LTE-Mですし1ヶ月は余裕(というか使い切れずに残ってしまいそう)です。
https://tr.iijmio.jp/support/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/5ff40a0f-a108-99c4-ed3f-e5ba49429976.png)