Я работаю над кодом для моего ESP8266 в Arduino. Я хочу отправить метку времени другому ESP через UDP.
В setup(){
я инициализирую время, используя
configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
и в loop(){
time_t timestamp = time(nullptr);
чтобы получить время. Затем я отправляю его в другой ESP
Udp.write(ctime(×tamp));
Где мне нужно снова сделать time_t, чтобы сравнить его с фактическим временем.
Но для целей тестирования я отправляю время как символ через терминал в UDP, используя echo -n "Fri Feb 28 14:44:11 2020" >/dev/udp/192.168.43.248/4210
из моего MacBook Pro (MacOS Mojave).
Последовательный монитор показывает, что на входе выводятся следующие данные:
UDP packet contents: Fri Feb 28 14:44:11 2020
Wed Dec 31 23:59:59 1969
Мой код:
time_t convertStringToTime_t(char timestamp []) {
time_t result = time(NULL);
const char *timestampString = timestamp;
int weekDay, month, dd, hh, mm, ss, yyyy = 0;
struct tm timestampFromString = {0};
//input Fri Feb 28 16:40:11 2020
//output Wed Dec 31 23:59:59 1969 TODO always same output?!
sscanf(timestampString, "%s %s %d %d:%d:%d %d", &weekDay, &month, &dd, &hh, &mm, &ss, &yyyy);
timestampFromString.tm_year = yyyy - 1900; //years since 1900
timestampFromString.tm_mon = month - 1;
timestampFromString.tm_wday = weekDay;
timestampFromString.tm_mday = dd;
timestampFromString.tm_hour = hh;
timestampFromString.tm_min = mm;
timestampFromString.tm_sec = ss;
timestampFromString.tm_isdst = -1;
result = mktime(×tampFromString);
// mktime Convert tm structure to time_t
return result;
}
Я видел эту ветку , но это мне совсем не помогло: / Я также пытался использовать sscanf
, но без разницы. Я думаю, что я что-то не так делаю в scanf
?
решено: Благодаря @thomachan я понял, что попытался поместить символы месяца + дня в целые числа (я мог бы решить это путем преобразования chars to ints).
Но я слушал @Maxim Egorushkin и использовал более простой подход, используя значение time_t:
char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);