【得捷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_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_server_port= 123
- packet_buf = bytearray()
-
- utc = 8
-
-
- def build_ntp_header():
- packet_buf.append(0x23)
-
- for i in range(55):
- packet_buf.append(0x00)
-
-
- def get_ntp_time():
- build_ntp_header()
- socket.set_interface(task2.eth)
-
- 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 演示视频
|