最近给vivo做的设备需要连接MES生产内网,要求机器根据心跳包返回值来同步服务器时间。而这一步操作需要在上位机程序中执行,也就是在Qt中调用命令行或者更改配置文件来设置系统时间。
树莓派更改系统时间的方法很多,在这里我介绍两种比较方便的:
① 使用命令行:sudo date --s=“2020-11-28 14:30:00”
② 编写shell脚本,通过调用shell脚本执行命令行。
新建"systime.sh"脚本,在脚本中写入:
#! bin/bash
sudo date --s="2020-11-28 14:30:00"
exit 0
// exit 0表示脚本下执行完后自动关闭脚本文件
Qt中如何使用这两种方法来实现通过程序更改系统时间呢,在网上搜索后找到了如下两种方法:
① 使用Linux中的system()函数,这个函数需要引用stdlib.h头文件。在system函数中写入字符串形式的命令行,即可执行对应的终端命令,比如system(“sudo reboot”),那么树莓派就会重新启动。或者通过命令行运行脚本system(“systime.sh”)就会运行systime.sh脚本,然后执行脚本里的内容。
但是如果使用system的方式更改系统时间会有一个问题,因为是根据服务器心跳包的返回值来更改系统时间,这里的时间实际上是一个变量,需要当做参数传入,根据参数来更改时间。如果多次调用system来更改时间,会发现只有第一次的system(命令行)是生效的,之后每一次调用system所执行的都是第一次调用的命令。造成这种情况的原因我无法解释,我的猜想是因为system函数创造的进程没有释放,所以每次调用system()都执行的同一个进程。显然这样是无法满足根据心跳包同步服务器时间的要求的。
② 使用QProcess类,Qt中的QProcess类提供了启动外部程序的方法。
通过start()函数来调用外接程序,或调用命令行,而且也可以手动释放,这样就不存在上述system函数的问题了。
#include <QProcess>
QProcess process;
process.start("sudo date --s=\"2020-11-28 14:30:00\"");
//process.start("systime.sh");
process.waitForStarted();
process.waitForFinished();//以阻塞的方式等待释放