esp_mqttを使ってみる

NTP Client機能


esp-mqttにはNTP(Network Time Protocol)クライアントの機能が有ります。
この機能を有効にすると、NTPサーバーの現在時刻を、特定のトピックでPublishしてくれます。

まず、esp_mqttにtelnetかシリアルで接続しuplink AP(インターネットにつながるAP)とNTPサーバーの設定を行います。
シリアルで接続するとリセット後の動作を確認することができます。
CMD>set ssid aterm-e625c0-g →  uplinkルーターの SSID
SSID set (auto_connect = 1)

CMD>set password xxxxxxxxxxxxx → uplinkルーターのパスワー ド
Password set

CMD>set ntp_timezone 9
NTP timezone set to 9 h

CMD>time
Wed 21:56:01

CMD>save
Config saved

CMD>reset

ファームを書き込んだESP8266以外に、もう1台のESP8266を用意し、以下のスケッチを書き込みます。
このスケッチでは、esp_mqttからIPアドレスを取得したのち、esp_mqttから現在時刻をSubscribeします。
現在日時は「$SYS/broker/time」のトピックでesp_mqttから配信されます。
/*
 * subscribe from esp_mqtt server
 * https://github.com/martin-ger/esp_mqtt
 */

#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient

#define MQTT_SERVER     "192.168.4.1" // esp_mqtt server
#define MQTT_PORT       1883
#define MQTT_TOPIC      "nopnop2002/#" // You can change
#define SYSTEM_TOPIC    "$SYS/broker/time" // Reserved

const char* SSID = "MyAP";
const char* PASSWORD = "";

WiFiClient espClient;
PubSubClient client(espClient);

void errorDisplay(char* buff) {
  Serial.print("Error:");
  Serial.println(buff);
  while(1) {
    delay(200);
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup() {
  delay(1000);Serial.begin(9600);
  Serial.print("Wait for WiFi...");
  WiFi.begin(SSID, PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("subnetMask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(WiFi.gatewayIP());

  Serial.print("Connect to ");
  Serial.println(MQTT_SERVER);
  client.setServer(MQTT_SERVER, MQTT_PORT);
  client.setCallback(callback);

  char clientid[20];
  sprintf(clientid,"ESP8266-%06x",ESP.getChipId());
  Serial.print("clientid=");
  Serial.println(clientid);
  Serial.print("Attempting MQTT connection...");
  // Attempt to connect
  if (!client.connect(clientid)) {
    errorDisplay("connect Fail");
  }
  Serial.println("connected");
  client.subscribe(MQTT_TOPIC);
  client.subscribe(SYSTEM_TOPIC);
 
}

void loop() {
  client.loop(); // Receive MQTT Event
}

スケッチを実行すると以下の表示となります。
1秒ごとに現在時刻をesp_mqttからSubscribeできます。


毎秒ではなく、例えば1分毎とか1時間毎とか、通知の時間間隔が指定できると嬉しいかもしれません。

続く...