SORACOM M5STACK 3G拡張ボードでUSSD送信

経緯

前回の投稿『M5STACK 3G拡張ボードがIPを取得するまで』、でサーバにデータを送れるまで、1分近くかかるということで、どうかな?と思っていたんですが、『SORACOM IoT SIM』は、日本を含む世界中で利用できるSIMだったりするのですが、国内向けのSIMにはない特徴を持っていて、USSD(Unstructured Supplementary Service Data )経由でサーバにデータを送ることができます。

詳しくは、https://dev.soracom.io/jp/docs/ussd/を参照ください。

早速コード

#include <M5Stack.h>

#define CONSOLE Serial
#define MODEM Serial2

#define TINY_GSM_DEBUG Serial
#define TINY_GSM_MODEM_UBLOX

#include <TinyGsmClient.h>

TinyGsm modem(Serial2);
TinyGsmClient ctx(modem);

void setup() {
  M5.begin();
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.println(F("M5Stack + 3G Module"));

  MODEM.begin(115200, SERIAL_8N1, 16, 17);    // 3G MODULE

  uint64_t t1 = millis();

  CONSOLE.println(F("waitForNetwork()"));
  M5.Lcd.print(F("waitForNetwork()"));
  while (!modem.waitForNetwork()) M5.Lcd.print(".");
  M5.Lcd.println(F("Ok"));

  CONSOLE.printf("Time = %d [ms]\r\n",millis() - t1);

  CONSOLE.println("Send USSD!!!");
  MODEM.write("AT+CUSD=1,\"*901011*123#\",15\r");
}

void loop() {
  if (MODEM.available() > 0) {
    CONSOLE.write(MODEM.read());
  }

  if (CONSOLE.available()) {
    MODEM.write(CONSOLE.read());
  }
}

動作ログ

14:04:24.058 -> waitForNetwork()
14:04:24.058 -> [766] ### AT: +CGREG?
14:04:25.070 -> [1767] ### AT: +CGATT?
14:04:26.298 -> [3017] ### AT: +CGREG?
14:04:27.299 -> [4017] ### AT: +CGATT?
14:04:27.557 -> [4276] ### AT: +CGREG?
14:04:27.845 -> [4533] ### AT: +CGREG?
14:04:28.066 -> [4789] ### AT: +CGREG?
14:04:28.346 -> [5044] ### AT: +CGREG?
14:04:28.600 -> [5299] ### AT: +CGREG?
14:04:28.847 -> [5554] ### AT: +CGREG?
14:04:29.105 -> [5809] ### AT: +CGREG?
14:04:29.364 -> [6064] ### AT: +CGREG?
14:04:29.612 -> [6319] ### AT: +CGREG?
14:04:29.865 -> [6575] ### AT: +CGREG?
14:04:30.107 -> [6830] ### AT: +CGREG?
14:04:30.394 -> [7086] ### AT: +CGREG?
14:04:30.644 -> [7342] ### AT: +CGREG?
14:04:30.894 -> [7597] ### AT: +CGREG?
14:04:31.157 -> [7853] ### AT: +CGREG?
14:04:31.398 -> [8108] ### AT: +CGREG?
14:04:31.646 -> [8364] ### AT: +CGREG?
14:04:31.902 -> [8619] ### AT: +CGREG?
14:04:32.152 -> [8875] ### AT: +CGREG?
14:04:32.434 -> [9130] ### AT: +CGREG?
14:04:32.682 -> [9385] ### AT: +CGREG?
14:04:32.942 -> [9640] ### AT: +CGREG?
14:04:33.186 -> [9895] ### AT: +CGREG?
14:04:33.443 -> [10151] ### AT: +CGREG?
14:04:33.692 -> [10406] ### AT: +CGREG?
14:04:33.943 -> [10662] ### AT: +CGREG?
14:04:34.202 -> [10918] ### AT: +CGREG?
14:04:34.482 -> [11173] ### AT: +CGREG?
14:04:34.729 -> [11428] ### AT: +CGREG?
14:04:34.979 -> [11683] ### AT: +CGREG?
14:04:35.232 -> [11938] ### AT: +CGREG?
14:04:35.479 -> [12193] ### AT: +CGREG?
14:04:35.729 -> [12449] ### AT: +CGREG?
14:04:35.985 -> [12705] ### AT: +CGREG?
14:04:36.270 -> [12960] ### AT: +CGREG?
14:04:36.270 -> Time = 12201 [ms]
14:04:36.270 -> Send USSD!!!
14:04:36.270 -> AT+CUSD=1,"*901011*123#",15

14:04:39.793 -> +CUSD: 0,"sent to Beam",15
14:04:39.793 -> 
14:04:39.793 -> OK

解説

USSDは、3Gの回線がつながれば、送信できるということなので、waitForNetwork()で3G回線接続が12秒で、完了したら、USSDを送信する(データは123)というだけのコードになっています。SORACOM Beam経由で任意のサーバにデータを届けることができます。

例のボタンよりは遅いけど、まあ、IP接続の1分に比べれば、12秒なら我慢できるか?

以上、ご参考までに