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.setServers(st)¶¶
设置NTP服务器地址列表
参数
传入值类型 |
释义 |
---|---|
param |
st,tab类型,服务器地址列表 |
返回值
无
例子
ntp.getServers({"1edu.ntp.org.cn","cn.ntp.org.cn"})
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()