Как получить информацию заголовка udp на esp8266 - PullRequest
0 голосов
/ 01 февраля 2019

Я использую ESP8266_SDK и пытаюсь ответить на запрос UDP, но не могу найти информацию об отправителе (IP и порт).Я могу передать сообщение, чтобы обойти необходимость IP-адреса отправителя, но я не могу сделать то же самое с портом.И, хотя порт, который я слушаю, является фиксированным, порт, который я должен отправить обратно, меняется с каждым сообщением (это указано в спецификации заголовка UDP, но, очевидно, SDK не дает мне легкий доступ кчто).

Ниже приведены соответствующие части кода:

static void ICACHE_FLASH_ATTR udp_recv(void *arg, char *pusrdata, unsigned short length) {
    struct espconn *pespconn = arg;

    os_printf("client %d.%d.%d.%d:%d -> ", pespconn->proto.udp->remote_ip[0],
              pespconn->proto.udp->remote_ip[1], pespconn->proto.udp->remote_ip[2],
              pespconn->proto.udp->remote_ip[3], pespconn->proto.udp->remote_port);
    os_printf("received %d bytes of data\n", length);
    os_printf("server %d.%d.%d.%d:%d\n", pespconn->proto.udp->local_ip[0],
              pespconn->proto.udp->local_ip[1], pespconn->proto.udp->local_ip[2],
              pespconn->proto.udp->local_ip[3], pespconn->proto.udp->local_port);

    uint16_t i;
    for(i = 0; i < length; ++i) {
        os_printf("%02x ", pusrdata[i]); // the IP and port are not in the user data. It should be in the connection
    }
    os_printf("\n");

    sint8_t errcode = espconn_send(pespconn, response, sizeof(response)); //It's being sent to the wrong place because I don'r know the right IP/port pair.
    if(errcode != 0) {
        os_printf("%s\n", toURL(question));
        os_printf("UDP send: ");
        switch(errcode) {
            //case 0: os_printf("ok\n"); break;
            case ESPCONN_ISCONN: os_printf("already connected\n"); break;
            case ESPCONN_MEM: os_printf("lack of memory\n"); break;
            case ESPCONN_IF: os_printf("fail\n"); break;
            default: os_printf("unknown error (%d)\n", errcode);
        }
    }
}

void ICACHE_FLASH_ATTR server_start(void) {
    struct espconn *conn = (struct espconn *) os_zalloc(sizeof(struct espconn));

    if (conn == NULL) return;

    conn->type = ESPCONN_UDP;
    conn->proto.udp = (esp_udp *) os_zalloc(sizeof(esp_udp));
    conn->proto.udp->local_port = XX; // port my devices listens to
    conn->proto.udp->remote_port = YYYY; // (????) port I should be sending te messages back

    char tcpserverip[16];
    os_sprintf(tcpserverip, "%s", "255.255.255.255\0"); // I broadcasting, but I should use the right IP address
    uint32_t ip = ipaddr_addr(tcpserverip);
    ip = ipaddr_addr(tcpserverip);
    os_memcpy(conn->proto.udp->remote_ip, &ip, 4);

    espconn_regist_recvcb(conn, udp_recv);

    sint8_t errcode = espconn_create(conn);
    conn->proto.udp->remote_ip[2], conn->proto.udp->remote_ip[3]);
    os_printf("UDP connection: ");
    switch(errcode) {
        case 0: os_printf("created\n"); break;
        case ESPCONN_ISCONN: os_printf("already connected\n"); break;
        case ESPCONN_MEM: os_printf("lack of memory\n"); break;
        case ESPCONN_ARG: os_printf("invalid arguments\n"); break;
        default: os_printf("unknown error (%d)\n", errcode);
    }
}

Я попытался установить все поля в соединении (локальный IP, локальный порт, удаленный IP и удаленный порт), только локальные поля (я ожидал, что устройство заполнит удаленные поля самостоятельно, как и должно), только удаленные поля (я даже не получаю сообщение, как ожидалось) и много разных комбинаций.Я также пытался изменить команду на espconn_sendto вместо espconn_send , но это не имеет значения, и где-то еще в этом форуме кто-то сказал, что espconn_sendto имеет ошибку.

Я не смог найти ничего в официальной документации (https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf) об этом.

Как мне получить удаленную информацию? У кого-нибудь есть идеи?

Заранее спасибо за любые предложения.

...