NTP(时间同步)
# 简介
时间同步有很多种方法,基站授时,GPS授时,ntp授时等等多种方法,可以参考[http://doc.openluat.com/article/412/0](http://doc.openluat.com/article/412/0)和[http://doc.openluat.com/article/600/0](http://doc.openluat.com/article/600/0)。
Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,它可以提供高精准度的时间校正(LAN 上与标准间差小于 1 毫秒,WAN 上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。时间按 NTP 服务器的等级传播。按照离外部UTC 源的远近把所有服务器归入不同的 Stratum(层)中。
# API说明
timeSync的API在LuatOS-Air lib有做封装,建议直接用lib的API接口。
>API介绍见[ntp API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2283 "ntp API章节")
# 实现流程
- 首先通过基站授时同步时间
- 如果基站授时失败则用NTP授时同步时间
- 如果想要高精度授时建议自建服务器授时
# 常见问题
* 获取当前时间
获取时间,目前提供API是misc.getClock()。或者直接使用os.date("*t"),返回一个table:{year=2017,month=2,day=14,hour=14,min=19,sec=23},再从table里获取数据。
* os.time()返回值,需不需要特别加载模块?
返回从1970年1月1日到指定日期的时间的秒数,无参数表示当前时间。不需要添加操作,直接可以获取。
* os.date 这个 api 只支持 os.date(“*t”) 这样用,不能 os.date(‘%Y-%m-%d %H:%M:%S’) 这样用?
是的,不支持。可以按如下方式处理
```lua
local t = os.date("*t")
log.info("printTime", string.format("%04d-%02d-%02d %02d:%02d:%02d", t.year,t.month,t.day,t.hour,t.min,t.sec))
```
* ntp同步时间后,这个clock精度高吗,需要多久同步一次
并不能保证任何时间任何地点都能百分百同步到正确的时间。 所以,如果用户项目中的业务逻辑严格依赖于时间同步功能 则不要使用本功能模块,建议使用自己的应用服务器来同步时间。
* ntp.timeSync(24,fnc)时间同步说明
立即同步一次,之后每隔24小时自动同步一次,每次同步结束后执行fnc(time,result)
* ntp.timeSync() 请问这个函数是异步执行的还是执行完成之后,其后的代码才会执行?
获取时间是通过sys.taskInit创建一个时间任务来同步时间的,模块会随机尝试访问每一个NTP服务器,尝试1次,如果成功,如果不需循环同步时间,则退出当前线程,运行别的代码,否则同通过sys.wait(period)挂起当前任务循环同步时间,运行别的代码,时间到之后重新运行当前任务。如果失败,通过sys.wait(1000)挂起当前任务1秒,运行别的代码,1秒时间到,在尝试访问下一个服务器,循环操作,直到同步时间成功,或服务器全部访问结束,之后按照成功之后的动作执行。
* 有个这个函数后ntp.timeSync(1) 每次在程序中调用os.time也是实时时间了吗?
是的,只要时间同步成功了,就是实时时间了。
* os能够set时间或者timezone吗 ?
可以通过misc.setClock(t, cbFnc)设置时间,时区没有接口可以设置,可以参考
misc.setClock()设置接口通过AT+CCLK命令设置。
* 请问怎么关闭4G时间同步?
联网成功,基站自动同步时间,关不掉
# 使用注意事项
* Cat.1 AT默认访问的ntp服务器是:ntp1.aliyun.com 端口123
* Cat.1 LuatOS-Air版本访问的ntp服务器如下:
local timeServer = {
"cn.pool.ntp.org",
"edu.ntp.org.cn",
"cn.ntp.org.cn",
"s2c.time.edu.cn",
"time1.aliyun.com",
"tw.pool.ntp.org",
"0.cn.pool.ntp.org",
"0.tw.pool.ntp.org",
"1.cn.pool.ntp.org",
"1.tw.pool.ntp.org",
"3.cn.pool.ntp.org",
"3.tw.pool.ntp.org",
}
模块会随机尝试访问每一个NTP服务器,尝试1次。
注:本功能模块采用多个免费公共的NTP服务器来同步时间,并不能保证任何时间任何地点都能百分百同步到正确的时间,所以,如果用户项目中的业务逻辑严格依赖于时间同步功能,则不要使用使用本功能模块,建议使用自己的应用服务器来同步时间