IoTサービスへのデータ送信 (M5Stamp PICO + CAT-M Module)
サンプルソースコード
概要
IIJ IoTの基本動作である、データ送信を実装してみます。
当サンプルでは、httpプロトコルを使用して、定期的にIIJ IoTサービスにデータ送信を行います。
今回は、乱数値を送信しています。
ソースコード
m5stamp_iijiot_datasend.ino
#define TINY_GSM_MODEM_SIM7080
//#define TINY_GSM_DEBUG Serial
#define SerialMon Serial
#define SerialAT Serial1
#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
#include <ArduinoJson.h>
//--- TODO: 使用するSIMのAPN情報に書き換えてください。
const char apn[] = "iot.iijmobile.jp"; // "h.iijmobile.biz";
const char lte_user[] = "mobile@iot";
const char lte_pass[] = "iot";
//---
const int rx_pin = 18;
const int tx_pin = 19;
const int sleep_sec = 60;
const char* iij_iot_host = "gw.iot.iij.jp";
const char* iij_iot_path = "/v1";
//Global
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
/*
setup関数
*/
void setup() {
delay(500);
SerialMon.begin(115200);
SerialAT.begin(115200, SERIAL_8N1, rx_pin, tx_pin);
delay(3000);
SerialMon.println("Wait...");
//モデム初期化
SerialMon.println("Initializing modem...");
modem.init();
String modemInfo = modem.getModemInfo();
SerialMon.println("Modem Info: " + modemInfo);
//接続
SerialMon.println("Connecting to "+ String(apn));
while (!modem.gprsConnect(apn, lte_user, lte_pass)) {
SerialMon.println("NG.");
delay(10000);
SerialMon.println("retry");
}
SerialMon.println("OK.");
//接続まち
SerialMon.print("Waiting for network...");
if (!modem.waitForNetwork()) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" success");
bool res = modem.isGprsConnected();
SerialMon.printf("GPRS status: %s\n", res ? "connected" : "not connected");
//各種情報を出力
String ccid = modem.getSimCCID();
SerialMon.println("CCID: "+ ccid);
String imei = modem.getIMEI();
SerialMon.println("IMEI: "+ imei);
String cop = modem.getOperator();
SerialMon.println("Operator: "+ cop);
IPAddress local = modem.localIP();
SerialMon.print("Local IP: ");
SerialMon.println(local);
int csq = modem.getSignalQuality();
SerialMon.print("Signal quality: ");
SerialMon.println(csq);
//乱数を初期化
randomSeed(analogRead(25));
}
/*
IIJ IoTサービスにデータ送信する
引数
const char* ns : 送信する namespace値
const char* name : 送信する name値
const double value : 送信する value値
戻り値
bool true:送信成功 false:送信失敗
*/
bool send_data(const char* ns, const char* name, const double value) {
//JSONオブジェクトを作成
StaticJsonDocument<JSON_OBJECT_SIZE(3)> body;
if (ns != nullptr && strlen(ns) > 0) {
body["namespace"] = ns;
}
body["name"] = name;
body["value"] = value;
//JSONを文字列に変換
String body_string;
serializeJson(body, body_string);
SerialMon.println("POST: " + body_string);
//JSON文字列をIIJ IoTサービスにPOST
HttpClient http(client, iij_iot_host, 80);
http.beginRequest();
http.post(iij_iot_path);
http.sendHeader("Content-type", "application/json");
http.sendHeader("Content-length", body_string.length());
http.beginBody();
http.print(body_string);
http.endRequest();
int status_code = http.responseStatusCode();
return status_code >= 200 && status_code < 300;
}
/*
loop関数
*/
void loop() {
//乱数を生成する
int value = random(10000);
//データ送信する
bool ok = send_data("m5stamp", "test", value);
SerialMon.println(ok ? "OK" : "NG");
//待つ
delay(sleep_sec * 1000L);
}
実行結果
M5Stamp PICO は、LTE回線接続後、60秒ごとに乱数をデータ送信します。結果はシリアルモニタに出力されます。
Wait...
Initializing modem...
Modem Info: R1951.04
Connecting to iot.iijmobile.jp
OK.
Waiting for network... success
GPRS status: connected
CCID: XXXXXXXXXXXXXXXXXXXXX
IMEI: YYYYYYYYYYYYYYY
Operator: NTT DOCOMO
Local IP: 10.ZZ.ZZZ.ZZZ
Signal quality: 21
POST: {"namespace":"m5stamp","name":"test","value":6565}
OK
POST: {"namespace":"m5stamp","name":"test","value":3896}
OK
IIJ IoTサービスのコントロールパネルにログインし、デバイスモニタリングの画面を確認すると、送信したデータのグラフが表示されていることが確認できます。

各種情報へのリンク
IIJ IoTサービスマニュアル
M5Stamp
TinyGSM
Arduino_JSON
ArduinoHttpClient