IoTサービスへのデータ送信(VPN) (M5Stack)
サンプルソースコード
概要
IIJ IoTの基本動作である、データ送信を実装してみます。
当サンプルでは、WireGuardで接続した後、httpプロトコルを使用して定期的にIIJ IoTサービスにデータ送信を行います。
今回は、M5Stack のCPU温度の値を送信しています。
ソースコード
m5stack_iijiot_vpn_datasend.ino
#include <M5Stack.h> #include <WiFi.h> #include <HTTPClient.h> #include <ArduinoJson.h> #include <WireGuard-ESP32.h> #include "lwip/dns.h" //--- TODO: WI-Fiルーターの SSIDとパスワードを指定してください const char* ssid = "YOUR_SSID"; const char* pass = "YOUR_PASSWORD"; //--- //--- TODO: 自身のVPNアクセスの設定に書き換えてください。 const IPAddress local_ip(10, 10, 10, 10); //IPアドレス const char public_key[] = "YOUR PUBLIC KEY"; //公開鍵 const char private_key[] = "YOUR PRIVATE KEY"; //秘密鍵 const char endpoint_address[] = "vgw001.to.iot.iij.jp"; //接続先アドレス const int endpoint_port = 9999; //接続先ポート番号 //--- const int delay_sec = 60; const char* iij_iot_uri = "http://gw.iot.iij.jp/v1"; static WireGuard wg; /* setup関数 */ void setup() { //M5Stackを初期化 M5.begin(); M5.Power.begin(); //Wi-Fi接続 WiFi.begin(ssid, pass); M5.Lcd.printf("Waiting connect to WiFi: %s ", ssid); while(WiFi.status() != WL_CONNECTED) { //接続完了まで待つ delay(1000); M5.Lcd.print("."); } //接続完了したらIPアドレスとMacアドレスを表示する M5.Lcd.println("\nWiFi connected"); M5.Lcd.print("IP address: "); M5.Lcd.println(WiFi.localIP()); M5.Lcd.print("MAC address:"); M5.Lcd.println(WiFi.macAddress()); delay(500); //現在時刻をセット M5.Lcd.println("Adjusting system time..."); configTime(9 * 60 * 60, 0, "ntp.jst.mfeed.ad.jp", "ntp.nict.jp", "time.google.com"); delay(2000); //WireGuardでVPN接続する M5.Lcd.println("Initializing WireGuard..."); if (wg.begin( local_ip, private_key, endpoint_address, public_key, endpoint_port)) { M5.Lcd.println("VPN connected."); //--- DNS参照先をVPN側に向ける ip_addr_t dnsserver = IPADDR4_INIT_BYTES(10, 64, 2, 11); dns_setserver(0, &dnsserver); } else { M5.Lcd.println("WireGuard initializing Failed."); } delay(3000); } /* 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); //JSON文字列をIIJ IoTサービスにPOST HTTPClient http; http.begin(iij_iot_uri); http.addHeader("Content-type", "application/json"); http.addHeader("Host", "gw.iot.iij.jp"); int status_code = http.POST(body_string); http.end(); return status_code >= 200 && status_code < 300; } /* loop関数 */ void loop() { //CPU温度を取得 float temp = temperatureRead(); //データ送信 if (send_data("M5Stack", "temperature", temp)) { M5.Lcd.printf("data send OK: temp=%f \n", temp); } else { M5.Lcd.println("data send NG."); } //待つ delay(delay_sec * 1000); }
実行結果
M5Stack側は、Wi-Fi接続・VPN接続後、60秒ごとにCPU温度をデータ送信し、結果をLCD画面に出力します。
IIJ IoTサービスのコントロールパネルにログインし、デバイスモニタリングの画面を確認すると、送信したデータのグラフが表示されていることが確認できます。
各種情報へのリンク
IIJ IoTサービスマニュアル
M5Stack
WireGuard-ESP32-Arduino
ArduinoJson