Как ESP32 (DOIT DevKit) находит другой хост в той же локальной сети через mDNS? - PullRequest
0 голосов
/ 11 февраля 2019

У меня Raspberry Pi, подключенный к моей Wifi LAN, который отвечает на mDNS как mqtt-broker.local.

Я могу найти его на своем ноутбуке с помощью этой команды:

$ avahi-resolve-host-name -4 mqtt-broker.local
mqtt-broker.local   192.168.XXX.YYY

У меня естьустройство ESP32 DOIT DevKit, которое может отправлять сообщения на Raspberry Pi через Wi-Fi, если я использую IP-адрес 192.168.XXX.YYY, однако я хотел бы, чтобы мой ESP32 разрешил хост с помощью mDNS.

Я не могу получитьmDNS работает, код внизу печатает:

Finding the mDNS details...
No services found...
Done finding the mDNS details...
  • Что не так с этим кодом?
  • Что я должен поставить как service в MDNS.queryService("mqtt-broker", "tcp")?Я попытался даже с сервисом mqtt безуспешно, однако это не должно иметь значения, mDNS должен работать независимо от того, что выставлено Raspberry Pi (HTTP-сервер, MQTT, FTP любой ...)
  • Проверяя здесь https://github.com/espressif/arduino-esp32/blob/master/libraries/ESPmDNS/src/ESPmDNS.h#L98, не так много информации об этом "сервисе" и "прото", и я не очень хорошо знаком с низкоуровневым C / C ++, что это за вещи?

Это код, который я использую:

// import the headers
#include <ESPmDNS.h>

void findMyPi() {
  Serial.println("Finding the mDNS details...");

  // make sure we are connected to the Wifi
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.println("Not yet connected to Wifi...");
  }

  if (!MDNS.begin("whatever_this_could_be_anything")) {
    Serial.println("Error setting up MDNS responder!");
  }

  // what should I put in here as "service"?
  int n = MDNS.queryService("mqtt-broker", "tcp");
  if (n == 0) {
    Serial.println("No services found...");
  }
  else {
    for (int i = 0; i < n; ++i) {
      // Print details for each service found
      Serial.print("  ");
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(MDNS.hostname(i)); // "mqtt-broker" ??? How can I find it???
      Serial.print(" (");
      Serial.print(MDNS.IP(i));
      Serial.print(":");
      Serial.print(MDNS.port(i));
      Serial.println(")");
    }
  }
  Serial.println("Done finding the mDNS details...");
}

Эта функция была вдохновлена ​​этим примером:

https://github.com/espressif/arduino-esp32/blob/master/libraries/ESPmDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino

1 Ответ

0 голосов
/ 12 февраля 2019

Завершено использованием метода, отличного от класса в этой библиотеке mDNS, предоставленной Espressif (ESPmDNS.h), комбинация:

  • IPAddress serverIp = MDNS.queryHost(mDnsHost);
  • , когда цикл включенэта проверка serverIp.toString() == "0.0.0.0"

Это код, который склеивает все вместе:

// on my laptop (Ubuntu) the equivalent command is: `avahi-resolve-host-name -4 mqtt-broker.local`
String findMDNS(String mDnsHost) { 
  // the input mDnsHost is e.g. "mqtt-broker" from "mqtt-broker.local"
  Serial.println("Finding the mDNS details...");
  // Need to make sure that we're connected to the wifi first
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }
  if (!MDNS.begin("esp32whatever")) {
    Serial.println("Error setting up MDNS responder!");
  } else {
    Serial.println("Finished intitializing the MDNS client...");
  }

  Serial.println("mDNS responder started");
  IPAddress serverIp = MDNS.queryHost(mDnsHost);
  while (serverIp.toString() == "0.0.0.0") {
    Serial.println("Trying again to resolve mDNS");
    delay(250);
    serverIp = MDNS.queryHost(mDnsHost);
  }
  Serial.print("IP address of server: ");
  Serial.println(serverIp.toString());
  Serial.println("Done finding the mDNS details...");
  return serverIp.toString();
}
...