3.2.9 时间同步

时间同步

作者:闫国梁

最后更新时间: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地址

本地 时区

47~+48

单位:1/4 时区。时 区是-12~+12,但是有的国家会用半时区,甚至 1/4 时区,为兼顾这些国家,时区单位为:1/4 时区。负号表示是西时区,正号表示为东时区

操 作码

1

网络时间同步成功

61

网络错误

62

DNS 解析错误

63

连接错误

64

服务响应错误

65

服务响应超时

举例

命 令(→)/ 返回(←)

实例

解释和说明

AT+SAPBR=3,1 ,“Contype”,“GPRS”

激活PDP是使用CNTP命令同步时间的前提

OK

AT+S APBR=3,1,“APN”,””

设置PDP承载之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

resource8910_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()