首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ESP32 (DOIT DevKit)是如何通过mDNS在同一个局域网中找到另一个主机的?

ESP32 (DOIT DevKit)是如何通过mDNS在同一个局域网中找到另一个主机的?
EN

Stack Overflow用户
提问于 2019-02-10 22:58:46
回答 1查看 2.1K关注 0票数 0

我有一个树莓Pi连接到我的Wifi局域网,响应mDNS作为mqtt-broker.local

我可以通过以下命令在我的笔记本上找到它:

代码语言:javascript
运行
复制
$ avahi-resolve-host-name -4 mqtt-broker.local
mqtt-broker.local   192.168.XXX.YYY

我有一个ESP32 DOIT DevKit设备,如果我使用IP地址192.168.XXX.YYY,它可以通过Wifi向Raspberry发送消息,但是我希望使用mDNS来解析主机。

我无法让mDNS工作,底层的代码打印如下:

代码语言:javascript
运行
复制
Finding the mDNS details...
No services found...
Done finding the mDNS details...
  • 这个密码怎么了?
  • 我应该把什么作为serviceMDNS.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没有多少关于这个“服务”和"proto“的信息,而且我对低级C/C++不太熟悉,这些是什么?

这是我正在使用的代码:

代码语言:javascript
运行
复制
// 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...");
}

这个函数是从这个例子中得到启发的:

Extended.ino

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-11 22:30:06

最后使用的方法与Espressif ( mDNS )提供的类中的类不同,Espressif (ESPmDNS.h)是以下的组合:

  • IPAddress serverIp = MDNS.queryHost(mDnsHost);
  • 在此检查serverIp.toString() == "0.0.0.0"上循环

这是将所有代码粘合在一起的代码:

代码语言:javascript
运行
复制
// 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();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54621991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档