Skip to content

Instantly share code, notes, and snippets.

@MakerAsia
Last active January 9, 2023 07:15
Show Gist options
  • Save MakerAsia/37d2659310484bdbba9d38558e2c3cdb to your computer and use it in GitHub Desktop.
Save MakerAsia/37d2659310484bdbba9d38558e2c3cdb to your computer and use it in GitHub Desktop.
ESP32 (ESP-IDF) WiFi connect and resolve DNS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "lwip/inet.h"
#include "lwip/ip4_addr.h"
#include "lwip/dns.h"
#define DEMO_STA_SSID "<< SSID >>
#define DEMO_STA_PASSWORD "<< Password >>"
char szURL[] = "api.thingspeak.com";
ip_addr_t ip_Addr;
ip4_addr_t ip;
ip4_addr_t gw;
ip4_addr_t msk;
bool bConnected = false;
bool bDNSFound = false;
esp_err_t wifi_event_cb(void *ctx, system_event_t *event)
{
if( event->event_id == SYSTEM_EVENT_STA_GOT_IP ) {
ip = event->event_info.got_ip.ip_info.ip;
gw = event->event_info.got_ip.ip_info.gw;
msk = event->event_info.got_ip.ip_info.netmask;
bConnected = true;
}
return ESP_OK;
}
void dns_found_cb(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
{
ip_Addr = *ipaddr;
bDNSFound = true;
}
void mainTask(void *pvParameters)
{
esp_event_set_cb(wifi_event_cb, NULL);
printf("Set mode to STA\n");
esp_wifi_set_mode(WIFI_MODE_STA);
wifi_config_t config;
memset(&config,0,sizeof(config));
strcpy( config.sta.ssid, DEMO_STA_SSID );
strcpy( config.sta.password, DEMO_STA_PASSWORD );
printf("Set config\n");
esp_wifi_set_config( WIFI_IF_STA, &config );
printf("Start\n");
esp_wifi_start();
printf("Connect\n");
esp_wifi_connect();
while( !bConnected )
;
printf("Got IP: %s\n", inet_ntoa( ip ) );
printf("Net mask: %s\n", inet_ntoa( msk ) );
printf("Gateway: %s\n", inet_ntoa( gw ) );
IP_ADDR4( &ip_Addr, 0,0,0,0 );
printf("Get IP for URL: %s\n", szURL );
dns_gethostbyname(szURL, &ip_Addr, dns_found_cb, NULL );
while( !bDNSFound )
;
printf( "DNS found: %i.%i.%i.%i\n",
ip4_addr1(&ip_Addr.u_addr.ip4),
ip4_addr2(&ip_Addr.u_addr.ip4),
ip4_addr3(&ip_Addr.u_addr.ip4),
ip4_addr4(&ip_Addr.u_addr.ip4) );
while (1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
//printf("ping\n");
}
}
void app_main()
{
// xTaskCreatePinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters,
// uxPriority, pxCreatedTask, xCoreID )
xTaskCreatePinnedToCore(&mainTask, "mainTask", 2048, NULL, 5, NULL, 0);
}
@scubachristopher
Copy link

You will dereference a NULL pointer if the DNS fails:

void dns_found_cb(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
{
ip_Addr = *ipaddr;
bDNSFound = true;
}

Should be:

void dns_found_cb(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
{
if (ipaddr != NULL) {
ip_Addr = *ipaddr;
bDNSFound = true;
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment