main/task_wifi.c

changeset 70
d6838a268020
parent 62
2e90ada37476
child 71
7a4446a77d09
equal deleted inserted replaced
69:875df139d229 70:d6838a268020
142 return false; 142 return false;
143 } 143 }
144 144
145 145
146 146
147 esp_err_t task_wifi_EventHandler(void *ctx, system_event_t *event) 147 static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
148 { 148 {
149 switch(event->event_id) { 149 switch(event_id) {
150 case SYSTEM_EVENT_SCAN_DONE: 150 case WIFI_EVENT_SCAN_DONE:
151 // Get the results so the memory used is freed. 151 // Get the results so the memory used is freed.
152 ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, accessp_records)); 152 ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, accessp_records));
153 _wifi_Scanned = ap_num; 153 _wifi_Scanned = ap_num;
154 _wifi_ScanDone = true; 154 _wifi_ScanDone = true;
155 break; 155 break;
156 156
157 case SYSTEM_EVENT_STA_START: 157 case WIFI_EVENT_STA_START:
158 // Set the configured hostname for the dhcp client. 158 // Set the configured hostname for the dhcp client.
159 ESP_ERROR_CHECK(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, config.hostname)); 159 ESP_ERROR_CHECK(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, config.hostname));
160 esp_wifi_connect(); 160 esp_wifi_connect();
161 break; 161 break;
162 162
163 // SYSTEM_EVENT_STA_STOP 3 163 case WIFI_EVENT_STA_CONNECTED: {
164 case SYSTEM_EVENT_STA_CONNECTED: { 164 system_event_sta_connected_t* event = (wifi_event_sta_connected_t*) event_data;
165 const system_event_sta_connected_t *connected = &event->event_info.connected;
166 ESP_LOGI(TAG, "Event STA connected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", channel:%d, authmode:%s",
167 connected->ssid, connected->ssid_len, MAC2STR(connected->bssid), connected->channel, apsec[connected->authmode]);
168 wifi_ap_record_t ap_info; 165 wifi_ap_record_t ap_info;
169 esp_wifi_sta_get_ap_info(&ap_info); 166 esp_wifi_sta_get_ap_info(&ap_info);
167 ESP_LOGI(TAG, "Event STA connected, ssid:%s, bssid:" MACSTR ", channel:%d, rssi: %d, authmode:%s",
168 ap_info.ssid, MAC2STR(ap_info.bssid), event->channel, ap_info.rssi, apsec[event->authmode]);
170 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { 169 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
171 wifi_state->STA_connected = true; 170 wifi_state->STA_connected = true;
172 wifi_state->STA_rssi = ap_info.rssi; 171 wifi_state->STA_rssi = ap_info.rssi;
173 sprintf(wifi_state->STA_ssid, "%s", ap_info.ssid); 172 sprintf(wifi_state->STA_ssid, "%s", ap_info.ssid);
174 xSemaphoreGive(xSemaphoreWiFi); 173 xSemaphoreGive(xSemaphoreWiFi);
175 } 174 } else {
175 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_CONNECTED");
176 }
176 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); 177 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED);
177 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); 178 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED);
178 break; 179 break;
179 } 180 }
180 case SYSTEM_EVENT_STA_DISCONNECTED: { 181 case WIFI_EVENT_STA_DISCONNECTED: {
181 const system_event_sta_disconnected_t *disconnected = &event->event_info.disconnected; 182 wifi_event_sta_disconnected_t* disconnected = (wifi_event_sta_disconnected_t*) event_data;
182 wifi_ap_record_t ap; 183 wifi_ap_record_t ap;
183 184
184 ESP_LOGW(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d", 185 ESP_LOGW(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d",
185 disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason); 186 disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason);
186 if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) { 187 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
187 wifi_state->STA_connected = false; 188 wifi_state->STA_connected = false;
188 wifi_state->STA_online = false; 189 wifi_state->STA_online = false;
189 wifi_state->STA_rssi = 0; 190 wifi_state->STA_rssi = 0;
190 xSemaphoreGive(xSemaphoreWiFi); 191 xSemaphoreGive(xSemaphoreWiFi);
191 } 192 } else {
193 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_DISCONNECTED");
194 }
192 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); 195 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED);
193 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); 196 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED);
194 sntp_stop(); 197 sntp_stop();
195 198
196 if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && ! _wifi_ScanAPs) { 199 if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && ! _wifi_ScanAPs) {
231 if (FetchStaConfig()) { 234 if (FetchStaConfig()) {
232 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); 235 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT);
233 } 236 }
234 break; 237 break;
235 } 238 }
236 // SYSTEM_EVENT_STA_AUTHMODE_CHANGE 6 239 case WIFI_EVENT_AP_START:
237 case SYSTEM_EVENT_STA_GOT_IP:
238 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
239 tcpip_adapter_ip_info_t ip;
240 memset(&ip, 0, sizeof(tcpip_adapter_ip_info_t));
241 if (tcpip_adapter_get_ip_info(ESP_IF_WIFI_STA, &ip) == 0) {
242 if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) {
243 wifi_state->STA_online = true;
244 snprintf(wifi_state->STA_ip, 16, IPSTR, IP2STR(&ip.ip));
245 snprintf(wifi_state->STA_nm, 16, IPSTR, IP2STR(&ip.netmask));
246 snprintf(wifi_state->STA_gw, 16, IPSTR, IP2STR(&ip.gw));
247 xSemaphoreGive(xSemaphoreWiFi);
248 }
249 }
250 /*
251 * There doesn't seem to be support for configuring NTP via DHCP so
252 * we need to hardcode the ntp servers. The preffered server can be
253 * set via the setup screen. It should be on your LAN, else leave it
254 * empty. And if you are on a different lan someday, there is no extra
255 * delay because the hostname will not be found.
256 */
257 sntp_stop();
258 if (strlen(config.ntp_server))
259 sntp_setservername(0, config.ntp_server);
260 sntp_setservername(1, (char *)"pool.ntp.org"); // Will get you servers nearby
261 sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED);
262 sntp_set_time_sync_notification_cb(time_sync_notification_cb);
263 sntp_init();
264 #if 0
265 if (strlen(config.ntp_server))
266 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(0));
267 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(1));
268 #endif
269 break;
270
271 case SYSTEM_EVENT_STA_LOST_IP:
272 ESP_LOGW(TAG, "Lost IP address");
273 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
274 if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) {
275 wifi_state->STA_ip[0] = '\0';
276 wifi_state->STA_nm[0] = '\0';
277 wifi_state->STA_gw[0] = '\0';
278 wifi_state->STA_online = false;
279 xSemaphoreGive(xSemaphoreWiFi);
280 }
281 sntp_stop();
282 break;
283
284 // SYSTEM_EVENT_STA_WPS_ER_SUCCESS 9
285 // SYSTEM_EVENT_STA_WPS_ER_FAILED 10
286 // SYSTEM_EVENT_STA_WPS_ER_TIMEOUT 11
287 // SYSTEM_EVENT_STA_WPS_ER_PIN 12
288
289 case SYSTEM_EVENT_AP_START:
290 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_AP_STARTED); 240 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_AP_STARTED);
291 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { 241 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
292 wifi_state->AP_active = true; 242 wifi_state->AP_active = true;
293 wifi_state->AP_clients = 0; 243 wifi_state->AP_clients = 0;
294 xSemaphoreGive(xSemaphoreWiFi); 244 xSemaphoreGive(xSemaphoreWiFi);
295 } 245 } else {
246 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_START");
247 }
296 break; 248 break;
297 249
298 case SYSTEM_EVENT_AP_STOP: 250 case WIFI_EVENT_AP_STOP:
299 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_AP_STARTED); 251 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_AP_STARTED);
300 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { 252 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
301 wifi_state->AP_active = false; 253 wifi_state->AP_active = false;
302 wifi_state->AP_clients = 0; 254 wifi_state->AP_clients = 0;
303 xSemaphoreGive(xSemaphoreWiFi); 255 xSemaphoreGive(xSemaphoreWiFi);
304 } 256 } else {
257 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STOP");
258 }
305 break; 259 break;
306 260
307 case SYSTEM_EVENT_AP_STACONNECTED: { 261 case WIFI_EVENT_AP_STACONNECTED: {
308 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { 262 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
309 wifi_state->AP_clients++; 263 wifi_state->AP_clients++;
310 xSemaphoreGive(xSemaphoreWiFi); 264 xSemaphoreGive(xSemaphoreWiFi);
311 } 265 } else {
312 const system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected; 266 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STACONNECTED");
267 }
268 wifi_event_ap_staconnected_t* staconnected = (wifi_event_ap_staconnected_t*) event_data;
269 // const system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected;
313 ESP_LOGI(TAG, "Event AP connected, mac:" MACSTR ", aid:%d, conns:%d", 270 ESP_LOGI(TAG, "Event AP connected, mac:" MACSTR ", aid:%d, conns:%d",
314 MAC2STR(staconnected->mac), staconnected->aid, wifi_state->AP_clients); 271 MAC2STR(staconnected->mac), staconnected->aid, wifi_state->AP_clients);
315 break; 272 break;
316 } 273 }
317 case SYSTEM_EVENT_AP_STADISCONNECTED: { 274 case WIFI_EVENT_AP_STADISCONNECTED: {
318 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { 275 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
319 if (wifi_state->AP_clients > 0) 276 if (wifi_state->AP_clients > 0)
320 wifi_state->AP_clients--; 277 wifi_state->AP_clients--;
321 else 278 else
322 wifi_state->AP_clients = 0; 279 wifi_state->AP_clients = 0;
323 xSemaphoreGive(xSemaphoreWiFi); 280 xSemaphoreGive(xSemaphoreWiFi);
324 } 281 } else {
325 const system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected; 282 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STADISCONNECTED");
283 }
284 wifi_event_ap_stadisconnected_t* stadisconnected = (wifi_event_ap_stadisconnected_t*) event_data;
285 // const system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected;
326 ESP_LOGI(TAG, "Event AP disconnected, mac:" MACSTR ", aid:%d, conns:%d", 286 ESP_LOGI(TAG, "Event AP disconnected, mac:" MACSTR ", aid:%d, conns:%d",
327 MAC2STR(stadisconnected->mac), stadisconnected->aid, wifi_state->AP_clients); 287 MAC2STR(stadisconnected->mac), stadisconnected->aid, wifi_state->AP_clients);
328 break; 288 break;
329 } 289 }
330 case SYSTEM_EVENT_AP_STAIPASSIGNED:
331 break;
332
333 // SYSTEM_EVENT_AP_PROBEREQRECVED 18
334 // SYSTEM_EVENT_GOT_IP6 19
335 // SYSTEM_EVENT_ETH_START 20
336 // SYSTEM_EVENT_ETH_STOP 21
337 // SYSTEM_EVENT_ETH_CONNECTED 22
338 // SYSTEM_EVENT_ETH_DISCONNECTED 23
339 // SYSTEM_EVENT_ETH_GOT_IP 24
340
341 default: 290 default:
342 printf("Unknown event %d\n", event->event_id); 291 ESP_LOGW(TAG, "Unknown WiFi event %d", event_id);
343 break; 292 break;
344 } 293 }
345 return ESP_OK; 294 }
295
296
297
298 static void got_ip_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
299 {
300 switch (event_id) {
301
302 case IP_EVENT_STA_GOT_IP:
303 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
304 ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
305 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
306 wifi_state->STA_online = true;
307 snprintf(wifi_state->STA_ip, 16, "%s", ip4addr_ntoa(&event->ip_info.ip));
308 snprintf(wifi_state->STA_nm, 16, "%s", ip4addr_ntoa(&event->ip_info.netmask));
309 snprintf(wifi_state->STA_gw, 16, "%s", ip4addr_ntoa(&event->ip_info.gw));
310 xSemaphoreGive(xSemaphoreWiFi);
311 } else {
312 ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_GOT_IP");
313 }
314
315 /*
316 * There doesn't seem to be support for configuring NTP via DHCP so
317 * we need to hardcode the ntp servers. The preffered server can be
318 * set via the setup screen. It should be on your LAN, else leave it
319 * empty. And if you are on a different lan someday, there is no extra
320 * delay because the hostname will not be found.
321 */
322 sntp_stop();
323 if (strlen(config.ntp_server))
324 sntp_setservername(0, config.ntp_server);
325 sntp_setservername(1, (char *)"pool.ntp.org"); // Will get you servers nearby
326 sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED);
327 sntp_set_time_sync_notification_cb(time_sync_notification_cb);
328 sntp_init();
329 #if 0
330 if (strlen(config.ntp_server))
331 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(0));
332 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(1));
333 #endif
334 break;
335
336 case SYSTEM_EVENT_STA_LOST_IP:
337 ESP_LOGW(TAG, "Lost IP address");
338 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
339 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
340 wifi_state->STA_ip[0] = '\0';
341 wifi_state->STA_nm[0] = '\0';
342 wifi_state->STA_gw[0] = '\0';
343 wifi_state->STA_online = false;
344 xSemaphoreGive(xSemaphoreWiFi);
345 } else {
346 ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_LOST_IP");
347 }
348 sntp_stop();
349 break;
350
351 default:
352 ESP_LOGW(TAG, "Unknown IP event %d", event_id);
353 break;
354 }
346 } 355 }
347 356
348 357
349 358
350 void time_sync_notification_cb(struct timeval *tv) 359 void time_sync_notification_cb(struct timeval *tv)
382 391
383 /* event handler and event group for the wifi driver */ 392 /* event handler and event group for the wifi driver */
384 xEventGroupWifi = xEventGroupCreate(); 393 xEventGroupWifi = xEventGroupCreate();
385 /* initialize the tcp stack */ 394 /* initialize the tcp stack */
386 tcpip_adapter_init(); 395 tcpip_adapter_init();
387 ESP_ERROR_CHECK(esp_event_loop_init(task_wifi_EventHandler, NULL)); 396 ESP_ERROR_CHECK(esp_event_loop_create_default());
388 397
389 /* 398 /*
390 * memory allocation of objects used by the task 399 * memory allocation of objects used by the task
391 */ 400 */
392 accessp_records = (wifi_ap_record_t*)malloc(sizeof(wifi_ap_record_t) * MAX_AP_NUM); 401 accessp_records = (wifi_ap_record_t*)malloc(sizeof(wifi_ap_record_t) * MAX_AP_NUM);
427 /* 436 /*
428 * init wifi as station + access point 437 * init wifi as station + access point
429 */ 438 */
430 wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT(); 439 wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
431 ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_config)); 440 ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_config));
441
442 ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL) );
443 ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &got_ip_event_handler, NULL) );
444
432 ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); 445 ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
433 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA)); 446 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));
434 ESP_ERROR_CHECK(esp_wifi_set_bandwidth(WIFI_IF_AP, config.ap_bandwidth)); 447 ESP_ERROR_CHECK(esp_wifi_set_bandwidth(WIFI_IF_AP, config.ap_bandwidth));
435 448
436 // configure the softAP and start it */ 449 /* configure the softAP and start it */
437 wifi_config_t ap_config = { 450 wifi_config_t ap_config = {
438 .ap = { 451 .ap = {
439 .ssid_len = 0, 452 .ssid_len = 0,
440 .channel = config.ap_channel, 453 .channel = config.ap_channel,
441 .authmode = WIFI_AUTH_WPA2_PSK, 454 .authmode = WIFI_AUTH_WPA2_PSK,

mercurial