main.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "sntpdemo"
  3. VERSION = "1.0.0"
  4. --[[
  5. 本demo需要mqtt库, 大部分能联网的设备都具有这个库
  6. mqtt也是内置库, 无需require
  7. ]]
  8. -- sys库是标配
  9. _G.sys = require("sys")
  10. --[[特别注意, 使用mqtt库需要下列语句]]
  11. _G.sysplus = require("sysplus")
  12. local net_modle = nil
  13. -- local net_modle = "WIFI" -- 如果是用WIFI 选择这里
  14. -- wifi的STA相关事件
  15. sys.subscribe("WLAN_STA_INC", function(evt, data)
  16. -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
  17. -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
  18. -- 当evt=DISCONNECTED, data断开的原因, 整数类型
  19. log.info("收到STA事件", evt)
  20. end)
  21. -- wifi的AP相关事件
  22. sys.subscribe("WLAN_AP_INC", function(evt, data)
  23. -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
  24. -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
  25. -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
  26. log.info("收到AP事件", evt)
  27. end)
  28. -- 统一联网函数
  29. sys.taskInit(function()
  30. local device_id = mcu.unique_id():toHex()
  31. -----------------------------
  32. -- 统一联网函数, 可自行删减
  33. ----------------------------
  34. if net_modle == "WIFI" then
  35. -- wifi 联网, ESP32系列均支持
  36. local ssid = "luatos1234"
  37. local password = "12341234"
  38. log.info("wifi", ssid, password)
  39. -- TODO 改成自动配网
  40. -- LED = gpio.setup(12, 0, gpio.PULLUP)
  41. wlan.init()
  42. wlan.setMode(wlan.STATION) -- 默认也是这个模式,不调用也可以
  43. device_id = wlan.getMac()
  44. wlan.connect(ssid, password, 1)
  45. socket.dft(socket.LWIP_STA) -- 设置默认上网方式为wifi sta
  46. elseif mobile then
  47. -- Air8000/Air600E系列
  48. --mobile.simid(2) -- 自动切换SIM卡
  49. -- LED = gpio.setup(27, 0, gpio.PULLUP)
  50. device_id = mobile.imei()
  51. elseif socket then
  52. -- 适配的socket库也OK
  53. -- 没有其他操作, 单纯给个注释说明
  54. else
  55. -- 其他不认识的bsp, 循环提示一下吧
  56. while 1 do
  57. sys.wait(1000)
  58. log.info("bsp", "本bsp可能未适配网络层, 请查证")
  59. end
  60. end
  61. -- 默认都等到联网成功
  62. sys.waitUntil("IP_READY")
  63. sys.publish("net_ready", device_id)
  64. end)
  65. sys.taskInit(function()
  66. -- 等待联网
  67. local ret, device_id = sys.waitUntil("net_ready")
  68. sys.wait(1000)
  69. -- 对于Cat.1模块, 移动/电信卡, 通常会下发基站时间, 那么sntp就不是必要的, 而联通卡通常不会下发, 就需要sntp了
  70. -- 对应ESP32系列模块, 固件默认也会执行sntp, 所以手动调用sntp也是可选的
  71. -- sntp内置了几个常用的ntp服务器, 也支持自选服务器
  72. while 1 do
  73. -- 使用内置的ntp服务器地址, 包括阿里ntp
  74. log.info("开始执行SNTP")
  75. socket.sntp()
  76. -- 自定义ntp地址
  77. -- socket.sntp("ntp.aliyun.com")
  78. -- socket.sntp({"baidu.com", "abc.com", "ntp.air32.cn"})
  79. -- 通常只需要几百毫秒就能成功
  80. local ret = sys.waitUntil("NTP_UPDATE", 5000)
  81. if ret then
  82. -- 以下是获取/打印时间的演示,注意时区问题
  83. log.info("sntp", "时间同步成功", "本地时间", os.date())
  84. log.info("sntp", "时间同步成功", "UTC时间", os.date("!%c"))
  85. log.info("sntp", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
  86. -- os.time(rtc.get()) 需要 2023.07.21 之后的版本, 因为月份的命名差异mon/month
  87. -- log.info("sntp", "时间同步成功", "utc时间戳", os.time(rtc.get()))
  88. log.info("sntp", "时间同步成功", "本地时间戳", os.time())
  89. local t = os.date("*t")
  90. log.info("sntp", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
  91. log.info("sntp", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
  92. -- log.info("sntp", "时间同步成功", "本地时间", os.time())
  93. -- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
  94. -- sys.wait(3600000)
  95. -- 这里为了演示, 用5秒一次
  96. sys.wait(5000)
  97. else
  98. log.info("sntp", "时间同步失败")
  99. sys.wait(60000) -- 1分钟后重试
  100. end
  101. -- 时间戳, 精确到毫秒. 2023.11.15 新增
  102. -- 注意, 至少成功完成2次sntp,该时间戳才比较准确
  103. -- 如果仅完成了一次sntp, 时间戳比标准时间会慢一个网络延时的时长(10~500ms)不等
  104. if socket.ntptm then
  105. local tm = socket.ntptm()
  106. log.info("tm数据", json.encode(tm))
  107. log.info("时间戳", string.format("%u.%03d", tm.tsec, tm.tms))
  108. sys.wait(5000)
  109. end
  110. end
  111. end)
  112. sys.subscribe("NTP_ERROR", function()
  113. log.info("socket", "sntp error")
  114. -- socket.sntp()
  115. end)
  116. -- 用户代码已结束---------------------------------------------
  117. -- 结尾总是这一句
  118. sys.run()
  119. -- sys.run()之后后面不要加任何语句!!!!!