From 24c9a75975d5a06d2ffab2923ec85461cb30c055 Mon Sep 17 00:00:00 2001 From: Liu Han Date: Thu, 25 Oct 2018 10:00:03 +0800 Subject: [PATCH] fix(smartconfig): The remote IP of cellphone is incorrect when using Airkiss method --- .../smartconfig_ack/include/smartconfig_ack.h | 2 ++ components/smartconfig_ack/smartconfig_ack.c | 36 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/components/smartconfig_ack/include/smartconfig_ack.h b/components/smartconfig_ack/include/smartconfig_ack.h index 6bee2383..88d5b8be 100644 --- a/components/smartconfig_ack/include/smartconfig_ack.h +++ b/components/smartconfig_ack/include/smartconfig_ack.h @@ -24,6 +24,8 @@ extern "C" { #define SC_ACK_TOUCH_SERVER_PORT 18266 /*!< ESP touch UDP port of server on cellphone */ #define SC_ACK_AIRKISS_SERVER_PORT 10000 /*!< Airkiss UDP port of server on cellphone */ +#define SC_ACK_AIRKISS_DEVICE_PORT 10001 /*!< Airkiss UDP port of server on device */ +#define SC_ACK_AIRKISS_TIMEOUT 1500 /*!< Airkiss read data timeout millisecond */ #define SC_ACK_TOUCH_LEN 11 /*!< Length of ESP touch ACK context */ #define SC_ACK_AIRKISS_LEN 7 /*!< Length of Airkiss ACK context */ diff --git a/components/smartconfig_ack/smartconfig_ack.c b/components/smartconfig_ack/smartconfig_ack.c index 99408ef0..9e8028be 100644 --- a/components/smartconfig_ack/smartconfig_ack.c +++ b/components/smartconfig_ack/smartconfig_ack.c @@ -19,9 +19,13 @@ #include #include +#include + +#include +#include + #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "lwip/sockets.h" #include "tcpip_adapter.h" #include "esp_log.h" #include "esp_wifi.h" @@ -87,6 +91,36 @@ static void sc_ack_send_task(void *pvParameters) setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &optval, sizeof(int)); + if (ack->type == SC_ACK_TYPE_AIRKISS) { + char data = 0; + struct sockaddr_in local_addr, from; + socklen_t sockadd_len = sizeof(struct sockaddr); + struct timeval timeout = { + SC_ACK_AIRKISS_TIMEOUT / 1000, + SC_ACK_AIRKISS_TIMEOUT % 1000 * 1000 + }; + + bzero(&local_addr, sizeof(struct sockaddr_in)); + bzero(&from, sizeof(struct sockaddr_in)); + local_addr.sin_family = AF_INET; + local_addr.sin_addr.s_addr = INADDR_ANY; + local_addr.sin_port = htons(SC_ACK_AIRKISS_DEVICE_PORT); + + bind(send_sock, (struct sockaddr *)&local_addr, sockadd_len); + setsockopt(send_sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + recvfrom(send_sock, &data, 1, 0, (struct sockaddr *)&from, &sockadd_len); + if (from.sin_addr.s_addr != INADDR_ANY) { + memcpy(remote_ip, &from.sin_addr, 4); + server_addr.sin_addr.s_addr = from.sin_addr.s_addr; + } else { + if (ack->cb) { + ack->cb(SC_STATUS_LINK_OVER, remote_ip); + } + goto _end; + } + } + while (s_sc_ack_send) { /* Send smartconfig ACK every 100ms. */ vTaskDelay(100 / portTICK_RATE_MS);