乐鑫技术交流
直播中

mintsy

8年用户 1480经验值
擅长:MEMS/传感技术
私信 关注
[问答]

请问如何在ESP8266上使用sntp协议连接到ssl中的服务器?

我正在使用带有 C 语言的 esp-open-sdk 的ESP8266。

我尝试使用此代码来获取时间戳,但每次都失败 - 我只得到 0 :
sntp_set_timezone(2);
sntp_setservername(0, "fr.pool.ntp.org");
sntp_init();
时间戳 = sntp_get_current_timestamp();
os_printf("time : %d and %sn", timestamp, sntp_get_real_time(timestamp));

正如您可能已经从主题中了解到的那样,我正在尝试连接到服务器以执行 https 请求(我正在使用 espconn_secure_*** 函数),但每次都失败。
它可能是因为时间的关系(由于证书的有效期随时间推移而无法进行身份验证)或由于不支持的协议。TLS 协议用于安全交易,服务器使用 TLSv1.2,我在互联网上读到ESP8266仅支持 TLSv1.1;是吗?
另一件奇怪的事情是,在我尝试建立 tcp 连接后,我正确地获得了时间戳。

您接下来可以看到我如何尝试连接到服务器 - 在地址0x70000,有我正在尝试连接 ESP 的服务器的 CA:
espconn_secure_ca_enable(1、0x70);
espconn_secure_connect(&conn);

我是否正确使用espconn_secure_ca_enable?我是否给他正确的文件进行处理?这个功能有必要吗?

回帖(1)

杨万富

2024-7-19 17:31:38
要在ESP8266上使用SNTP协议连接到SSL服务器,您需要确保正确配置SNTP库并获取正确的时间戳。以下是一些步骤和代码示例,帮助您实现这一目标。

1. 首先,确保您的ESP8266开发板已连接到互联网。

2. 在您的代码中,包含必要的头文件:

```c
#include "osapi.h"
#include "esp8266.h"
#include "mem.h"
#include "user_interface.h"
#include "sntp.h"
#include "espconn.h"
#include "ssl3.h"
```

3. 初始化SNTP:

```c
void ICACHE_FLASH_ATTR user_init(void) {
    // 设置时区
    sntp_set_timezone(8);
    // 设置NTP服务器
    sntp_setservername(0, "pool.ntp.org");
    // 初始化SNTP
    sntp_init();
}
```

4. 获取当前时间戳:

```c
os_timer_t sntp_time_get_timer;

void ICACHE_FLASH_ATTR sntp_time_get_cb(void *arg) {
    time_t now = 0;
    struct tm timeinfo = {0};
    char strftime_buf[64];

    // 获取当前时间戳
    now = sntp_get_current_timestamp();
    if (now == 0) {
        os_printf("Failed to get timen");
    } else {
        localtime_r(&now, &timeinfo);
        strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
        os_printf("Got time: %sn", strftime_buf);
    }
}

void ICACHE_FLASH_ATTR sntp_time_get() {
    os_timer_disarm(&sntp_time_get_timer);
    os_timer_setfn(&sntp_time_get_timer, (os_timer_func_t *)sntp_time_get_cb, NULL);
    os_timer_arm(&sntp_time_get_timer, 5000, 0); // 5秒后获取时间
}
```

5. 在`user_init`函数中调用`sntp_time_get`:

```c
void ICACHE_FLASH_ATTR user_init(void) {
    // 设置时区
    sntp_set_timezone(8);
    // 设置NTP服务器
    sntp_setservername(0, "pool.ntp.org");
    // 初始化SNTP
    sntp_init();
    // 获取时间戳
    sntp_time_get();
}
```

6. 确保您的ESP8266具有正确的SSL证书。您可以使用`espconn_secure_*`函数连接到HTTPS服务器。以下是连接到HTTPS服务器的示例代码:

```c
#include "espconn.h"
#include "mem.h"
#include "osapi.h"
#include "user_interface.h"

LOCAL const char *default_certificate = "..."; // 这里填入您的SSL证书

LOCAL void ICACHE_FLASH_ATTR https_client_recv(void *arg, char *data, unsigned short len) {
    struct espconn *pesp_conn = (struct espconn *)arg;
    os_printf("Recv data: %sn", data);
    espconn_secure_disconnect(pesp_conn);
}

LOCAL void ICACHE_FLASH_ATTR https_client_connect(void *arg, struct espconn *pesp_conn) {
    if (pesp_conn == NULL) return;

    char *get_request = "GET / HTTP/1.1rnHost: www.example.comrnConnection: closernrn";

    espconn_secure_send(pesp_conn, get_request, os_strlen(get_request));
}

LOCAL void ICACHE_FLASH_ATTR https_client_reconnect(void *arg, struct espconn *pesp_conn) {
    espconn_secure_disconnect(pesp_conn);
}

LOCAL void ICACHE_FLASH_ATTR https_client_init(void) {
    struct espconn *pesp_conn = (struct espconn *)os_zalloc(sizeof(struct espconn));
    espconn_secure_set_default_certificate(default_certificate, os_strlen(default_certificate));

    espconn_secure_set_opt(pesp_conn, ESPCONN_FLAG_SECURE);

    pesp_conn->type = ESPCONN_TCP;
    pesp_conn->state = ESPCONN_NONE;
    pesp_conn->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));
    pesp_conn->proto.tcp->local_port = espconn_port();
    pesp_conn->proto.tcp->remote_port = 443;

    struct ip_info ipconfig;
    os_memset(&ipconfig, 0, sizeof(ipconfig));
    wifi_get_ip_info(STATION_IF, &ipconfig);

    os_memcpy(pesp_conn->proto.tcp->remote_ip, &ipconfig.ip, 4);

    espconn_secure_connect(pesp_conn);
    espconn_regist_recvcb(pesp_conn, https_client_recv);
    espconn_regist_connectcb(pesp_conn, https_client_connect);
    espconn_regist_reconcb(pesp_conn, https_client_reconnect);
}

void ICACHE
举报

更多回帖

发帖
×
20
完善资料,
赚取积分