Wykrywasz urządzenia IoT w przeglądarce internetowej?

11

Ostatnio kupiłem kilka przekaźników Wi-Fi od Xiaomi. Chociaż do tej pory były solidne, naprawdę nie lubię aplikacji Xiaomi. Ale podoba mi się pomysł, że faktycznie działa zarówno w sieci LAN, jak i przez Internet. W sieci LAN bardzo szybko się włączają i wyłączają, biorąc pod uwagę serwery Xiaomi w Chinach.

Więc chcę rzucić własny przekaźnik oparty na ESP8266 (wiem, że mogę przygotować sprzęt, więc to bonus). Mój problem polega na tym, w jaki sposób mogę automatycznie wykryć przekaźniki w mojej sieci ze strony internetowej?

Z „aplikacji” mógłbym używać SSDP, mDNS-SD lub UPNP do wykrywania rzeczy. Ale nie znalazłem informacji na temat tego, czy jest to możliwe w przeglądarce internetowej (zasadniczo Chrome na Androida). Ponieważ zmieniłem moją stronę internetową stacji pogodowej na Progresywną aplikację internetową, byłem uzależniony. Naprawdę podoba mi się pomysł, że są to strony internetowe, a nie aplikacje, które musisz zainstalować. PWA również wypełniają lukę w trybie offline.

Dziwne jest jednak to, że „trudna” część (włączanie i wyłączanie przekaźników spoza sieci LAN) jest łatwa do rozwiązania za pośrednictwem serwera MQTT. Ale wolałbym nie polegać na zewnętrznym serwerze MQTT. Jeśli jestem w sieci LAN, chcę bezpośrednio rozmawiać z przekaźnikami. Jeśli nie, wyślij polecenie za pośrednictwem MQTT.

Mógłbym oczywiście polegać na serwerze, by sprawdzać przekaźniki, ale w takim przypadku potrzebowałbym połączenia z Internetem (jeśli mój serwer MQTT jest w „chmurze”) lub serwera hostowanego w domu. W domu mam serwer i nawet gdybym tego nie zrobił, malinowa pi mogłaby z łatwością wypełnić tę lukę. Ale idealnym rozwiązaniem byłoby nawet nie potrzebować serwera podczas rozmowy z urządzeniami przez sieć LAN (w tym przypadku Wi-Fi). Wolę zachować jak najwięcej P2P i używam MQTT tylko jako rezerwy, gdy jestem na WAN (MQTT rozwiązuje problemy z CG-NAT i przekierowaniem portów).

hjf
źródło
1
Witaj na stronie, hjf! Obecnie twoje pytanie jest dość szerokie. Byłoby pomocne, gdybyś był bardziej szczegółowy: na przykład, jakich języków obecnie używasz i na jakie błędy / problemy napotykasz?
anonimowy2
1
@ anonymous2 cóż, to bardzo ogólne pytanie. Nie chcę pytać konkretnie „czy mogę tworzyć zapytania mDNS bezpośrednio z przeglądarki?” ponieważ odpowiedź brzmi NIE. Jest w tym standard, ale nie ma implementacji. Szukam alternatyw lub podobnej funkcjonalności.
hjf
Znane nazwy hostów MDNS działają dobrze z przeglądarki działającej w systemie operacyjnym takim jak OSX lub większość Linuces, które je obsługują, chociaż przeglądanie prawdopodobnie nie działa. Oczywiście nie działają one w systemach operacyjnych takich jak Windows lub Android, które ich nie obsługują, chyba że zainstalowano dodatkowe możliwości.
Chris Stratton

Odpowiedzi:

6

Nie znam żadnych ogólnych możliwości wykrywania lokalnego wbudowanych w przeglądarkę. W rzeczywistości uważam każdą zdolność za czcigodną za bezpieczeństwo, ponieważ pozwoliłaby atakującym zdalnie profilować twoją sieć, chyba że miałaby ręczny krok interakcji, aby ją uruchomić, co naprawdę spowolniłoby przepływ pracy, o którym myślę, że chcesz.

Mogę wymyślić 2 rzeczy, które się zbliżają:

  1. Możliwość odkrycia Chromecasta wkroczyła w Chrome. Kiedyś była to osobna wtyczka przed jej wdrożeniem. Ale wciąż wymaga to ręcznego kroku, w którym użytkownik uruchamia wyszukiwanie, a następnie ręcznego wyboru szczegółów urządzenia, które ma zostać przekazane z powrotem do strony / javascript. (używa SSDP w ramach okładek iirc)

  2. Obsługa skanowania WebBluetooth. Jest to podobny model do wykrycia Chromecasta: użytkownik musi zainicjować skanowanie, a następnie musi ręcznie wybrać z urządzeń znalezionych w przeglądarce, które szczegóły są przekazywane z powrotem do javascript na stronie.

Użyłem metody WebBluetooth, aby odkryć lokalny włącznik światła (mam aplikację BLE na pi zero kontrolującą żarówkę Belkin WeMo https://github.com/hardillb/physical-web-lightswitch ). Działa, ale nie jest płynna, ponieważ wymaga co najmniej 2 interakcji użytkownika, aby odkryć jedno urządzenie.

Chociaż nie spełnia wszystkich lokalnych wymagań, myślę, że korzystanie z podejścia brokera w chmurze, nawet jeśli działasz lokalnie, będzie płynniejsze dla użytkownika.

hardillb
źródło
Niezła odpowiedź. Nie szukałem tego, ale chyba tego się spodziewałem. Istnieje interfejs API NSD z W3C, ale jedyną implementacją jest dla Google Chrome Apps. I
hjf
Wygląda na to, że interfejs API NSD został zabity z dokumentu: w3.org/TR/discovery-api
hardillb
Proponowana tutaj teoria bezpieczeństwa ma pewne rzeczy wstecz: jeśli istnieje jakiś problem, to nie chodzi o to, że robi to odkrycie (przeglądarka), ale raczej o to, co czyni się wykrywalnym. Zapraszamy do wyrażenia własnej opinii na temat mądrości wykrywalności, ale warto zauważyć, że jest to niezwykle powszechne domyślne zachowanie wielu komputerów osobistych, drukarek i innych urządzeń. Gotowość z przeglądarką eksploatowanym przez upoważnioną osobę, aby znaleźć coś (lub nie) nie mówi nic o możliwości nieuprawnionej osobie odkryć urządzeń.
Chris Stratton
2

Jeśli masz interfejs sieciowy na urządzeniu i skonfigurujesz go tak, aby posiadał nazwę hosta MDNS za pośrednictwem usługi odpowiadającej MDNS, takiej jak bonjour lub avahi, to w funkcjonalnych systemach operacyjnych możesz po prostu skierować przeglądarkę na

https: //livingroomlight.local

Lub cokolwiek skonfigurowałeś, aby się nazywać.

Działa to od razu z przeglądarkami działającymi na OSX, iOS i większości Linuces, które obsługują rozpoznawanie nazw hostów MDNS na poziomie systemu.

Nie będzie to jednak działać w systemie Windows, chyba że zainstalujesz dodatkową obsługę MDNS i nie będzie działać ze standardowymi przeglądarkami Androida, chociaż możliwe jest tworzenie niestandardowych aplikacji dla Androida, które ją obsługują.

Wykrywanie nieznanych instancji w sieci zazwyczaj nie jest obsługiwane przez przeglądarkę, ale zazwyczaj jest obsługiwane przez interfejsy API systemu operacyjnego i narzędzia wiersza poleceń, takie jak dns-sd(OSX) i avahi-browse(Linux).

Chociaż nie wydaje się oczywiste, że przeglądarka może znaleźć twoje urządzenia, jeśli możesz po prostu zapamiętać to, co nazwałeś jednym z nich, możesz się z nim połączyć i potencjalnie może pokazać ci linki do wszystkich swoich rówieśników, wykonując MDNS szukaj sam.

Możesz też odpalić terminal i uzyskać odpowiedź. W tym przypadku możesz uruchomić lokalnego demona, który przeprowadziłby wyszukiwanie MDNS i pokazałby wynik jako stronę linków obsługiwanych tylko w interfejsie pętli zwrotnej, a zatem niedostępnych dla żadnej innej maszyny.

Chris Stratton
źródło
1
Taki wstyd. Może to być alternatywa, jeśli jest obsługiwana. Zastanawiam się, jakie jest uzasadnienie braku obsługi mdns-sd w przeglądarkach? W każdym razie uważam, że jedynym sposobem na niezawodne działanie byłoby po prostu użycie MQTT jako metody wykrywania. Mieć coś w rodzaju „ogłaszać” punkt końcowy, w którym urządzenia zgłaszałyby się same i buforować te odpowiedzi.
hjf
Nie robi tego żadna przeglądarka - to rozszerzona implementacja DNS systemu operacyjnego, co oznacza, że ​​przeglądarka (lub cokolwiek innego) może używać nazwy takiej jak livingroomlight. Lokalny MQTT naprawdę ci nie pomoże - coś będzie miało do zbierania wyników i prezentowania ich, niezależnie od tego, czy jest to skrzynka sprzętowa, demon na komputerze czy człowiek.
Chris Stratton
1
Ale Android obsługuje mDNS w „aplikacjach”. Możliwe jest wysyłanie zapytań mDNS za pośrednictwem aplikacji i uzyskiwanie odpowiedzi. Dlaczego nikt nie wdraża mDNS-SD i udostępnia go JS? Wprowadzono standard, który został pobrany i wdrożony tylko częściowo, szczególnie w celu wykrycia Chromecasta.
hjf
1
Ponownie, ponieważ nikt nie zajmuje się MDNS w przeglądarkach internetowych; działa dla znanych nazw hostów, w których DNS systemu operacyjnego jest rozszerzony, aby go obsługiwać. Android nie jest, chociaż oferuje możliwości MDNS dla aplikacji poprzez oddzielny, unikalny dla Androida interfejs API, który nie ma nic wspólnego z tym, jak rozwiązuje nazwy domen.
Chris Stratton
1
To mój punkt. Dlaczego nikt tego nie naciska? Ponieważ Internet Rzeczy staje się coraz bardziej popularny, jak to możliwe, że tego rodzaju interfejsy API są specyficzne dla dostawcy zablokowane, a W3C wprowadził standard?
hjf