// MQTT Subscriber example 
// #include <M5StickCPlus.h>
#include <WiFi.h>
// ライブラリで PubSubClient をいれておく ★★★ 重要 ★★★
#include <PubSubClient.h>
// ライブラリで ArduinoJson v6.xをいれておく ★★★ 重要 ★★★
//        (注意：Arduino_Json v0.1.0 は別物)
#include <ArduinoJson.h>

const char* ssid = "miura2g";
const char* password = "jikken2022";

const char* server = "192.168.11.11"; // "mqtt.istlab.info";
const int   port     = 1883;                   // 注：学内ネットワークはポート制限あり。
const char* pubTopic = "office/temp"; // 例： ex1/groupXX/sensor 
const char* mquser   = "ex1";
const char* mqpass   = "***PASSWORD***";
WiFiClient wifiClient;
char* clientid = "m5stickc01_00000001"; //デバイス個別に設定すればなんでもよい
PubSubClient mqttClient(wifiClient); // MQTT Client

void setup() {
//  M5.begin();
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    Serial.print(".");
    delay(200);
  }
  Serial.println( WiFi.localIP().toString() ); //取得したIPアドレス
  // 参考：WiFiデバイスのMACアドレスを取得し、clientid として用いる
  // (18行目のclientidの定義を変更し、char clientid[20]とするのがのぞましい)
  //  uint8_t mac[6];
  //  esp_read_mac(mac, ESP_MAC_WIFI_STA);
  //  sprintf(clientid, "%02X:%02X:%02X:%02X:%02X:%02X",
  //          mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] );
  mqttClient.setServer(server, port);
  mqttClient.setCallback(callback_on_subscribe);

  if (!mqttClient.connected()) {
    Serial.println("Try (re)connecting...");
    reconnect();
  }
  mqttClient.subscribe(pubTopic);

}

void loop() {

  mqttClient.loop(); // データがpublishされたら、callback_on_subscribe が呼ばれる

  delay(100);
}

void reconnect() {
  while (!mqttClient.connected()) {
    if (mqttClient.connect(clientid, mquser, mqpass)) {
      Serial.println("Connected to MQTT Broker.");
    } else {
      Serial.printf("Connect Failed. state=%d", mqttClient.state());
    }
  }
}

// データがPublishされたら、ここが実行される。（39行目でコールバック関数を設定しているため）
void callback_on_subscribe(char* topic, byte* payload, unsigned int len) {
  char buf[100];
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < len ; i++) {
    buf[i] = (char)payload[i];
  }
  buf[len] = 0;
  Serial.println(buf);
  return;
  //  参考：JSON Parsing example
  //  StaticJsonDocument<200> sjdoc;
  //  deserializeJson(sjdoc, buf);
  //  int intval = sjdoc["intval"];
  //  const char* str = sjdoc["string"];
}