Skip to content

Commit f46ef19

Browse files
committed
fix(sc): fix the issue of sending failure and exit
1. Send unicast first, use broadcast to send if unicast fails. 2. Send 60 times successfully before exiting.
1 parent fc70295 commit f46ef19

File tree

2 files changed

+21
-18
lines changed

2 files changed

+21
-18
lines changed

components/esp8266/source/smartconfig_ack.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static void sc_ack_send_task(void* pvParameters)
7979
sc_ack_t* ack = (sc_ack_t*)pvParameters;
8080
tcpip_adapter_ip_info_t local_ip;
8181
uint8_t remote_ip[4];
82-
memset(remote_ip, 0xFF, sizeof(remote_ip));
82+
memcpy(remote_ip, ack->ctx.ip, sizeof(remote_ip));
8383
struct sockaddr_in server_addr;
8484
socklen_t sin_size = sizeof(server_addr);
8585
int send_sock = -1;
@@ -99,6 +99,7 @@ static void sc_ack_send_task(void* pvParameters)
9999
port_bit = 0;
100100
}
101101
remote_port = SC_ACK_TOUCH_V2_SERVER_PORT(port_bit);
102+
memset(remote_ip, 0xFF, sizeof(remote_ip));
102103
} else {
103104
remote_port = SC_ACK_AIRKISS_SERVER_PORT;
104105
}
@@ -156,30 +157,32 @@ static void sc_ack_send_task(void* pvParameters)
156157
memcpy(remote_ip, &from.sin_addr, 4);
157158
server_addr.sin_addr.s_addr = from.sin_addr.s_addr;
158159
} else {
159-
goto _end;
160+
server_addr.sin_addr.s_addr = INADDR_BROADCAST;
160161
}
161162
}
162163

164+
uint32_t ip_addr = server_addr.sin_addr.s_addr;
163165
while (s_sc_ack_send) {
164166
/* Send smartconfig ACK every 100ms. */
165167
vTaskDelay(100 / portTICK_RATE_MS);
166-
sendlen = sendto(send_sock, &ack->ctx, ack_len, 0, (struct sockaddr*) &server_addr, sin_size);
167-
168-
if (sendlen > 0) {
169-
/* Totally send 60 smartconfig ACKs. Then smartconfig is successful. */
170-
if (packet_count++ >= SC_ACK_MAX_COUNT) {
171-
esp_event_post(SC_EVENT, SC_EVENT_SEND_ACK_DONE, NULL, 0, portMAX_DELAY);
172-
goto _end;
173-
}
168+
if (ip_addr != INADDR_BROADCAST) {
169+
sendto(send_sock, &ack->ctx, ack_len, 0, (struct sockaddr*) &server_addr, sin_size);
170+
server_addr.sin_addr.s_addr = INADDR_BROADCAST;
171+
sendlen = sendto(send_sock, &ack->ctx, ack_len, 0, (struct sockaddr*) &server_addr, sin_size);
172+
server_addr.sin_addr.s_addr = ip_addr;
174173
} else {
175-
err = sc_ack_send_get_errno(send_sock);
176-
177-
if (err == ENOMEM || err == EAGAIN) {
178-
ESP_LOGD(TAG, "send failed, errno %d", err);
179-
continue;
180-
}
174+
sendlen = sendto(send_sock, &ack->ctx, ack_len, 0, (struct sockaddr*) &server_addr, sin_size);
175+
}
181176

177+
if (sendlen <= 0) {
178+
err = sc_ack_send_get_errno(send_sock);
182179
ESP_LOGE(TAG, "send failed, errno %d", err);
180+
vTaskDelay(200 / portTICK_RATE_MS);
181+
}
182+
183+
/* Send 60 smartconfig ACKs, exit regardless of failure or success. */
184+
if (packet_count++ >= SC_ACK_MAX_COUNT) {
185+
esp_event_post(SC_EVENT, SC_EVENT_SEND_ACK_DONE, NULL, 0, portMAX_DELAY);
183186
goto _end;
184187
}
185188
}

examples/wifi/smart_config/main/Kconfig.projbuild

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ config ESP_TOUCH
1212
bool "ESPTouch"
1313
config AIRKISS
1414
bool "AirKiss"
15-
config ESP_TOUCH-AIRKISS
15+
config ESP_TOUCH_AIRKISS
1616
bool "ESPTouch and AirKiss"
1717
config ESP_TOUCH_V2
1818
bool "ESPTouch-V2"
@@ -22,7 +22,7 @@ config ESP_SMARTCONFIG_TYPE
2222
int
2323
default 0 if ESP_TOUCH
2424
default 1 if AIRKISS
25-
default 2 if ESP_TOUCH-AIRKISS
25+
default 2 if ESP_TOUCH_AIRKISS
2626
default 3 if ESP_TOUCH_V2
2727

2828
endmenu

0 commit comments

Comments
 (0)