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服务器来同步时间,并不能保证任何时间任何地点都能百分百同步到正确的时间,所以,如果用户项目中的业务逻辑严格依赖于时间同步功能,则不要使用使用本功能模块,建议使用自己的应用服务器来同步时间