lwip netconn api - не может получить ответ от сервера SNTP

Я пытаюсь написать простой SNTP-клиент для ESP8266 с lwip netconn API (используя esp-open-rtos). Проблема в том, что я не могу получить ответ от сервера.

Код (без проверки ошибок и отладочных сообщений):

#include <string.h>

#include <lwip/api.h>
#include <lwip/err.h>

struct sntp_message
{
    u8_t li : 2;
    u8_t vn : 3;
    u8_t mode : 3;
    u8_t stratum;
    u8_t poll;
    u8_t precision;
    u32_t root_delay;
    u32_t root_dispersion;
    u32_t reference_identifier;
    u32_t reference_timestamp[2];
    u32_t originate_timestamp[2];
    u32_t receive_timestamp[2];
    u32_t transmit_timestamp[2];
} __attribute__((packed));

#define SNTP_MSG_LEN (sizeof(struct sntp_message))

int16_t sntp_sync(char* server)
{
    err_t err;
    int16_t result = ERR_OK;
    ip_addr_t sntp_server_address;
    struct netconn* connection = NULL;
    struct netbuf* send_buffer = NULL;
    struct netbuf* receive_buffer = NULL;
    struct sntp_message* send_buffer_data = NULL;

    err = netconn_gethostbyname(server, &sntp_server_address);
    connection = netconn_new(NETCONN_UDP);
    err = netconn_connect(connection, &sntp_server_address, 123);
    send_buffer = netbuf_new();
    send_buffer_data = netbuf_alloc(send_buffer, SNTP_MSG_LEN);
    memset(send_buffer_data, 0, SNTP_MSG_LEN);
    send_buffer_data->vn = 4;
    send_buffer_data->mode = 3; // Mode client.
    err = netconn_send(connection, send_buffer);
    err = netconn_recv(connection, &receive_buffer); // Here netconn_recv block my thread, and no data received. If i set timeout, i have timeout error.
    return result;
}

Что может быть не так в моем коде? Нужно ли привязывать соединение перед получением данных (через netconn_bind)? Или я забыл что-то еще?


person Anton    schedule 21.08.2016    source источник


Ответы (1)


Не изобретайте велосипед. Саймон Гольдшмидт уже написал SNTP для LwIP. Ссылка. Там вы можете найти описание lwip-contrib и репозиторий git. Вы также можете поискать зеркала (могут быть обновлены) на github или где угодно.

person kyb    schedule 21.08.2016
comment
Я пробовал эту реализацию, но она не удалась - lwip_recvfrom вернул -1. - person Anton; 21.08.2016
comment
Это работает в моем проекте. Проверьте свой порт/драйвер. И lwipopts.h - person kyb; 21.08.2016
comment
TCP-связь отлично работает в моем проекте. Может это беда с UPD? - person Anton; 21.08.2016