我正在为Arduino中的ESP8266开发一些代码。我想通过UDP将时间戳发送到另一个ESP。
在setup(){
中,我使用
configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
和loop(){
time_t timestamp = time(nullptr);
获取时间。然后,我将其发送到另一个ESP
Udp.write(ctime(×tamp));
我需要再次设置time_t并将其与实际时间进行比较。
但是出于测试目的,我使用MacBook Pro(MacOS Mojave)中的echo -n "Fri Feb 28 14:44:11 2020" >/dev/udp/192.168.43.248/4210
通过UDP终端以char形式发送时间。
串行监视器显示输入和输出如下:
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;
}
我看到了this thread,但对我没有任何帮助:/
我也尝试使用sscanf
,但没有区别。我认为我在scanf
中做错了吗?
已解决: 多亏了@thomachan,我才意识到我试图将Month + Day字符放入int(我可以通过将chars转换为int来解决这个问题)。
但是我听了@Maxim Egorushkin,并使用了更简单的方法,使用了time_t值:
char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);
答案 0 :(得分:1)
如果您有选择,建议您改为通过a ISO-8601 timestamp。看起来像
2020-03-03T10:28:59
并用sscanf
(为您提供组件)或strptime
(填充struct tm
)进行了简单分析。如果您的平台不提供strptime
实施,则可以使用BSD中的一种。
答案 1 :(得分:1)
如果您不需要人类可读的时间,则可以发送time_t
的值-自Unix时代以来的秒数。
date +%s > /dev/udp/192.168.43.248/4210
接收方可以使用std::strtoul
将其从字符串解析为time_t
。