From f0322747290900e846605260679286fd0221c503 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Tue, 7 Jan 2020 12:04:06 +0200 Subject: [PATCH] ESP8266: Add built-in DNS resolution (disabled by default) --- .../wifi/esp8266-driver/ESP8266/ESP8266.cpp | 6 ++++- .../wifi/esp8266-driver/ESP8266/ESP8266.h | 3 +++ .../wifi/esp8266-driver/ESP8266Interface.cpp | 22 +++++++++++++++++++ .../wifi/esp8266-driver/ESP8266Interface.h | 11 ++++++++++ components/wifi/esp8266-driver/mbed_lib.json | 4 ++++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp b/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp index 9a31dac111..905f46428f 100644 --- a/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp +++ b/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp @@ -609,7 +609,11 @@ nsapi_error_t ESP8266::open_tcp(int id, const char *addr, int port, int keepaliv bool ESP8266::dns_lookup(const char *name, char *ip) { _smutex.lock(); - bool done = _parser.send("AT+CIPDOMAIN=\"%s\"", name) && _parser.recv("+CIPDOMAIN:%s%*[\r]%*[\n]", ip); + set_timeout(ESP8266_DNS_TIMEOUT); + bool done = _parser.send("AT+CIPDOMAIN=\"%s\"", name) + && _parser.recv("+CIPDOMAIN:%15[^\n]\n", ip) + && _parser.recv("OK\n"); + set_timeout(); _smutex.unlock(); return done; diff --git a/components/wifi/esp8266-driver/ESP8266/ESP8266.h b/components/wifi/esp8266-driver/ESP8266/ESP8266.h index 7b18e10a0c..512ec6f8af 100644 --- a/components/wifi/esp8266-driver/ESP8266/ESP8266.h +++ b/components/wifi/esp8266-driver/ESP8266/ESP8266.h @@ -43,6 +43,9 @@ #ifndef ESP8266_MISC_TIMEOUT #define ESP8266_MISC_TIMEOUT 2000 #endif +#ifndef ESP8266_DNS_TIMEOUT +#define ESP8266_DNS_TIMEOUT 15000 +#endif #define ESP8266_SCAN_TIME_MIN 0 // [ms] #define ESP8266_SCAN_TIME_MAX 1500 // [ms] diff --git a/components/wifi/esp8266-driver/ESP8266Interface.cpp b/components/wifi/esp8266-driver/ESP8266Interface.cpp index 3aeb82a5b9..fe5292ee7a 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.cpp +++ b/components/wifi/esp8266-driver/ESP8266Interface.cpp @@ -652,6 +652,28 @@ int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count, scan_mode mode, return ret; } +#if MBED_CONF_ESP8266_BUILT_IN_DNS +nsapi_error_t ESP8266Interface::gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version, const char *interface_name) +{ + char ip[NSAPI_IPv4_SIZE]; + memset(ip, 0, NSAPI_IPv4_SIZE); + if (!_esp.dns_lookup(name, ip)) { + return NSAPI_ERROR_DNS_FAILURE; + } + if (!address->set_ip_address(ip)) { + return NSAPI_ERROR_DNS_FAILURE; + } + + return NSAPI_ERROR_OK; +} + + +nsapi_error_t ESP8266Interface::add_dns_server(const SocketAddress &address, const char *interface_name) +{ + return NSAPI_ERROR_OK; +} +#endif + bool ESP8266Interface::_get_firmware_ok() { ESP8266::fw_at_version at_v = _esp.at_version(); diff --git a/components/wifi/esp8266-driver/ESP8266Interface.h b/components/wifi/esp8266-driver/ESP8266Interface.h index ae7facae7f..0d20ed704e 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.h +++ b/components/wifi/esp8266-driver/ESP8266Interface.h @@ -228,14 +228,25 @@ public: * version is chosen by the stack (defaults to NSAPI_UNSPEC) * @return 0 on success, negative error code on failure */ +#if MBED_CONF_ESP8266_BUILT_IN_DNS + nsapi_error_t gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version, const char *interface_name); +#else using NetworkInterface::gethostbyname; +#endif + + using NetworkInterface::gethostbyname_async; + using NetworkInterface::gethostbyname_async_cancel; /** Add a domain name server to list of servers to query * * @param addr Destination for the host address * @return 0 on success, negative error code on failure */ +#if MBED_CONF_ESP8266_BUILT_IN_DNS + nsapi_error_t add_dns_server(const SocketAddress &address, const char *interface_name); +#else using NetworkInterface::add_dns_server; +#endif /** @copydoc NetworkStack::setsockopt */ diff --git a/components/wifi/esp8266-driver/mbed_lib.json b/components/wifi/esp8266-driver/mbed_lib.json index f2877559a5..541bb02bd5 100644 --- a/components/wifi/esp8266-driver/mbed_lib.json +++ b/components/wifi/esp8266-driver/mbed_lib.json @@ -65,6 +65,10 @@ "channels": { "help": "channel count, 13 by default", "value": null + }, + "built-in-dns": { + "help": "use built-in CIPDOMAIN AT command to resolve address to IP", + "value": false } }, "target_overrides": {