【问题标题】:NodeMCU Time zone based SNTP synchronization [duplicate]基于NodeMCU时区的SNTP同步[重复]
【发布时间】:2017-10-25 06:31:59
【问题描述】:

我有一块 ESP8266 NodeMCU 板。我已经在上面加载了基于 NodeMCU Lua 的固件,并且需要准确的时间来安排一些功能。我使用他们的云服务和以下模块构建了二进制文件:rtctimesntpcron 等等。

如何使用sntp 模块设置当地时间?我的本地时间与 UTC 有 19800(5.5 小时 IST)的偏移量。

我无法在sntp.setoffset(offset) 调用中设置此偏移量

> sntp.setoffset(19800)
> sntp.getoffset()
88
>

为什么getoffset 打印88

更新:在sntp.sync() 的成功回调中使用rtctime.set(seconds_since_unix_epoch) 将RTC 设置为本地时间可以正常工作。

function sntp_sync_time()
  sntp.sync(nil, function(sec, usec, server, info) rtctime.set(sec + 19800) end, sntp_sync_time, 1)
end

我也在失败回调中递归调用相同的函数,直到没有成功同步。

谢谢

【问题讨论】:

  • 您的 5.5h 巨大偏移量是否表明您正在(ab)使用 SNTP 偏移量进行时区处理?如果是这样,请参阅stackoverflow.com/a/44142782/131929 示例。
  • 是的,你是对的。我这样做是为了处理时区。但是我看到您已经在成功回调中添加了时区偏移量(在您的链接答案中),这是否意味着 RTC 将与 UTC 而不是时区同步?还是我还需要在成功回调中做rtctime.set(now+tz.getoffset(now))
  • 我不知道,但我想说 SNTP 和 RTCtime 应该单独处理以在内部处理 UTC。时区调整,即 UTC 到时区的转换应该在我们在示例中建议的那些模块外部完成(我在那个答案中复制了)。
  • @MarcelStör 谢谢。我想我每次使用 RTC 来安排某些事情时都必须添加偏移量。我会更新问题并将其标记为重复。

标签: lua esp8266 nodemcu


【解决方案1】:

看起来很奇怪。
19800(01001101 01011000)的最低有效字节为88(01011000)。

我对 Lua 及其与 C 的绑定不太熟悉,但我检查了源代码并发现 setoffsetgetoffsetvariable the_offest which is defined as uint8_t 一起使用。

因为the docs说,偏移量是秒数,一个字节太小,我会说这是一个bug。

正如 Marcel Stör 在 cmets 中所解释的,sntp.setoffset 并不适用于时区偏移,这意味着不支持大偏移。
您应该使用tz module 来处理时区。

【讨论】:

  • 哇,19800和88之间的相关性分析得很巧妙*掌声*
  • @gre_gor 感谢指出88原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2016-09-11
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多