时间同步 ======== .. _时间同步-1: 时间同步 -------- 作者:闫国梁 最后更新时间:2020年7月3日 时间同步有很多种方法,基站授时,GPS授时,ntp授时等等多种方法,可以参考https://luatdoc.papapoi.com/412/和https://luatdoc.papapoi.com/600/。这里只介绍ntp这种方法。 Network Time Protocol(NTP)是用来使计算机\ `时间同步化 `__\ 的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,它可以提供高精准度的时间校正(LAN 上与标准间差小于 1 毫秒,WAN 上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。时间按 NTP 服务器的等级传播。按照离外部UTC 源的远近把所有服务器归入不同的 Stratum(层)中。 AT方式 ------ 模块支持 SNTP 协议(Simple Network Time Protocol),并有一套 AT 命令实现网络时间同步功能。 设置GPRS 承载场景 ID:AT+CNTPCID -------------------------------- ======== ============ ===================== 命令类型 语法 返回 ======== ============ ===================== 设置命令 AT+CNTPCID= OK 查询命令 AT+CNTPCID? +CNTPCID:OK 测试命令 AT+CNTPCID=? +CNTPCID:(取值范围)OK ======== ============ ===================== 参数定义: ==== =========== ==== =================== 参数 定义 取值 对取值的说明 ==== =========== ==== =================== \ 承载场景 id 1-3 取值同+SAPBR 命令的 ==== =========== ==== =================== 同步网络时间:AT+CNTP --------------------- +----------+----------------------------+----------------------------+ | 命令类型 | 语法 | 返回 | +==========+============================+============================+ | 设置命令 | AT+CNTP=[,] | OK | +----------+----------------------------+----------------------------+ | 执行命令 | AT+CNTP | OK+CNTP: | +----------+----------------------------+----------------------------+ | 查询命令 | AT+CNTP? | +CNTP: ,OK | +----------+----------------------------+----------------------------+ | 测试命令 | AT+CNTP=? | +CNTP: 允许的长度,的范围OK | +----------+----------------------------+----------------------------+ | 注意事项 | 网络 | | | | 时间同步成功后,可以用AT+C | | | | CLK?命令来查询模块当前时间 | | +----------+----------------------------+----------------------------+ 参数定义: +--------+------+--------+--------------------------------------------+ | 参数 | 定义 | 取值 | 对取值的说明 | +========+======+========+============================================+ | | NTP | 域名或 | | | | 服 | ip地址 | | | | 务器 | | | +--------+------+--------+--------------------------------------------+ | | 本地 | - | 单位:1/4 | | | 时区 | 47~+48 | 时区。时 | | | | | 区是-12~+12,但是有的国家会用半时区,甚至 | | | | | 1/4 时区,为兼顾这些国家,时区单位为:1/4 | | | | | 时区。负号表示是西时区,正号表示为东时区 | +--------+------+--------+--------------------------------------------+ | | 操 | 1 | 网络时间同步成功 | | | 作码 | | | +--------+------+--------+--------------------------------------------+ | | | 61 | 网络错误 | +--------+------+--------+--------------------------------------------+ | | | 62 | DNS 解析错误 | +--------+------+--------+--------------------------------------------+ | | | 63 | 连接错误 | +--------+------+--------+--------------------------------------------+ | | | 64 | 服务响应错误 | +--------+------+--------+--------------------------------------------+ | | | 65 | 服务响应超时 | +--------+------+--------+--------------------------------------------+ 举例 ---- +-----------+-------------------+--------------------------------------+ | 命 | 实例 | 解释和说明 | | 令(→)/ | | | | 返回(←) | | | +===========+===================+======================================+ | → | AT+SAPBR=3,1 | 激活PDP是使用CNTP命令同步时间的前提 | | | ,“Contype”,“GPRS” | | +-----------+-------------------+--------------------------------------+ | ← | OK | | +-----------+-------------------+--------------------------------------+ | → | AT+S | 设置PDP承载之APN参数模块注册 | | | APBR=3,1,“APN”,"" | 网络后会从网络自动获取并激活一个PDP | | | | 上 | | | | 下文,用于RNDIS上网使用。此可以通过 | | | | AT+CGDCONT?来查询。V980之前( | | | | 不含V980),需要AT+CGDCONT?查询得到 | | | | 并设置 : AT+SAPBR=3,,“APN”,V980 之 | | | | 后 ( 包 含 V980 ) , 输 | | | | 入AT+SAPBR=3,,“APN”,"" | | | | 即可 | | | | ,模块内部会按照自动获取的来设置APN | +-----------+-------------------+--------------------------------------+ | ← | OK | | +-----------+-------------------+--------------------------------------+ | → | AT+SAPBR=1,1 | 激活=1的PDP | +-----------+-------------------+--------------------------------------+ | ← | OK | | +-----------+-------------------+--------------------------------------+ | → | AT+CNTPCID=1 | 设置使用的PDP的=1 | +-----------+-------------------+--------------------------------------+ | ← | OK | | +-----------+-------------------+--------------------------------------+ | → | AT+CNTP | | +-----------+-------------------+--------------------------------------+ | ← | OK+CNTP:1 | | +-----------+-------------------+--------------------------------------+ | → | AT+CCLK? | | +-----------+-------------------+--------------------------------------+ | ← | +CCLK: | | | | “18/05/ | | | | 16,15:49:28+32”OK | | +-----------+-------------------+--------------------------------------+ luat方式 -------- 重要提醒!!!!!! 本功能模块采用多个免费公共的NTP服务器来同步时间 并不能保证任何时间任何地点都能百分百同步到正确的时间 所以,如果用户项目中的业务逻辑严格依赖于时间同步功能 则不要使用使用本功能模块,建议使用自己的应用服务器来同步时间 参考 https://luatdoc.papapoi.com/600/ 加深对授时功能的理解 API接口 ------- ntp.getServers()\ `¶ `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 获取NTP服务器地址列表 - 参数 无 - 返回值 table,服务器地址列表 - 例子 :: local addtable = ntp.getServers() ntp.setServers(st)\ `¶ `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 设置NTP服务器地址列表 - 参数 ========== ========================== 传入值类型 释义 ========== ========================== param st,tab类型,服务器地址列表 ========== ========================== - 返回值 无 - 例子 :: ntp.getServers({"1edu.ntp.org.cn","cn.ntp.org.cn"}) ntp.isEnd()\ `¶ `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NTP同步标志 - 参数 无 - 返回值 boole,NTP的同步状态true为成功,fasle为失败 - 例子 :: local sta = ntp.isEnd() ntp.ntpTime(ts, fnc, fun)\ `¶ `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 同步时间,每个NTP服务器尝试3次,超时8秒,适用于被任务函数调用 - 参数 ========== ====================== 传入值类型 释义 ========== ====================== param ts,每隔ts小时同步1次 param fnc,同步成功后回调函数 param fun,同步成功前回调函数 ========== ====================== - 返回值 无 - 例子 :: ntp.ntpTime() -- 只同步1次 ntp.ntpTime(1) -- 1小时同步1次 ntp.ntpTime(nil,fnc) -- 只同步1次,同步成功后执行fnc() ntp.ntpTime(24,fnc) -- 24小时同步1次,同步成功后执行fnc() ntp.timeSync(ts, fnc, fun)\ `¶ `__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 自动同步时间任务适合独立执行. 重要提醒!!!!!! 本功能模块采用多个免费公共的NTP服务器来同步时间 并不能保证任何时间任何地点都能百分百同步到正确的时间 所以,如果用户项目中的业务逻辑严格依赖于时间同步功能 则不要使用使用本功能模块,建议使用自己的应用服务器来同步时间 - 参数 ========== ====================== 传入值类型 释义 ========== ====================== param ts,每隔ts小时同步1次 param fnc,同步成功后回调函数 param fun,同步成功前回调函数 ========== ====================== - 返回值 无 - 例子 :: ntp.timeSync() -- 只同步1次 ntp.timeSync(1) -- 1小时同步1次 ntp.timeSync(nil,fnc) -- 只同步1次,同步成功后执行fnc() ntp.timeSync(24,fnc) -- 24小时同步1次,同步成功后执行fnc() 参考demo -------- resource\8910_script:raw-latex:`\script`\_LuaTask_V2.3.3:raw-latex:`\demo`:raw-latex:`\ntp`:raw-latex:`\testNtp`.lua :: local function prinTime() local tm = misc.getClock() log.info("testNtp.printTime", string.format("%04d/%02d/%02d,%02d:%02d:%02d", tm.year, tm.month, tm.day, tm.hour, tm.min, tm.sec)) end sys.timerLoopStart(prinTime,1000) ntp.timeSync()