sntp_app.lua 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. --[[
  2. @module sntp_app
  3. @summary sntp时间同步应用功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author 朱天华
  7. @usage
  8. 本文件为sntp时间同步应用功能模块,核心业务逻辑为:
  9. 1、连接ntp服务器进行时间同步;
  10. 2、如果同步成功,1小时之后重新发起同步动作;
  11. 3、如果同步失败,10秒钟之后重新发起同步动作;
  12. 本文件没有对外接口,直接在main.lua中require "sntp_app"就可以加载运行;
  13. ]]
  14. -- sntp时间同步的任务处理函数
  15. local function sntp_task_func()
  16. while true do
  17. -- 如果WIFI还没有连接成功,一直在这里循环等待
  18. while not socket.adapter(socket.LWIP_STA) do
  19. log.warn("sntp_task_func", "wait IP_READY")
  20. -- 在此处阻塞等待WIFI连接成功的消息"IP_READY"
  21. -- 或者等待30秒超时退出阻塞等待状态
  22. sys.waitUntil("IP_READY", 30000)
  23. end
  24. -- 检测到了IP_READY消息
  25. log.warn("sntp_task_func", "recv IP_READY")
  26. -- 发起ntp时间同步动作
  27. socket.sntp()
  28. -- 等待ntp时间同步结果,30秒超时失败,通常只需要几百毫秒就能成功
  29. local ret = sys.waitUntil("NTP_UPDATE", 30000)
  30. --同步成功
  31. if ret then
  32. -- 以下是获取/打印时间的演示,注意时区问题
  33. log.info("sntp_task_func", "时间同步成功", "本地时间", os.date())
  34. log.info("sntp_task_func", "时间同步成功", "UTC时间", os.date("!%c"))
  35. log.info("sntp_task_func", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
  36. log.info("sntp_task_func", "时间同步成功", "本地时间戳", os.time())
  37. local t = os.date("*t")
  38. log.info("sntp_task_func", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
  39. log.info("sntp_task_func", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
  40. -- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
  41. sys.wait(3600000)
  42. --同步失败
  43. else
  44. log.info("sntp_task_func", "时间同步失败")
  45. -- 10秒后重新发起同步动作
  46. sys.wait(10000)
  47. end
  48. end
  49. end
  50. --创建并且启动一个task
  51. --运行这个task的主函数sntp_task_func
  52. sys.taskInit(sntp_task_func)