// MQTT Publisher example 
//#include <M5StickCPlus.h>
#include <WiFi.h>
// ライブラリで PubSubClient をいれておく ★★★ 重要 ★★★
#include <PubSubClient.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***"; // 講義システム（三浦担当講義用）を参照すること。
const char* mqpass   = ""; // 講義システム（三浦担当講義用）を参照すること。
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);

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

void loop() {
  // シリアルコンソールから書き込みがあれば, publishする
  byte mbuf[100];  int pos = 0;
  while (Serial.available()) { // ノンブロッキング
    mbuf[pos]  = Serial.read();
    pos++;
  }
  if (pos > 0) {
    mbuf[pos-1] = 0; //改行をNULLに置き換える
    Serial.println((char*)mbuf);
    // ブローカにデータを送信する。最後の false を true にすると、retained になる。
    bool ret = mqttClient.publish(pubTopic, mbuf, pos-1, false); 
    if (!ret){
      Serial.println("publish failed.");
    }
  }
  delay(10);
}

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());
    }
  }
}
