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