通过 AT Cmds 和 UART 获取当前时间

问题描述 投票:0回答:1

我正在使用 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。

microcontroller uart at-command micropython current-time
1个回答
0
投票

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 开始时间的差异。

© www.soinside.com 2019 - 2024. All rights reserved.