NTP
一、NTP 基本概念
网络时间协议 NTP(Network Time Protocol)是 TCP/IP 协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP 服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时 UTC,客户端再从服务器请求和接收时间。
对于 Air700EMQ,移动/电信卡,通常会下发基站时间,同步时间并不是必要的,而联通卡通常不会下发,就需要 SNTP 了,很多场景中,由于业务需要,模块需要保持正确的系统时钟,才能正常工作。
二、演示功能概述
本文教你怎么使用 AT 命令,通过模组连接 NTP 服务器进行时间同步,为了 NTP 功能的整体独立性,这里将完整的记录从开机到获取到网络时间的全部步骤。
三、准备硬件环境
工欲善其事,必先利其器。在正式介绍本功能示例之前,需要先准备好以下硬件环境。
本文章使用 Air700EMQ 核心板做演示;
参考:硬件环境清单,准备以及组装好硬件环境。
四、准备软件环境
工欲善其事,必先利其器。在正式介绍本功能示例之前,需要先准备好以下软件环境。
在量产的项目硬件设计中,一般都是由主控 MCU 通过 UART 给 4G 模组发送命令实现具体的业务逻辑;
在本教程中,为了测试方便,没有使用主控 MCU;
而是使用了 PC 电脑上的一个串口工具 LLCOM 给 4G 模组发送命令来实现演示功能;
1. Luatools工具;
2. LLCOM 串口通信工具;
3. 本教程使用的AT固件版本号是:AirM2M_700EMQ_V2019_LTE_AT,如果版本号不正确,参考:固件版本确认和烧录检查确认。
五、相关指令
六、Air700ECQ AT 操作示例
Air700EMQ 模块支持 SNTP 协议(Simple Network Time Protocol),并有一套 AT 命令实现网络时间同步功能。
6.1 主动设置 NTP 服务器同步时间
以下操作通过 AT 指令主动设置 NTP 服务器为"ntp.aliyun.com"进行演示,实际使用中此地址用户可以根据实际需求进行设置,以下是 AT 指令操作序列。
ATE0 //关闭回显,便于观察模组返回信息
OK
AT+CGATT? //AT+CGATT?查询是否注册网络收到+CGATT: 1值是1即为注册成功,正常情况下注册时间不会超过两分钟,如果超过两分钟没有注册可以进入飞行模式五秒后退出再查询,或者直接重启模块。
+CGATT: 1
OK
AT+SAPBR=3,1,"CONTYPE","GPRS" //激活PDP是使用CNTP命令同步时间的前提
OK
AT+SAPBR=3,1,"APN","" //设置PDP承载之APN参数 模块注册网络后会从网络自动获取<apn>并激活一个PDP 上下文,用于RNDIS上网使用(此<apn>可以通过 AT+CGDCONT?来查询),所以输入 AT+SAPBR=3,<cid>,"APN","" 即可,模块内部会按照 自动获取的<apn>来设置APN
OK
AT+SAPBR=1,1 //激活网络场景(激活=1的PDP)
OK
AT+CNTPCID=1 //设置 GPRS 承载场景 ID,取值同+SAPBR命令的(设置使用的PDP的=1)
OK
AT+SAPBR=2,1 //获取分配IP地址
+SAPBR: 1,1,"10.189.181.162"
OK
AT+CNTP="ntp.aliyun.com",32 //设置NTP服务器为阿里云NTP服务器,时区为东八区。
//注意:这里设置的时区参数为-47为48,实际上时区范围(-12~12),但考虑到有些国家和地区会用到半时区,甚至四分之一时区,所以将整个时区范围扩展 4 倍,这样在输入时区的时候都是用整数,而不需要用小数在。时区前面如果是负数则表示西时区。
OK
AT+CNTP //开启网络同步
OK
+CNTP: 1 //+CNTP: 后面的数字是返回的操作码,1:网络时间同步成功 61:网络错误 62:DNS解析错误 63:连接错误 64:服务响应错误 65:服务响应超)操作码返回62表示,域名解析失败
AT+CCLK? //查询本地同步后的时间
+CCLK: "24/11/03,18:58:16+32" //模组返回的时间即为同步后的时间
OK
指令执行截图如下:
6.2 使用默认 NTP 服务器同步时间
模组出厂默认 NTP 服务器是 ntp.aliyun.com,如果是用默认 NTP 服务器可以跳过设置 NTP 服务器地址指令,直接使用 AT+CNTP 进行网络时间同步,若默认服务器同步时间失败尝试配置其他可用的 NTP 服务器地址,以下是 AT 指令操作序列。
ATE0 //关闭回显,便于观察模组返回信息
OK
AT+CGREG?
+CGREG: 0,1
OK
AT+CGATT? //AT+CGATT?查询是否注册网络收到+CGATT: 1值是1即为注册成功,正常情况下注册时间不会超过两分钟,如果超过两分钟没有注册可以进入飞行模式五秒后退出再查询,或者直接重启模块。
+CGATT: 1
OK
AT+SAPBR=3,1,"CONTYPE","GPRS" //激活PDP是使用CNTP命令同步时间的前提
OK
AT+SAPBR=3,1,"APN","" //设置PDP承载之APN参数 模块注册网络后会从网络自动获取<apn>并激活一个PDP 上下文,用于RNDIS上网使用(此<apn>可以通过 AT+CGDCONT?来查询),所以输入 AT+SAPBR=3,<cid>,"APN","" 即可,模块内部会按照 自动获取的<apn>来设置APN
OK
AT+SAPBR=1,1 //激活网络场景(激活=1的PDP)
OK
AT+CNTPCID=1 //设置 GPRS 承载场景 ID,取值同+SAPBR命令的(设置使用的PDP的=1)
OK
AT+SAPBR=2,1 //获取分配IP地址
+SAPBR: 1,1,"10.189.181.162"
OK
AT+CNTP //开启网络同步
OK
+CNTP: 1 //+CNTP: 后面的数字是返回的操作码,1:网络时间同步成功 61:网络错误 62:DNS解析错误 63:连接错误 64:服务响应错误 65:服务响应超)操作码返回62表示,域名解析失败
AT+CCLK? //查询本地同步后的时间
+CCLK: "24/11/03,18:58:16+32" //模组返回的时间即为同步后的时间
OK
指令执行截图如下:
七、常见问题 Q&A
7.1 问:开发板发送 AT 指令无响应?
1. 确保模组已经开机;
2. 串口助手是否选择了正确 AT 指令端口;
3. 检查串口助手参数是否设置正确,如波特率,停止位,奇偶校验,停止位,新行发送等;
4. 确保模组固件为标准 AT 固件。
7.2 执行 AT+CNTP 指令后模组返回“+CNTP: 62”或者“+CNTP: 64”是怎么回事?
1. 检查网络是否注册成功,可以用指令 AT+CREG 查询。
2. 检查模模组信号是否良好,可以用指令 AT+CSQ 查询。
3. 确认指令序列是否正确。
4. 确认 NTP 服务器是否可用,可以用指令 AT+CNTP?查询当前配置的 NTP 服务器地址。
5. 如果使用了定向卡,可能导致同步时钟失败。