khoih-prog / MDNS_Generic

mDNS Library for nRF52, SAMD21, SAMD51, SAM DUE, STM32F/L/H/G/WB/MP1, AVR Mega, RP2040-based boards, etc. using Ethernet W5x00. Supports mDNS (Registering Services) and DNS-SD (Service Discovery). Ethernet_Generic library is used as default for W5x00
GNU General Public License v3.0
38 stars 12 forks source link

Example code in WiFiDiscoveringServices not working on Arduino MKR WiFi 1010, found "\r\n" in serial input. #12

Closed harounhajem closed 2 years ago

harounhajem commented 2 years ago

Describe the bug

The example code for WiFiDiscoveringServices.ino has a bug. When user inputs a service type from prompt the input will contain "\r\n" and that causes the startDiscoveringService to not return any services.

Steps to Reproduce

  1. Start a mDNS service locallyband start for example a _mqtt._tcp service.
  2. Run the example WiFiDiscoveringServices.ino
  3. Input "_mqtt" in the serial prompt.

Expected behavior

The user should be able to input any service name such as "_mqtt" or "_http" in the serial prompt and get an answer back with the service found.

Actual behavior

When user inputs "_http" or "_mqtt" in the serial prompt the mDNS service returns with nothing only showing this text, "Finished discovering services of type ".

Information

IDE: Platform.io version 3.4.3 Board: Arduino MKR Wifi 1010 OS: Windows 11 Perquisites: Run a mDNS service locally like this: "dns-sd.exe -R mqttb _mqtt._tcp . 1883"

Additional context

Found that this part in the example code, WiFiDiscoveringServices.ino, might hold the bug. Variable serviceName will contain "\r\n" after user inputs service name to serial prompt and that causes the startDiscoveringService to not work properly.

void loop()
{
  char serviceName[256];
  int length = 0;

  while (Serial.available())
  {
    serviceName[length] = Serial.read();
    length = (length + 1) % 256;
    delay(5);
  }

  serviceName[length] = '\0';
  ....
  mdns.startDiscoveringService(serviceName, MDNSServiceTCP, 5200);
 ... .
}

I've fixed it with replacing the code with this instead.

void loop() {
  String inputString = "";
  while (Serial.available() > 0) {
    delay(10);
    char c = Serial.read();
    inputString += c;
  }
  if (!mdns.isDiscoveringService() && inputString.length() > 0) {
      // Remove newline 
      inputString.replace("\r\n", "");

      // Convert string to char array
      char charArray[inputString.length() + 1];
      inputString.toCharArray(charArray, inputString.length() + 1);

      mdns.startDiscoveringService(charArray, MDNSServiceTCP, 5200);
  }
khoih-prog commented 2 years ago

Hi @harounhajem

The new MDNS_Generic v1.4.2 has just been published. Your contribution is noted in Contributions and Thanks

Best Regards,


Releases v1.4.2

  1. Fix bug in UDP length check and in WiFi example. Check UDP Length check discards correct responses when resolving names - On Nano RP2040 Connect #13
  2. Fix bug in example WiFiDiscoveringServices
  3. Update Packages' Patches