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