Pārlūkot izejas kodu

update: 完善网络时间戳的文档说明和demo描述

Wendal Chen 2 gadi atpakaļ
vecāks
revīzija
2432b534f1
2 mainītis faili ar 26 papildinājumiem un 23 dzēšanām
  1. 2 0
      components/network/libsntp/luat_lib_sntp.c
  2. 24 23
      demo/sntp/main.lua

+ 2 - 0
components/network/libsntp/luat_lib_sntp.c

@@ -145,6 +145,8 @@ int l_sntp_get(lua_State *L) {
 @usage
 -- 本API于 2023.11.15 新增
 -- 注意, 本函数在执行socket.sntp()且获取到NTP时间后才有效
+-- 而且是2次sntp之后才是比较准确的值
+-- 网络波动越小, 该时间戳越稳定
 local tm = socket.ntptm()
 
 -- 对应的table包含多个数据, 均为整数值

+ 24 - 23
demo/sntp/main.lua

@@ -77,36 +77,37 @@ sys.taskInit(function()
         -- socket.sntp("ntp.aliyun.com")
         -- socket.sntp({"baidu.com", "abc.com", "ntp.air32.cn"})
         -- 通常只需要几百毫秒就能成功
-        -- local ret = sys.waitUntil("NTP_UPDATE", 5000)
-        -- if ret then
-        --     -- 以下是获取/打印时间的演示,注意时区问题
-        --     log.info("sntp", "时间同步成功", "本地时间", os.date())
-        --     log.info("sntp", "时间同步成功", "UTC时间", os.date("!%c"))
-        --     log.info("sntp", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
-        --     -- os.time(rtc.get()) 需要 2023.07.21 之后的版本, 因为月份的命名差异mon/month
-        --     -- log.info("sntp", "时间同步成功", "utc时间戳", os.time(rtc.get()))
-        --     log.info("sntp", "时间同步成功", "本地时间戳", os.time())
-        --     local t = os.date("*t")
-        --     log.info("sntp", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
-        --     log.info("sntp", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
-        --     -- log.info("sntp", "时间同步成功", "本地时间", os.time())
-        --     -- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
-        --     -- sys.wait(3600000) 
-        --     -- 这里为了演示, 用1分钟一次
-        --     sys.wait(5000)
-        -- else
-        --     log.info("sntp", "时间同步失败")
-        --     sys.wait(60000) -- 1分钟后重试
-        -- end
+        local ret = sys.waitUntil("NTP_UPDATE", 5000)
+        if ret then
+            -- 以下是获取/打印时间的演示,注意时区问题
+            log.info("sntp", "时间同步成功", "本地时间", os.date())
+            log.info("sntp", "时间同步成功", "UTC时间", os.date("!%c"))
+            log.info("sntp", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
+            -- os.time(rtc.get()) 需要 2023.07.21 之后的版本, 因为月份的命名差异mon/month
+            -- log.info("sntp", "时间同步成功", "utc时间戳", os.time(rtc.get()))
+            log.info("sntp", "时间同步成功", "本地时间戳", os.time())
+            local t = os.date("*t")
+            log.info("sntp", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
+            log.info("sntp", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
+            -- log.info("sntp", "时间同步成功", "本地时间", os.time())
+            -- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
+            -- sys.wait(3600000) 
+            -- 这里为了演示, 用5秒一次
+            sys.wait(5000)
+        else
+            log.info("sntp", "时间同步失败")
+            sys.wait(60000) -- 1分钟后重试
+        end
 
-        -- 时间戳, 2023.11.15 新增
+        -- 时间戳, 精确到毫秒. 2023.11.15 新增
+        -- 注意, 至少成功完成2次sntp,该时间戳才比较准确
+        -- 如果仅完成了一次sntp, 时间戳比标准时间会慢一个网络延时的时长(10~500ms)不等
         if socket.ntptm then
             local tm = socket.ntptm()
             log.info("tm数据", json.encode(tm))
             log.info("时间戳", string.format("%u.%03d", tm.tsec, tm.tms))
             sys.wait(5000)
         end
-        sys.wait(6000)
     end
 end)