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 Apple, mDNS 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:
MDNS.begin("sandwichboxbot");
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 ):
MDNS.addService("sbbot", "tcp", 1234);
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.
IReadOnlyList<IZeroconfHost> results = await ZeroconfResolver.ResolveAsync("_sbbot._tcp.local.");
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.