【问题标题】:Arduino local DNS problemsArduino本地DNS问题
【发布时间】:2013-08-04 05:10:00
【问题描述】:

我正在尝试使用 Arduino 以太网库构建一个小项目,但我遇到了一个奇怪的 DNS 问题:

它无法解析我的网络本地的任何域名,但解析公共域名没有问题

我的网络上没有其他系统对这些本地域名有问题。它似乎只是 Arduino。

这是我正在使用的:

这是我的测试草图:

#include <SPI.h>
#include <Ethernet.h>
#include <Dns.h>
#include <EthernetUdp.h>

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };

EthernetClient client;

void setup() {
  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    while(true);
  }

  delay(1000);
  Serial.println("connecting...");
  DNSClient dnsClient;

  // Router IP address
  byte dnsIp[] = {192, 168, 11, 1};

  dnsClient.begin(dnsIp);

  // Regular DNS names work...
  IPAddress ip1;
  dnsClient.getHostByName("www.google.com", ip1);
  Serial.print("www.google.com: ");
  Serial.println(ip1);

  // However local ones defined by my router do not (but they work fine everywhere else)...
  IPAddress ip2;
  dnsClient.getHostByName("Tycho.localnet", ip2);
  Serial.print("Tycho.localnet: ");
  Serial.println(ip2);
}

void loop() {

}

这是它的输出(第二个 IP 地址不正确):

connecting...
www.google.com: 74.125.227.84
Tycho.localnet: 195.158.0.0

以下是连接到同一网络的 Linux 机器给出的正确信息:

$ nslookup www.google.com
Server:         192.168.11.1
Address:        192.168.11.1#53

Non-authoritative answer:
Name:   www.google.com
Address: 74.125.227.80
Name:   www.google.com
Address: 74.125.227.84
Name:   www.google.com
Address: 74.125.227.82
Name:   www.google.com
Address: 74.125.227.83
Name:   www.google.com
Address: 74.125.227.81

$ nslookup Tycho.localnet
Server:         192.168.11.1
Address:        192.168.11.1#53

Name:   Tycho.localnet
Address: 192.168.11.2

发生了什么事?

【问题讨论】:

  • 你试过用小写字母tycho.localnet吗?
  • 是的,结果是一样的。

标签: networking dns arduino


【解决方案1】:

我不知道你是否已经找到了解决方案,但以防万一:

inet_aton 存在缺陷,它是 DNS 库的一部分:

这应该将字符串 IP 地址转换为 IPAddress 类型。

要找出它测试字符串中的每个字符的数字:

while (*p &&
       ( (*p == '.') || (*p >= '0') || (*p <= '9') ))

但任何字母字符都匹配*p &gt;= '0'

应该是:

while (*p &&
       ( (*p == '.') || ((*p >= '0') && (*p <= '9')) ))

您需要在Dns.cpp 中更改此项。

【讨论】:

    【解决方案2】:

    许多路由器会提供其 LAN 端 IP 地址作为 DNS 地址——这是 DHCP 设置的典型行为。这并不一定意味着它们实际上是服务器。有些只是将 DNS 请求转发到 WAN 端服务器并返回响应。路由器仅作为代理的这种类型的配置解释了您的症状。

    当路由器是代理时,Arduino DNS 请求只是被转发到不知道您本地名称的外部 DNS 服务器。

    Linux 机器正在使用其他网络协议来发现本地名称。在已知本地计算机名称的 Windows 机器上也会发生同样的情况。如果您运行像 Wireshark 这样的网络监视器,您会看到计算机定期向其他计算机宣布它们的存在。 Arduino 只有简单的 TCP/IP,不处理这些广播。

    如果路由器真的是服务器,那么您必须配置一个包含名称到 IP 地址映射条目的表。要完成这项工作,您不能使用动态地址,因为您在表格中输入的内容有一天会变得无效。要使本地 DNS 服务器与 DHCP 一起工作,您需要在计算机端或通过将特定 MAC 地址链接到特定 IP 地址来锁定每台计算机的 IP 地址。

    【讨论】:

    • 那么,Linux 机器用来进行查找的这些“其他网络协议”是什么?我的理解是,我的路由器正在捕获这些公告并通过 DNS 提供它们,因为可以使用标准 DNS 工具查询它们。
    • 其他类似 LDAP、Samba、DLNA、Bonjour。我的 Linux 机器可以看到 Windows 机器名称,我推测是通过 Samba。两个不同的 NAS 盒子可以运行 LDAP 服务器。所有这些事情都在相互广播,宣布服务。 hosts 文件会将项目添加到 nslookup。在桌面上运行的东西比在 Arduino 上要多得多。
    猜你喜欢
    • 2020-02-04
    • 2014-07-03
    • 2013-09-26
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多