sntp_app.lua 2.9 KB

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