Скетч Arduino — как добавить временную метку для исходящего MQTT

Я пишу скетч для загрузки на устройство Sonoff (дистанционное реле на базе ESP8266).

Все работает отлично, но я хочу, чтобы мои публикации MQTT содержали следующий формат:

[ ДАТА И ВРЕМЯ ] сообщение

ESP8266 подключен к Интернету. Я ищу способ сделать это (включая периодические обновления времени), не запуская всю память объемом 1 МБ, то есть: код, который 1) получить время из внешнего источника (LAN или WAN) 2) обновлять каждые 24 часа 3) Облегченный код?

Спасибо

, 👍0

Обсуждение

пожалуйста, задайте конкретный вопрос, @jsotola

обновлено, хотя это казалось простым, @Guy . D

посмотрите NTC, я думаю, там есть встроенный пример, если нет, то это очень распространенная библиотека с примерами, добавленными в менеджер., @dandavis

@dandavis Вы, конечно, имеете в виду NTP..., @Majenko

@Majenko: молодец, это я и имел в виду, NTP. Протокол сетевого времени., @dandavis


1 ответ


1

Начнем с примера ESP8266WiFi "NTPClient" . Это научит вас, как получить время "Unix Epoch" из Интернета.

Это значение можно напрямую передать в TimeLib, чтобы отслеживать время (действительно, TimeLib включает в себя пример NTP для Arduino Ethernet, который должен помочь вам начать работу). Делайте это периодически (ежедневно, ежечасно, как угодно), и у вас будет время. Затем TimeLib может предоставить вам дату и время в виде отдельных компонентов (часы, минуты и т. д.), которые вы затем можете объединить (я бы использовал snprintf) для включения в ваше сообщение MQTT:

int len = strlen(message) + 25;
char mqttMessage[len];
snprintf(mqttMessage, len, "[%04d/%02d/%02d %02d:%02d:%02d] %s",
    year(), month(), day(), hour(), minute(), second(), message);

mqttMessage => "[2018/08/11 20:36:24] foo"
,