【作業メモ】Quectel社のLTE通信モジュールEC21の使用方法

# 記事の概要
Quectel社LTE通信モジュールEC21-Jの使用方法のメモです。

EC25-Jや同社製の他通信モジュールについても適用できる点が多いと思います。

メモなので随時更新します。

# モードの種類

- Normal Operation
    - 待機
        - ネットワークを設定し、通信可能な状態
    - 通信
        - ネットワーク接続している状態。消費電力はデータ転送レートによる
- Minimum Functionality Mode
    - 消費電力節約のために、RF機能とUSIM機能を無効にする
- Ariplane Mode
    - 消費電力節約のために、RF機能を無効にする
- Sleep Mode
    - 多くの機能を無効にして消費電力を最小にする
- Power Down Mode
    - 電源を落とし、機能停止する

# モードへの遷移方法

## Sleep Mode
Sleep modeに遷移するには以下の手順に従う。


1. `AT+QSLK=1` コマンドをUART通信で送信して、Sleep modeを許可する
2. DTR端子にHigh入力を保持する

Sleep modeから復帰するには以下のようにする。

- DTR端子にLow入力を保持する

## Minimum Functionality Mode
Minimum Functionality Modeに遷移するには以下の手順に従う。

- `AT+CFUN=0` コマンドをUART通信で送信する

## Ariplane Mode
Ariplane Modeに遷移するには以下の手順に従う。

- `AT+CFUN=4` コマンドをUART通信で送信する

## Minimum Functionality Mode / Ariplane Modeからの復帰
Minimum Functionality Mode もしくは Ariplane Modeから復帰するには以下の手順に従う。

- `AT+CFUN=1` コマンドをUART通信で送信する

## 再起動
設定を有効にしたまま再起動を行う。

- `AT+CFUN=1,1` コマンドをUART通信で送信する


# 電源ON/OFF
PWRKEY端子は電源のON/OFFスイッチになる。

- PWRKEY端子に100msec以上のLOW期間を持つパルスを入力することで、電源がON/OFFする

もしくは、電源OFFにするだけならコマンド入力でもできる。

- `AT+QPOWD` コマンドをUART通信で送信することで、電源OFFする
    - `AT+QPOWD=0`：緊急電源OFF
    - `AT+QPOWD=1`：通常電源OFF

電源ONしてから、ネットワークを使用可能になるまでは13秒待たされる。

# リセット

- RESET_N端子に150msec以上、460msec以下のLOW期間を持つパルスを入力することで、リセットする

リセットは、`AT+QPOWD` コマンドもしくはPWRKEY端子による電源OFFが失敗した場合に行うこと。

# UTC時刻の取得

- `AT+QLTS` コマンドをUART通信で送信する

```
$ AT+QLTS
+QLTS: "2020/09/15,05:03:56+36,0"
```

- `AT+CCLK?` コマンドをUART通信で送信する

```
$ AT+CCLK?
+CCLK: "20/09/15,05:04:39+00"
```

# GNSS
GNSSはGPSを含む衛星測位システムの総称です。
GPSだけではなく、みちびきなどを併用することで、GPSだけでは位置測定できない場所でも位置測定が可能になります。

## GNSS起動

1. `AT+QGPSCFG` コマンドでGNSSの設定を行う
2. `AT+QGPS=1` コマンドでGNSSを起動する


## GNSS終了

- `AT+QGPS=0` コマンドでGNSSを終了する
 
もしくは

- `AT+QGPSEND` コマンドでGNSSの設定を行う

`AT+QGPS` コマンドで\<fixcount\>を設定することで、設定時間経過時に自動終了させることもできる

## GNSS位置計測

- `AT+QGPSLOC?` コマンドで位置情報を取得できる。

## GNSS起動時間
GNSSの起動時間は、GNSSがCold startかWarm startかHot startかで異なる。
Cold startなどの意味は以下のQ2を参照。
https://www.gpsdgps.com/qa.htm

また、XTRA Dataをダウンロードしているか、していないかでもGNSS起動時間は異なる。
qualcomm社の提供するXTRAデータをダウンロードすることで、起動後の位置計測に要する時間が短縮される。
XTRAの詳細は以下を参照。
https://www.qualcomm.com/news/releases/2007/02/12/qualcomm-introduces-gpsonextra-assistance-expand-capabilities-standalone

- Cold Start
    - XTRAなし：35秒
    - XTRAあり：18秒
- Warm Start
    - XTRAなし：26秒
    - XTRAあり：2.2秒
- Hot Start
    - XTRAなし：2.5秒
    - XTRAあり：1.8秒

## XTRAデータダウンロード
XTRAデータをダウンロードしてからのGNSS起動するには、例えば以下のように行う。

```
AT+QGPSXTRA=0
AT+QHTTPCFG="contextid",1 or  AT+QHTTPCFG="requestheader",0
AT+QHTTPURL=40,80
http://xtrapath1.izatcloud.net/xtra2.bin
AT+QHTTPGET=80 
AT+QHTTPREADFILE="UFS:xtra2.bin",80
AT+QGPSXTRA=1
AT+QGPSXTRATIME=0,"2020/11/11,11:11:11",1,1,5
AT+QGPSXTRADATA="UFS:xtra2.bin"
AT+QGPSXTRADATA?
AT+QGPS=1
```

実際のファームウェアでは、`AT+QGPSXTRATIME` を実行直前に、`AT+QGPSCFG` を実行し、それで取得した時刻データを使用している。

# 状態

## SIMの確認
- `AT+CPIN?` コマンドをUART通信で送信する

```
$ AT+CPIN?
+CPIN: READY

OK
```

## デバイス情報の確認
- `ATI` コマンドをUART通信で送信する


## 電波強度の確認
- `AT+CSQ` コマンドをUART通信で送信する

1番目の引数はRSSI、2番目の引数はdBm。
値が99の場合は、検出不可を意味している。

```
$ AT+CSQ
+CSQ: 22,99

OK
```

# ネットワーク

## ローミングの有効化
- `AT+QCFG=“roamservice”[,<roammode>[,<effect>]]` コマンドをUART通信で送信する

- roammode：roam serviceのモード
    - 1：roam service無効
    - 2：roam service有効
    - 255：自動
- effect：いつ有効化するか
    - 0：UE reboot後に有効化
    - 1 ：コマンド実行直後に有効化

例）直ちにroam serviceを有効にする場合

```
$ AT+QCFG="roamservice",2,1
OK
```

## 有効な基地局の検索
- `AT+COPS=?` コマンドをUART通信で送信する

```
$ AT+COPS=?
OK
+COPS: (3,"441 00","441 00","44100",7),(1,"440 00","440 00","44000",7),(1,"KDDI","KDDI","44051",7),(1,"KDDI","KDDI","44050",7),(1,"JP DOCOMO","DOCOMO","44010",7),(3,"440 11","440 11","44011",7),(1,"SoftBank","SoftBank","44020",7),,(0-4),(0-2)
```

結果は以下のフォーマットを持つ。

+COPS: (\<stat\> ,\<oper (in \<format\>=0)\>,””,\<oper (in \<format>=2)\>)

+COPS: [list of supported (\<stat\> ,\<oper (in \<format\>=0)\>,,\<oper (in <format>=2)\> )s][,,(list of supported \<mode\>s),(list of supported\<format\>s)]


- \<stat\>:operator availability
    - 0 - unknown：不明な基地局
    - 1 - available：利用可能な基地局
    - 2 - current：現在の基地局
    - 3 - forbidden：使用できない基地局

## 基地局の登録

### 自動登録
- `AT+COPS=0` コマンドをUART通信で送信する


### 手動登録
- `AT+COPS=1[,<format>[,<oper>[,<Act>]]]` コマンドをUART通信で送信する


operは基地局（Operator）。

- mode
    - 0：自動モード。 \<oper\>は省略
    - 1：手動モード。 \<oper\>に\<Act\>で指定した形式で基地局を設定
    - 2：登録解除
    - 3：\<format\>のみを設定
    - 4：自動で登録し、それに失敗した場合に、手動で登録する。
- format 
    - 0：\<oper\> は16文字
    - 1：\<oper\>は短縮形
    - 2：\<oper\>は識別番号


例）手動かつ番号で基地局を指定

```
$ AT+COPS=1,2,"44010"
OK
```


# MQTT通信
1例として、SORACOM Beamサービスを利用してGCPサーバとMQTT通信でPub/Subしてみる

## OPEN

```
AT+QICSGP=1,1,"soracom.io","sora","sora",0
AT+QIACT=1
AT+QMTOPEN=0,"beam.soracom.io",1883 
AT+QMTCONN=0,"projects/vigilant-router-xxxxxx/locations/asia-east1/registries/xxxx/devices/SOMENAME" 
```

## SUBSCRIBE

```
AT+QMTSUB=0,1,"/devices/SOMENAME/commands/#",0
```


## PUBLISH
文字数を指定しない場合

```
AT+QMTPUB=0,0,0,0,"/devices/SOMENAME/events"
{"Hello":"World1"}
```

最後にCtrl+zでPublish開始する。
マイコンなどでは、0x1aを送信すれば、Ctrl+zを入力したことになる。


文字数を指定する場合

```
AT+QMTPUBEX=0,0,0,0,"/devices/SOMENAME/events",18
{"Hello":"World2"}
```

## Configuration
GCPなどに登録したデータを読み出す場合にはsubscribeコマンドと類似した以下のコマンドを用いる。


```
AT+QMTSUB=0,1,"/devices/SOMENAME/config",0
```

このコマンドを実行すると、例えば以下のように設定したデータ`TestConfiguration,01234567890`が受信できる。

```Console
AT+QMTSUB=0,1,"/devices/SOMENAME/config",0
OK

+QMTSUB: 0,1,0,0

+QMTRECV: 0,0,"/devices/SOMENAME/config","TestConfiguration,01234567890"
```

一度データを受信すると、コマンドを再送信してもデータ受信できないのでご注意すること。
Configurationのデータに更新があるか、一度サーバと切断して、再接続すると、コマンド送信によりデータを再受信できるようになる。

GCPのConfiguration設定は、IoT Coreでデバイスの「レジストリ詳細」を開き、「構成を編集」からデータ入力画面に進むことができる。

![デバイスの編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/1ff9949c-98ed-a56d-d58a-3cbac4b2c901.png)

# 参照
- [【作業メモ】GPSロガーの作成](https://qiita.com/Kosuke_Matsui/items/572fa171b6d9bd141918)
    - 実際にLTE通信モジュールEC21Jを使用した実例を紹介しています
- [EC21-JとSORACOM IoT SIMによりGoogle IoT CoreでMQTT接続を行うまでの全過程の記録](https://qiita.com/Kosuke_Matsui/items/2ad4ba5f281cbc77e32b)


# 追記メモ
- 2021/07/19
    - Configuration追加