一、 树莓派时间校准
写在前面
想必使用过树莓派做开发的工程师们都遇到过树莓派掉电后空置一段时间,时间不准的问题。这个归咎于树莓派并未设置存储电池和内置时钟。那么,这必然就需要我们要去校对时间。那么,我查询了很多资料,无非存在以下几种情况:
- 配置NTP服务器专门用来树莓派校对时间(感觉有点麻烦)
- 通过ntdate,然后设置开机联网校对时间(必须联外网,树莓派一般用于工业控制,涉及工业秘密,必然很难满足连接外网。)
实现原理
基于以上两种方法不够通用,那么,我使用了一种新的方式来做时间校对。通过我们python的爬虫理念,请求一台可以响应的服务器,通过响应头里的date属性来获取时间,再通过os.system(‘sudo date --s 你处理后的时间字符串’)来强制设置树莓派时间。以上是python脚本的实现逻辑。最后通过linux下crontab定时脚本设置python对时脚本每隔一定时间运行一次对时(或者设置开机对时)。
代码展示
# -*- coding: utf-8 -*
import http.client # --python3.x
#import httplib --python2.x
import time
import os
def get_webservertime(host):
conn=http.client.HTTPConnection(host) # --python3.x
#conn=httplib.HTTPConnection(host) --python2.x
conn.request("GET", "/")
r=conn.getresponse()
#r.getheaders() #获取所有的http头
ts= r.getheader('date') #获取http头date部分
#print(ts)
#将GMT时间转换成北京时间
ltime= time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")
#print(ltime)
ttime=time.localtime(time.mktime(ltime)+8*60*60)
#print(ttime)
dat="%u-%02u-%02u"%(ttime.tm_year,ttime.tm_mon,ttime.tm_mday)
tm="%02u:%02u:%02u"%(ttime.tm_hour,ttime.tm_min,ttime.tm_sec)
cur_time = dat+" "+tm
#print (dat,tm)
print(cur_time)
command = "sudo date --s='{}'".format(cur_time)
#print(command)
os.system(command)
if __name__ == '__main__':
try:
get_webservertime('www.jd.com') #参数取决于你可以访问的IP地址,外网情况下可以是外网IP,内网可以是服务器可以访问的IP。可以在树莓派浏览器中输入你要填入的IP,能成功响应的即可使用。
print("校对成功!!!")
except:
print("检查与服务器的网络连接,校对失败!")
自动执行脚本
- 通过crontab 实现定时校对
打开终端输入crontab -e。
如果是vim编辑,输入i即可编辑crontab定时脚本。
在底部输入*/2 * * * * /usr/bin/python /home/pi/Desktop/time_set.py
按ESC 输入:wq!即可保存退出。
可通过crontab -l 查看刚刚保存的crontab定时脚本。
以上实现的是每隔两分钟运行python脚本对时 - 通过run.desktop文件方式实现开机自动对时
打开终端执行sudo vim ~/.config/autostart/run.desktop
建议先查看.config路径下是否存在autostart文件夹,没有自己新建一个。
编辑run.desktop内容如下:
[Desktop Entry]
Type = Application
Exec = python /home/pi/Desktop/time_set.py // 可更改为自己python脚本放置路径
重启树莓派生效