From 01c67a0c49eea9c0041a2fca0c7644c81370ecc9 Mon Sep 17 00:00:00 2001 From: Radu Pascal Date: Sun, 31 Jul 2016 12:11:57 +0300 Subject: [PATCH] ESP8266mDNS using the provided IP in the begin method this fix forces the mDNS to use the provided IP in the begin method instead of the auto detected IP. this is required if the ESP8266 starts in the AP_STA mode and activates only the AP initially. --- libraries/ESP8266mDNS/ESP8266mDNS.cpp | 41 +++++++++++++++++++-------- libraries/ESP8266mDNS/ESP8266mDNS.h | 7 ++--- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/ESP8266mDNS.cpp index 71dca73260..d2fb076f80 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/ESP8266mDNS.cpp @@ -142,26 +142,39 @@ MDNSResponder::~MDNSResponder() { _answers = 0; } -bool MDNSResponder::begin(const char* hostname){ - size_t n = strlen(hostname); +bool MDNSResponder::begin(const char* hostName){ + return _begin(hostName, 0, 120); +} + +bool MDNSResponder::begin(const char* hostName, IPAddress ip, uint32_t ttl){ + return _begin(hostName, ip, ttl); +} + +bool MDNSResponder::_begin(const char *hostName, uint32_t ip, uint32_t ttl){ + size_t n = strlen(hostName); if (n > 63) { // max size for a single label. return false; } + _ip = ip; + // Copy in hostname characters as lowercase - _hostName = hostname; + _hostName = hostName; _hostName.toLowerCase(); // If instance name is not already set copy hostname to instance name - if (_instanceName.equals("") ) _instanceName=hostname; + if (_instanceName.equals("") ) _instanceName=hostName; - _gotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP& event){ - _restart(); - }); + //only if the IP hasn't been set manually, use the events + if (ip == 0) { + _gotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP& event){ + _restart(); + }); - _disconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected& event) { - _restart(); - }); + _disconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected& event) { + _restart(); + }); + } return _listen(); } @@ -442,7 +455,11 @@ uint16_t MDNSResponder::_getServicePort(char *name, char *proto){ uint32_t MDNSResponder::_getOurIp(){ int mode = wifi_get_opmode(); - if(mode & STATION_MODE){ + + //if has a manually set IP use this + if(_ip){ + return _ip; + } else if(mode & STATION_MODE){ struct ip_info staIpInfo; wifi_get_ip_info(STATION_IF, &staIpInfo); return staIpInfo.ip.addr; @@ -532,7 +549,7 @@ void MDNSResponder::_parsePacket(){ tmp8 = _conn_read8(); break; } - if (tmp8 == 0x00) { // Énd of name + if (tmp8 == 0x00) { // End of name break; } _conn_readS(serviceName, tmp8); diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.h b/libraries/ESP8266mDNS/ESP8266mDNS.h index a32c18337c..69f9d14458 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.h +++ b/libraries/ESP8266mDNS/ESP8266mDNS.h @@ -63,9 +63,7 @@ class MDNSResponder { ~MDNSResponder(); bool begin(const char* hostName); //for compatibility - bool begin(const char* hostName, IPAddress ip, uint32_t ttl=120){ - return begin(hostName); - } + bool begin(const char* hostName, IPAddress ip, uint32_t ttl=120); void update(); void addService(char *service, char *proto, uint16_t port); @@ -116,8 +114,9 @@ class MDNSResponder { bool _waitingForAnswers; WiFiEventHandler _disconnectedHandler; WiFiEventHandler _gotIPHandler; - + uint32_t _ip; + bool _begin(const char* hostName, uint32_t ip, uint32_t ttl); uint32_t _getOurIp(); uint16_t _getServicePort(char *service, char *proto); MDNSTxt * _getServiceTxt(char *name, char *proto);