我正在使用 Raspberry Pi pico 开发一个小型微控制器项目。由于 Pico 不支持 WiFi,我添加了 ESP8266-01。在 MicroPython 中,我无法访问套接字或
ntptime
库。
如何仅通过AT命令和UART获取当前时间?
我有可用的互联网连接并且 AT 命令可以工作。
utime.localtime()
和time.localtime()
只是给了我Pico的时间,而不是实际时间。 rtc.datetime()
与计算机断开连接后需要重新启动。这就是为什么我想通过互联网获取当前时间。
成功连接到互联网后,我尝试运行此:
import machine
import utime
uart0 = machine.UART(0, baudrate=115200)
uart0.init(115200, bits=8, parity=None, stop=1)
def send_at_cmd(cmd, uart=uart0):
print("CMD: " + cmd)
uart.write(cmd + "\r\n")
utime.sleep(3)
print(uart.read().decode())
print()
def connect_to_ntp():
send_at_cmd('AT+CIPCLOSE') #Close the previous open UDP connection
send_at_cmd('AT+CIPSTART="UDP","pool.ntp.org",123') #Connect to pool.ntp.org"
def get_ntp_time(uart=uart0):
send_at_cmd('AT+CIPSEND=48')
ntp_request = b'\x1b' + 47 * b'\0'
uart.write(ntp_request) #Request 48 Bytes from the server. Trying the get the time here
utime.sleep(3)
response = uart.read() #Read the 48 Byte response
print("RAW response:", response) #The whole repsonse
print()
print("Decoded response:", int.from_bytes(response[40:44], 'big')) #The decoded part where the current time should be
connect_to_ntp()
get_ntp_time()
然后我得到:
CMD: AT+CIPCLOSE
AT+CIPCLOSE
CLOSED
OK
CMD: AT+CIPSTART="UDP","pool.ntp.org",123
AT+CIPSTART="UDP","pool.ntp.org",123
0,CONNECT
OK
CMD: AT+CIPSEND=48
AT+CIPSEND=48
OK
RAW response:
b'\\r\\nRecv 48 bytes\\r\\n\\r\\nSEND OK\\r\\n\\r\\n+IPD,48:\\x1c\\x02\\x03\\xe8\\x00\\x00\\x00\\x12\\x00\\x00\\x07\\xe2O\\x85,\\x8c\\xea\\xb3\\xa1\\xc5\\xb0\\xfa\\xc82\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xea\\xb3\\xa5\\xc2v\\x18\\x1a\\x86\\xea\\xb3\\xa5\\xc2v\\x1a\\xd3Z'
Decoded response: 65536000
但是65536000不是我当前的时间,它对应的是:29.01.1972, 13:26:40。
65536000
是一个可疑的整数,3E80000
是十六进制的。看来您可能从响应中提取了错误的字节。
让我们倒过来看看是否能找到正确的字节。当前的 Unix 纪元时间 是 1728749694。但请注意,NTP 使用与 Unix 时间不同的纪元开始。 NTP 纪元是 1900 年 1 月 1 日,而 Unix 纪元是 1970 年 1 月 1 日。
因此我们需要将 2208988800 添加到 Unix 时间来获取今天的 NTP 时间(例如,请参阅这个问题的答案)。
将其添加到 Unix 时间上得到
1728749694 + 2208988800 = 3937738494
,即 0xEAB51EFE
。我们可以在您的响应数据中看到类似的内容吗?是的,我们看到:
\\xea\\xb3\\xa1\\xc5
将其转换回 Unix 时间以查看当时的时间,得到
0xEAB3A1C5 - 2208988800 = 1728652101
,它与今天的 Unix 时间非常接近,实际上是 2024 年 10 月 11 日星期五 13:08:21,也就是昨天,可能是当您运行时你的代码。
此字节序列比您所看到的响应还要深 12 个字节。因此我建议你的代码应该是:
int.from_bytes(response[52:56], 'big')
在解释此值时,不要忘记考虑 Epoch 开始时间的差异。