LTE-MモジュールSIM7080Gをpython&micropythonで使う

# はじめに

前回こちらの記事では**M5Stack CAT-M UNIT（SIM7080G搭載）** を
M5sticckCのarduino開発環境で使ってみました
[M5Stack CAT-M UNIT をSORACOMで使う](https://qiita.com/m_take/items/e2d946cbaf5b4131116d)

今回はラズパイのpythonとラズパイPicoのmicropython を使ってHTTP POST/GET　をやってみました。
送信先には[**Abmient**](https://ambidata.io/)を、simは[**povo**](https://povo.jp/)を使うことによりWifiのない屋外でもランニングコストは無料でIoT を試せます。

**arduino** 開発環境(マイコンはESP8266/ESP32)では[**TinyGsm**](https://github.com/vshymanskyy/TinyGSM)　と　[**Ambient_ESP8266_lib**](https://github.com/AmbientDataInc/Ambient_ESP8266_lib)　が用意されていてそれらを利用することによりSIM7080GモデムでTCP、HTTP、HTTPSの通信が可能です。

一方 **python/micropython** では　[**ambient-python-lib**](https://github.com/AmbientDataInc/ambient-python-lib) はあるものの**requests/urequests** はWifiを利用して接続するのでSIM7080Gモデムで通信するようにするやり方がわかりませんでした。
（そもそもラズパイPicoのmicropythonにはurequestsが入っていない）
仕方ないのでATコマンドを直接送ることで通信します。

※なおラズパイPicoにはArduino開発環境もあるのでそれを使うこともできます
参考記事

https://qiita.com/kaz19610303/items/38e30ab7dbfb40b87d85

# UART でATコマンド送信

~~コピペ~~参考にしたのはこちらのサンプルコード
https://www.waveshare.com/wiki/Pico-SIM7080G-Cat-M/NB-IoT#HTTP

micropythonでは
```py
import machine
port = 0 #GPIO0=TX GPIO1=RX
baudrate = 115200
modem = machine.UART(port, baudrate)
modem.write(('AT' + '\r\n').encode())
while (utime.ticks_ms() - prvmills) < timeout:
    if modem.any():
        rec_buff = b"".join([rec_buff, modem.read(1)])

```
　
pythonでは
ラズパイでSerialを有効にし

https://www.ingenious.jp/articles/howto/raspberry-pi-howto/gpio-uart/

```
pip3 install pyserial
```
でpyserialをインストールしたうえで

```py
import serial
port= '/dev/ttyAMA0' #GPIO14=TX GPIO15=RX
baudrate = 115200
modem  = serial.Serial(port, baudrate)
modem.write(('AT' + '\r\n').encode())
if modem.inWaiting():
    time.sleep(0.1 )
    rec_buff = modem.read(modem.inWaiting())
```
こんな感じで送受信してます

ちなみにM5Stack CAT-M UNITのGROVE端子には
[Pi Pico v1.0用Grove シールド](https://www.switch-science.com/catalog/7109/)
[GROVE - ベースHAT for Raspberry Pi](https://www.switch-science.com/catalog/5336/)
を使うと簡単に接続できます。なお電源電圧は5Vでも3.3Vでも動作しました
![スクリーンショット 2022-04-18 172039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/b5bdfad9-1c6f-224b-8ff6-e3bfacd2fe66.png)
![スクリーンショット 2022-04-18 172111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261581/0ddbe4f0-0c7e-4f97-c116-44a01bb999d5.png)



ambientの接続先は

```
http_get_server = ['http://ambidata.io', 'api/v2/channels/' +str(channelID) +'/data?readKey=' +str(readKey)]
http_post_server = ['http://ambidata.io', 'api/v2/channels/' + str(channelID) + '/data']
```
GET ではurlに例えば **&n=10** をつなげると最新から10回分のjsonを返してくれて
POST ではheaderに　**"Content-Type","application/json"**　を指定しbodyに **{"writeKey":"xxxxxxxx","d1":"123.456"}** といった形式で送ります


| Command | 説明 |
|:-:|:-:|
| AT+CPIN |　Check SIM card status |
| AT+CSQ | Check RF signal |
| AT+CGAPN | Query network after the successful registration of APN |
| AT+CNACT | Activating network bearing |
| AT+CGREG | Check PS service |
|||
| AT+SHCONF  | Set HTTP Parameter  |
| AT+SHBOD | Set Body   |
| AT+SHAHEAD   |  Add Head |
| AT+SHCONN  |  HTTP Connection   |
| AT+SHREQ | Set request|
| AT+SHSTATE | Get HTTP status |
| AT+SHREAD | Read data|
| AT+SHDISC | Disconnect HTTP connect|

こういったATコマンドを利用しています。詳しくはマニュアルを見てください

https://www.waveshare.com/wiki/File:SIM7080_Series_AT_Command_Manual_V1.02.pdf
https://www.waveshare.com/wiki/File:SIM7080_Series_HTTP(S)_Application_Note_V1.01.pdf



以上なんとか動いたのでサンプルコードをGithubに置いておきます
https://github.com/mnltake/SIM7080_povo_ambient