由于业务需要,很多场景中模块需要保持正确的系统时钟才能正常工作。但是模块上电后的初试时间戳是946713600(即2000/01/01,16:00:00),所以同步时钟成为了开发者要解决的重要问题。对于Cat.1模块,移动/电信卡,通常会下发基站时间,那么sntp就不是必要的,而联通卡通常不会下发,就需要sntp了。
NTP(NetworkTimeProtocol,网络时间协议)是用于同步系统时间的协议。它通过网络连接多个设备,确保这些设备的系统时钟保持一致。
本例程展示了如何使用SNTP授时服务来同步时间。
NTP和简化版的SNTP主要区别在于精确度和复杂性。
SNTP(SimpleNetworkTimeProtocol)通常用于不需要高精度同步的设备,如嵌入式系统。而NTP则用于要求较高时间精度的场景。
本demo将连接NTP服务器进行时间同步:
1.准备硬件环境
1.1 Air780E开发板一套,包括天线、USB数据线;
此核心板的详细使用说明参考:
Air780E产品手册:
https://docs.openluat.com/air780e/product/
<<开发板Core_Air780E使用说明V1.0.5.pdf>>,X.X.X指版本号;核心板使用过程中遇到任何问题,可以直接参考这份使用说明pdf文档。
1.2 SIM卡
请准备一张可正常上网的SIM卡,该卡可以是物联网卡或您的个人手机卡。
特别提醒:请确保SIM卡未欠费且网络功能正常,以便顺利进行后续操作。
1.3 数据通信线
typec接口USB数据线即可。
1.4 PC电脑
WINDOWS系统。
2.准备软件环境
2.1 基本的下载调试工具
使用说明参考Luatools下载和详细使用:
https://docs.openluat.com/Luatools
3.获取NTP授时软硬件资料
3.1 文档和工具
-
780E模块使用固件:SDK&Demo-合宙文档中心,本demo使用的固件版本是:
LuatOS-SoC_V1112_EC618_FULL.soc
-
本教程使用的demo:
https://gitee.com/openLuat/LuatOS-Air780E/tree/master/demo/sntp
-
将固件和脚本烧录到模块中:Luatools下载和使用教程-合宙模组资料中心
-
源码和固件已打包,如下所示:右键点我,另存为,下载完整压缩文件包
3.2 demo使用api介绍
socket.sntp(sntp_server)
作用:sntp时间同步
传入值类型 | 解释 |
string/table | sntp服务器地址选填 |
int | 适配器序号, 如果不填,优先选择soc平台自带能上外网的适配器, |
返回值
无
os.time(mytime)
作用:时间戳函数
参数
传入值类型 | 解释 |
table | 日期时间的table |
return | 时间戳 |
返回值
无
os.date(fmt,time)
作用:日期函数
参数
传入值类型 | 解释 |
string | 格式化字符串,可以是nil |
table | 日期时间的table |
返回值
返回值类型 | 解释 |
table/string | 根据fmt的不同,返回值不同 |
json.encode(obj,t)
作用:将对象序列化为json字符串
参数
传入值类型 | 解释 |
obj | 需要序列化的对象 |
string | 浮点数精度和模式, |
返回值
返回值类型 | 解释 |
string | 序列化后的json字符串, |
string | 序列化失败的报错信息 |
json.decode(str)
作用:将字符串反序列化为对象
参数
传入值类型 | 解释 |
string | 需要反序列化的json字符串 |
返回值
返回值类型 | 解释 |
obj | 反序列化后的对象(通常是table), |
result | 成功返回1,否则返回0 |
err | 反序列化失败的报错信息 |
4.代码示例介绍
4.1 使用ntp服务器同步时间
4.1.1 demo介绍
4.1.2 将程序下载到开发板
参考:将固件和脚本烧录到模块中:Luatools下载和使用教程-合宙模组资料中心(https://docs.openluat.com/Luatools/)
5.功能验证
6.总结
本demo介绍了如何使用ntp服务器同步时间。
7.扩展
常见问题
7.1 ntp同步时间后,这个clock精度高吗,需要多久同步一次?
并不能保证任何时间任何地点都能百分百同步到正确的时间。所以,如果用户项目中的业务逻辑严格依赖于时间同步功能则不要使用本功能模块,建议使用自己的应用服务器来同步时间。
7.2 多长时间ntp同步一次?
正常使用,一小时一次,已经足够了,甚至1天一次也可以。
7.3 这个函数socket.sntp()后每次在程序中调用os.time也是实时时间了吗?
是的,只要时间同步成功了,就是实时时间了。