【得捷Follow me第4期】进阶任务:从NTP服务器同步时间
[复制链接]
本帖最后由 鲜de芒果 于 2024-2-22 13:29 编辑
4.1 任务说明
从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。
4.2 功能代码
import time
import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket
import task2
days = (
"星期天",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六"
)
# 查询阿里云NTP服务器IP地址
ntp_server_domain = "ntp.aliyun.com"
ntp_server_ip = task2.eth.pretty_ip(task2.eth.get_host_by_name(ntp_server_domain))
print("NTP服务器【%s】IP地址: %s" %(ntp_server_domain, ntp_server_ip))
# NTP端口
ntp_server_port= 123
packet_buf = bytearray()
# UTF时区, 这里取北京时间时区 +8
utc = 8
# 构建 NTP 请求头
def build_ntp_header():
packet_buf.append(0x23)
for i in range(55):
packet_buf.append(0x00)
# 请求NTP时间
def get_ntp_time():
build_ntp_header()
socket.set_interface(task2.eth)
# 创建UDP Socket对象
ntp_socket = socket.socket(type=socket.SOCK_DGRAM)
# 设置超时时间
ntp_socket.settimeout(10)
ntp_socket.bind((None,50001))
ntp_socket.sendto(packet_buf,(ntp_server_ip, ntp_server_port))
while True:
data = ntp_socket.recv(48)
print("receive ntp data: ", data)
if data:
sec = data[40:44]
int_cal = int.from_bytes(sec,"big")
cal = int_cal - 2208988800 + utc * 3600
cal = time.localtime(cal)
return cal
# 获取当前时间
def get_time():
cal = get_ntp_time()
print("%d年%d月%d日 %s %d时%d分%d秒" %(cal.tm_year, cal.tm_mon, cal.tm_mday, days[cal.tm_wday], cal.tm_hour, cal.tm_min, cal.tm_sec))
4.3 效果展示
4.4 总结
NTP 时间解析需要注意获取到的数据有可能为空,需要进行逻辑判断处理。另外就是时间的起始日期。
4.5 演示视频
|