2013-08-04 3 views
1

Я пытаюсь создать небольшой проект, используя библиотеку Arduino Ethernet, но у меня возникла странная проблема с DNS: Он не может разрешить любое имя домена, локальное для моей сети, но у него нет проблема разрешения общедоступных доменных имен. Никакая другая система в моей сети не имеет проблем с этими локальными именами доменов, это просто кажется 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 

Кто-нибудь есть идеи то, что продолжается?

+0

Вы пробовали его с нижним регистром i .e. 'tycho.localnet'? –

+0

Да, и результат тот же. –

ответ

0

Многие маршрутизаторы предоставят свой IP-адрес локальной сети в качестве DNS-адреса - это типичное поведение для настроек DHCP. Это не обязательно означает, что они на самом деле являются сервером . Некоторые просто перенаправляют DNS-запросы на серверы на стороне WAN и возвращают ответ. Этот тип конфигурации, в котором маршрутизатор является только прокси, объясняет ваши симптомы.

Когда маршрутизатор является прокси-сервером, запросы DNS Arduino просто перенаправляются на внешний DNS-сервер, который не знает ваши локальные имена.

Аппарат Linux использует другие сетевые протоколы для обнаружения локальных имен. То же самое происходит с машинами Windows, где известны имена локальных компьютеров. Если вы запустите сетевой монитор, например Wireshark, вы увидите, что компьютеры регулярно сообщают о своем присутствии на других компьютерах. Arduino имеет простой TCP/IP и не обрабатывает эти трансляции.

Если маршрутизатор действительно является сервером, необходимо настроить таблицу с именами для сопоставления IP-адресов. Чтобы сделать эту работу, вы не можете использовать динамические адреса, потому что то, что вы вводите в таблицу в один день, будет недействительным другим. Чтобы локальный DNS-сервер работал с DHCP, вы хотели бы заблокировать IP-адрес каждого компьютера, будь то со стороны компьютера или на маршрутизаторе, путем привязки определенных MAC-адресов к определенным IP-адресам.

+0

Итак, что это за «другие сетевые протоколы», которые машина Linux использует для поиска? Я понимаю, что мой маршрутизатор захватывает эти объявления и делает их доступными через DNS, поскольку их можно запросить с помощью стандартных инструментов DNS. –

+0

Другие по линии LDAP, Samba, DLNA, Bonjour. Мои Linux-боксы могут видеть имена ящиков Windows, я полагаю, через Samba. Два разных блока NAS могут запускать серверы LDAP. Все эти вещи транслируют между собой, объявляя о своих услугах. Файл hosts добавит элементы в nslookup. На рабочем столе намного больше, чем на Arduino. – jdr5ca

2

Я не знаю, если вы уже нашли решение, но только в случае, если:

Там же дефект в inet_aton который является частью библиотеки DNS:
Это, как предполагается преобразовать строку IP-адрес для Тип IPAddress.

Чтобы узнать, он проверяет каждый символ в строке для цифр:

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

но любой буквенный символ соответствует *p >= '0'

Оно должно быть:

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

Вам нужно изменить в Dns.cpp

+0

Это исправление работает для меня. Могла ли эта обратная связь к этому восходящему потоку? –

Смежные вопросы