ESP32-DevKitC-32E + SIM7080G CAT-M/NB-IoT Unit で HTTP通信

## 概要
ESP32開発ボードと通信モジュールを使って通信する。

## 環境
|||
|-|-|
|ESP32開発ボード|ESP32-DevKitC-32E (技適◎)<br />https://www.espressif.com/en/products/devkits/esp32-devkitc|
|通信モジュール|SIM7080G CAT-M/NB-IoT Unit (技適◎)<br />https://shop.m5stack.com/products/sim7080g-cat-m-nb-iot-unit|
|SIM|SORACOM IoT SIM (plan-D)<br />https://soracom.jp/store/13380/|
|Editor|Visual Studio Code<br />https://code.visualstudio.com/|
|IDE|PlatformIO<br />https://platformio.org/|
|Library|TinyGSM@^0.11.5<br />https://github.com/vshymanskyy/TinyGSM<br />ArduinoHttpClient@^0.4.0<br />https://github.com/arduino-libraries/ArduinoHttpClient|

## 配線
|ESP32-DevKitC-32E|SIM7080G CAT-M/NB-IoT Unit|
|:-:|:-:|
|5V|5V|
|GND|GND|
|Serial2 RX:16|TXD|
|Serial2 TX:17|RXD|

## 実装
TinyGSM のサンプルを削りながら実装。
SORACOMのAPNについては、以下を参照。
https://soracom.jp/start/

```
#define TINY_GSM_MODEM_SIM7080

#define GSM_AUTOBAUD_MIN 9600
#define GSM_AUTOBAUD_MAX 115200

const char apn[] = "soracom.io";
const char gprsUser[] = "sora";
const char gprsPass[] = "sora";

const char server[] = "vsh.pp.ua";
const char resource[] = "/TinyGSM/logo.txt";
const int port = 80;

#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>

TinyGsm modem(Serial2);
TinyGsmClient client(modem);
HttpClient http(client, server, port);

void setup()
{
  Serial.begin(115200);
  delay(10);

  TinyGsmAutoBaud(Serial2, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);

  modem.restart();

  Serial.println("@ Wait For Network @");
  if (!modem.waitForNetwork())
  {
    // TODO:エラー処理
    return;
  }

  Serial.println("@ Wait For Network Connected @");
  if (!modem.isNetworkConnected())
  {
    // TODO:エラー処理
    return;
  }

  Serial.println("@ Connect GPRS: " + String(apn) + " @");
  if (!modem.gprsConnect(apn, gprsUser, gprsPass))
  {
    // TODO:エラー処理
    return;
  }

  Serial.println("@ Connected GPRS @");
  if (!modem.isGprsConnected())
  {
    // TODO:エラー処理
    return;
  }

  Serial.println("@ HTTP Get @");
  int err = http.get(resource);
  if (err != 0)
  {
    // TODO:エラー処理
    return;
  }

  int status = http.responseStatusCode();
  Serial.println("@ Status Code: " + String(status) + " @");
  if (!status)
  {
    // TODO:エラー処理
    return;
  }

  Serial.print("@ Header @");
  while (http.headerAvailable())
  {
    String headerName = http.readHeaderName();
    String headerValue = http.readHeaderValue();
    Serial.println("    " + headerName + " : " + headerValue);
  }

  int length = http.contentLength();
  if (length >= 0)
  {
    Serial.println("@ Content length: " + String(length) + " @");
  }

  Serial.println("@ Body @");
  String body = http.responseBody();
  Serial.println(body);

  http.stop();
  Serial.println("@ Stop HTTP @");

  modem.gprsDisconnect();
  Serial.println("@ Disconnect GPRS @");
}

void loop()
{
}
```

## 検証
アップロードしシリアルモニターで取得できることを確認。

```
@ Wait For Network @
@ Wait For Network Connected @
@ Connect GPRS: soracom.io @
@ Connected GPRS @
@ HTTP Get @
@ Status Code: 200 @
@ Header @    Server : nginx/1.10.3 (Ubuntu)
    Date : Mon, 13 Jun 2022 08:31:46 GMT
    Content-Type : text/plain; charset=UTF-8
    Content-Length : 121
    Connection : close
    X-Powered-By : Express
    Access-Control-Allow-Origin : *
    Access-Control-Allow-Headers : X-Requested-With
    Cross-Origin-Resource-Policy : cross-origin
    Accept-Ranges : bytes
    Cache-Control : public, max-age=86400
    Last-Modified : Wed, 27 Sep 2017 09:03:12 GMT
    ETag : W/"79-15ec2936080"
@ Content length: 121 @
@ Body @

  _____            _____  _____  _____
    |  | |\ | \_/ |  ___ |_____ |  |  |
    |  | | \|  |  |_____| _____||  |  |


@ Stop HTTP @
@ Disconnect GPRS @
```

## 所感
```### Unhandled:〜```といったログが何度も表示され原因が判らなかったが、配線とコーディングをやり直したら発生しなくなった。配線が間違っていたのではないかと思われる。

PWRKEYの設定が必要かと考えたが、CAT-Mからは端子が出ておらず何も設定できなかった。CAT-M側で設定してくれているのかもしれない。

技適対応済の構成で簡単に試すことが出来ました。