main.lua 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "timeDemo"
  3. VERSION = "1.0"
  4. --[[
  5. 本demo需要mqtt库, 大部分能联网的设备都具有这个库
  6. mqtt也是内置库, 无需require
  7. ]]
  8. -- sys库是标配
  9. _G.sys = require("sys")
  10. --[[特别注意, 使用mqtt库需要下列语句]]
  11. _G.sysplus = require("sysplus")
  12. sys.taskInit(function ()
  13. -- 等待联网
  14. sys.waitUntil("IP_READY")
  15. sys.wait(1000)
  16. -- 对于Cat.1模块, 移动/电信卡, 通常会下发基站时间, 那么sntp就不是必要的, 而联通卡通常不会下发, 就需要sntp了
  17. -- 对应ESP32系列模块, 固件默认也会执行sntp, 所以手动调用sntp也是可选的
  18. -- sntp内置了几个常用的ntp服务器, 也支持自选服务器
  19. while 1 do
  20. -- 使用内置的ntp服务器地址, 包括阿里ntp
  21. log.info("开始执行SNTP")
  22. socket.sntp()
  23. -- 自定义ntp地址
  24. -- socket.sntp("ntp.aliyun.com")
  25. -- socket.sntp({"baidu.com", "abc.com", "ntp.air32.cn"})
  26. -- 通常只需要几百毫秒就能成功
  27. local ret = sys.waitUntil("NTP_UPDATE", 5000)
  28. if ret then
  29. -- 以下是获取/打印时间的演示,注意时区问题
  30. log.info("sntp", "时间同步成功", "本地时间", os.date())
  31. log.info("sntp", "时间同步成功", "UTC时间", os.date("!%c"))
  32. log.info("sntp", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
  33. -- os.time(rtc.get()) 需要 2023.07.21 之后的版本, 因为月份的命名差异mon/month
  34. -- log.info("sntp", "时间同步成功", "utc时间戳", os.time(rtc.get()))
  35. log.info("sntp", "时间同步成功", "本地时间戳", os.time())
  36. local t = os.date("*t")
  37. log.info("sntp", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
  38. log.info("sntp", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
  39. -- log.info("sntp", "时间同步成功", "本地时间", os.time())
  40. -- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
  41. -- sys.wait(3600000)
  42. -- 这里为了演示, 用5秒一次
  43. sys.wait(5000)
  44. else
  45. log.info("sntp", "时间同步失败")
  46. sys.wait(60000) -- 1分钟后重试
  47. end
  48. -- 时间戳, 精确到毫秒. 2023.11.15 新增
  49. -- 注意, 至少成功完成2次sntp,该时间戳才比较准确
  50. -- 如果仅完成了一次sntp, 时间戳比标准时间会慢一个网络延时的时长(10~500ms)不等
  51. if socket.ntptm then
  52. local tm = socket.ntptm()
  53. log.info("tm数据", json.encode(tm))
  54. log.info("时间戳", string.format("%u.%03d", tm.tsec, tm.tms))
  55. sys.wait(5000)
  56. end
  57. end
  58. end)
  59. sys.subscribe("NTP_ERROR", function()
  60. log.info("socket", "sntp error")
  61. -- socket.sntp()
  62. end)
  63. -- 用户代码已结束---------------------------------------------
  64. -- 结尾总是这一句
  65. sys.run()
  66. -- sys.run()之后后面不要加任何语句!!!!!