From e09c939c42d92f801b190e926876b68933802bd2 Mon Sep 17 00:00:00 2001 From: Lars Englund Date: Wed, 9 Mar 2016 11:12:47 +0100 Subject: [PATCH] Clean code and add example --- libraries/ESP8266mDNS/ESP8266mDNS.cpp | 28 +++---- libraries/ESP8266mDNS/ESP8266mDNS.h | 1 + .../mDNS-SD_Extended/mDNS-SD_Extended.ino | 75 +++++++++++++++++++ 3 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 libraries/ESP8266mDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/ESP8266mDNS.cpp index 733704250..6cecae055 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/ESP8266mDNS.cpp @@ -325,36 +325,38 @@ int MDNSResponder::queryService(char *service, char *proto) { } String MDNSResponder::hostname(int idx) { - if (_answers == 0) { + MDNSAnswer *answer = _getAnswerFromIdx(idx); + if (answer == 0) { return String(); } - MDNSAnswer *answer = _answers; - while (answer != 0 && idx-- > 0) { - answer = answer->next; - } return answer->hostname; } IPAddress MDNSResponder::IP(int idx) { - if (_answers == 0) { + MDNSAnswer *answer = _getAnswerFromIdx(idx); + if (answer == 0) { return IPAddress(); } - MDNSAnswer *answer = _answers; - while (answer != 0 && idx-- > 0) { - answer = answer->next; - } return IPAddress(answer->ip); } uint16_t MDNSResponder::port(int idx) { - if (_answers == 0) { + MDNSAnswer *answer = _getAnswerFromIdx(idx); + if (answer == 0) { return 0; } + return answer->port; +} + +MDNSAnswer* MDNSResponder::_getAnswerFromIdx(int idx) { MDNSAnswer *answer = _answers; while (answer != 0 && idx-- > 0) { answer = answer->next; } - return answer->port; + if (idx > 0) { + return 0; + } + return answer; } MDNSTxt * MDNSResponder::_getServiceTxt(char *name, char *proto){ @@ -577,8 +579,6 @@ void MDNSResponder::_parsePacket(){ } } - Serial.printf("Parts collected: %02x\n", partsCollected); - if ((partsCollected == 0x0F) && serviceMatch) { #ifdef MDNS_DEBUG_RX Serial.println("All answers parsed, adding to _answers list.."); diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.h b/libraries/ESP8266mDNS/ESP8266mDNS.h index e13c5884d..54ce5e800 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.h +++ b/libraries/ESP8266mDNS/ESP8266mDNS.h @@ -123,6 +123,7 @@ private: void _parsePacket(); void _reply(uint8_t replyMask, char * service, char *proto, uint16_t port); size_t advertiseServices(); // advertise all hosted services + MDNSAnswer* _getAnswerFromIdx(int idx); }; extern MDNSResponder MDNS; diff --git a/libraries/ESP8266mDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino b/libraries/ESP8266mDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino new file mode 100644 index 000000000..d3feedee5 --- /dev/null +++ b/libraries/ESP8266mDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino @@ -0,0 +1,75 @@ +/* + ESP8266 mDNS-SD responder and query sample + + This is an example of announcing and finding services. + + Instructions: + - Update WiFi SSID and password as necessary. + - Flash the sketch to two ESP8266 boards + - The last one powered on should now find the other. + */ + +#include +#include + +const char* ssid = "..."; +const char* password = "..."; +char hostString[16] = {0}; + +void setup() { + Serial.begin(115200); + delay(100); + Serial.println("\r\nsetup()"); + + sprintf(hostString, "ESP_%06X", ESP.getChipId()); + Serial.print("Hostname: "); + Serial.println(hostString); + WiFi.hostname(hostString); + + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(250); + Serial.print("."); + } + Serial.println(""); + Serial.print("Connected to "); + Serial.println(ssid); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + if (!MDNS.begin(hostString)) { + Serial.println("Error setting up MDNS responder!"); + } + Serial.println("mDNS responder started"); + MDNS.addService("esp", "tcp", 8080); // Announce esp tcp service on port 8080 + + Serial.println("Sending mDNS query"); + int n = MDNS.queryService("esp", "tcp"); // Send out query for esp tcp services + Serial.println("mDNS query done"); + if (n == 0) { + Serial.println("no services found"); + } + else { + Serial.print(n); + Serial.println(" service(s) found"); + for (int i = 0; i < n; ++i) { + // Print details for each service found + Serial.print(i + 1); + Serial.print(": "); + Serial.print(MDNS.hostname(i)); + Serial.print(" ("); + Serial.print(MDNS.IP(i)); + Serial.print(":"); + Serial.print(MDNS.port(i)); + Serial.println(")"); + } + } + Serial.println(); + + Serial.println("loop() next"); +} + +void loop() { + // put your main code here, to run repeatedly: + +}