Multicast DNS i Bonjour/Zeroconf

0
17

Multicast DNS (mDNS) służy do tłumaczenia nazw sieciowych na adresy IP w małych sieciach pozbawionych lokalnego serwera nazw. Jest to tak zwana usługa zero-config – nie wymaga żadnej konfiguracji, aby korzystać z połączenia pomiędzy urządzeniami w sieci.


W przypadku systemów firmy ApplemDNS jest wspierany “fabrycznie” przez usługę Bonjour, która jest właśnie implementacją specyfikacji zeroconf  (opracowanej nota-bene również przez Apple). Bonjour pozwala na wykrywanie usług mDNS/DNS-SD.

Aby otrzymać tę samą funkcjonalność w Windows, musimy sobie zainstalować Bonjour dla Windows. W przypadku Linuxa, obsługę zapewnia doinstalowanie Avahi (która jest wolną implementacją zeroconf). Android niestety nie posiada wbudowanej obsługi zeroconf.

W trakcie eksploracji tematu OTA Update w ESP8266, okazało się, że to własnie mDNS i Bonjour są wykorzystywane przez IDE do rozpoznawania urządzeń połączonych do tej samej sieci co komputer programisty, bez względu na nadane im adresy IP. W ramach Bonjour urządzenie prowadzi broadcast UDP, rozgłaszając informacje o swojej nazwie, adresie IP itp.

Z mojego punktu widzenia mDNS i zeroconf stanowią idealne rozwiązanie problemu konfiguracji połączenia z robotem, nad którą głowiłem się od pewnego czasu. Wydaje mi się też, że to rozwiązanie jest dosłownie skrojone pod potrzeby IoT. Posiada bezsprzeczne zalety w sensie dostępu do urządzenia, o którego parametrach sieciowych nic nie wiemy, przeprowadzania jego konfiguracji, czy też wprost do realizowania komunikacji.

Konfiguracja po stronie ESP8266 jest dość prosta, chociaż rozgryzienie i dobre przetestowanie tego zajęło mi kilka dobrych godzin.

Do konfiguracji wykorzystujemy bibliotekę ESP8266mDNS (jeżeli posiadamy zainstalowaną w IDE (Arduino IDE czy też Visual Micro) obsługę ESP8266 to zarówno ta biblioteka, jak i przykłady do niej są dostępne wprost z IDE).

Najpierw inicjalizujemy mDNS podając nazwę hosta, jaką chcemy używać w mDNS:

Następnie dodajemy usługę, która ma być rozpoznawana przez Bonjour ( w tym przypadku, chcę jedynie znać adres IP, wpisałem więc customową nazwę i “głupi” port ):

Możemy sobie teraz uruchomić np. jakiś webserver i w zasadzie już MDNS.begin zapewnia nam możliwość otwarcia go w przeglądarce za pomocą nazwy (do nazwy hosta dodajemy .local).

Niestety, z jakiegoś powodu, najpopularniejsze aplikacje pozwalające podejrzeć listę urządzeń Bonjour, które aktualnie rozgłaszają się w sieci – Bonjour Browser (Windows) i ZeroConf Browser (Android) – nie zawsze wykrywają broadcast z ESP8266. Nie udało mi się niestety ustalić, co jest tego przyczyną. Raz działa a raz nie (być może jest to problem mojej sieci domowej).

Wszystko ok, tyle że w moim przypadku założenie jest takie, że interfejs w przeglądarce jest baaaaardzo opcjonalny. Do obsługi robota mają docelowo służyć aplikacje i nie chciałbym, aby użytkownik był zmuszony do instalowania czegokolwiek poza samą aplikacją. W przypadku Androida jest to wręcz problem. Obsługi zeroconf, która pozwalała by na otwarcie interfejsu w przeglądarce dla tego systemu zwyczajnie nie ma.

Okazuje się, że tu z pomocą przychodzi biblioteka ZeroConf (na licencji Ms-PL). Implementuje ona obsługę Bonjour i pozwala na wykrycie urządzeń/hostów. Z pobieżnego testu, który wykonałem, wynika że radzi sobie bez problemu z odczytaniem danych udostępnianych przez broadcast-ujące ESP8266 bez względu na to, czy pracuje ono w trybie stacji czy w trybie access-pointa. Co najważniejsze, nie wymaga instalacji w systemie żadnego dodatkowego oprogramowania.

W przypadku nadania nazwy usługi jak powyżej, listę hostów możemy pobrać za pomocą jednej komendy.

Otrzymamy tutaj m.in. najważniejszą informację, czyli adres IP urządzenia.

Ponieważ biblioteka ZeroConf jest wieloplatformowa, jest więc duża szansa że spełni również swoje zadanie w aplikacji mobilnej w Xamarin, którą również będę przygotowywał.

Zeroconf to naprawdę bardzo ciekawa i prosta, a zarazem dobrze działająca technologia. Szkoda, że początkowy model licencjonowania, wybrany dla niej przez Apple, był bardzo restrykcyjny. Być może z tego własnie powodu nie stała się ona zaimplementowanym powszechnie standardem.

ZOSTAW ODPOWIEDŹ

Please enter your comment!
Please enter your name here