目录
1.认识Python
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字或标点符号,它具有比其他语言更有特色的语法结构。
2.环境与工具
2.1 python环境
在Windows上使用命令行窗口查看所安装的python版本
python --version
2.2 Visual Studio Code编译
Visual Studio Code是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全、代码重构功能,并且内置了命令行工具和Git 版本控制系统。
3.时间同步
3.1代码构思
部分设备没有实时同步时间的功能,只要可以连接网络,就可以使用python代码来同步另一台设备的时间。
服务端向公共NTP网络时间服务器请求标准时间,然后由服务端想请求时间的客户端发送该时间,进而实现客户端时间同步。
3.2 服务端
服务端:用grt_time()函数获取标准时间,然后返回该时间,发开端口接收客户端信息,通过UDP协议发送常规时间格式的信息到客户端。
import socket
import time
import ntplib
# 该函数向NTP服务器请求时间,并返回该时间值
def get_time():
try:
ntpclient_obj = ntplib.NTPClient()
ret_time = ntpclient_obj.request('ntp6.aliyun.com')
now_time = ret_time.tx_time
return now_time
except Exception as e:
print(f"获取时间失败: {e}")
return None
if __name__ == '__main__':
# 创建一个UDP套接字
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定到指定的端口
server.bind(('127.0.0.1', 9999))
print('时间同步服务器启动,等待客户端请求...')
while True:
try:
# 接收客户端请求
rec_str, addr = server.recvfrom(1024)
if rec_str.decode('utf-8') == 'get_time':
# 获取时间
now_time = get_time()
if now_time:
std_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now_time))
# 发送时间
server.sendto(std_time.encode('utf-8'), addr)
print('发送时间给客户端:', std_time)
else:
error_message = "无法获取时间"
server.sendto(error_message.encode('utf-8'), addr)
except Exception as e:
print(f"处理请求时出错: {e}")
3.3 客户端
客户端:每隔一端时间想服务端发送请求,收到服务器返回的标准时间,然后使用os.system()函数对本系统的时间进行更改。
import socket
import time
import os
import platform
def set_system_time(date_str, time_str):
try:
if platform.system() == 'Linux' or platform.system() == 'Darwin':
os.system(f'sudo date -s "{date_str} {time_str}"')
elif platform.system() == 'Windows':
os.system(f'date {date_str}')
os.system(f'time {time_str}')
else:
print('不支持的操作系统')
except Exception as e:
print(f'设置系统时间时出错: {e}')
if __name__ == '__main__':
# 创建一个UDP套接字
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址和端口
server_address = ('127.0.0.1', 9999)
client.connect(server_address)
print('客户端已经启动,连接到服务器:', server_address)
# 获取当前时间
while True:
# 每隔20s同步一次
time.sleep(20)
client.sendto('get_time'.encode('utf-8'), server_address)
# 接收服务器返回的时间
data, server = client.recvfrom(1024)
print('接收服务器时间:', data.decode('utf-8'))
# 假设服务器返回的时间格式为 'YYYY-MM-DD HH:MM:SS'
datetime_str = data.decode('utf-8')
date_now, time_now = datetime_str.split(' ')
# 设置系统时间
set_system_time(date_now, time_now)
3.4 运行结果
4.总结
时间同步程序,只要服务端的时间正常,处在同一局域网的客户端就可以通过该程序同步时间,该程序在一些开发板的使用过程中用处很大。