Обнаружение IoT-устройств в веб-браузере?

11

Недавно я купил пару Wi-Fi реле от Xiaomi. Пока они были солидными, мне действительно не нравится приложение Xiaomi. Но мне нравится идея о том, что он действительно работает как в локальной сети, так и через Интернет. Когда в локальной сети они очень быстро включаются и выключаются, учитывая, что серверы Xiaomi находятся в Китае.

Поэтому я хочу запустить свое собственное реле на основе ESP8266 (я знаю, что могу подготовить аппаратное обеспечение, так что это бонус). Моя проблема в том, как я могу автоматически обнаружить реле в моей сети с веб-страницы?

Из «приложения» я мог использовать SSDP, mDNS-SD или UPNP для обнаружения вещей. Но я не нашел информации о том, возможно ли это из веб-браузера (Chrome на Android в основном). Поскольку я изменил свою веб-страницу с метеостанцией на Progressive Web App, меня зацепило. Мне действительно нравится идея, что веб-страницы - это не приложения, которые нужно устанавливать. И PWAs заполнить пробел в автономном режиме тоже.

Странно, однако, что «сложная» часть (включение и выключение реле вне локальной сети) тривиальна для решения через сервер MQTT. Но я бы предпочел не полагаться на внешний сервер MQTT. Если я нахожусь в локальной сети, я хочу поговорить с реле напрямую. Если нет, то отправьте команду через MQTT.

Конечно, я мог бы положиться на сервер для запроса реле, но в этом случае мне понадобится подключение к Интернету (если мой сервер MQTT находится в «облаке») или домашний сервер. У меня дома есть сервер, и даже если бы я этого не сделал, малиновый пи мог бы легко заполнить пробел. Но в идеале не нужно даже использовать сервер при общении с устройствами по локальной сети (в данном случае Wifi). Я предпочитаю сохранять P2P настолько, насколько это возможно, и использовать MQTT только как запасной вариант, когда я нахожусь в WAN (MQTT решает проблемы CG-NAT и переадресации портов).

HJF
источник
1
Добро пожаловать на сайт, hjf! В настоящее время ваш вопрос довольно широк. Было бы полезно, если бы вы могли быть более конкретным: например, какие языки вы используете в настоящее время, и с какими ошибками / конкретными проблемами вы сталкиваетесь?
anonymous2
1
@ anonymous2 это очень общий вопрос. Я не хочу спрашивать конкретно: «Могу ли я сделать mDNS-запросы напрямую из браузера?» потому что ответ НЕТ. В этом есть стандарт, но нет реализации. Я ищу альтернативы или аналогичные функции.
HJF
Известные имена хостов MDNS работают нормально из браузера, работающего в операционной системе, такой как OSX или большинство Linux, которые их поддерживают, хотя просмотр, вероятно, не работает. И, конечно, они не работают в операционной системе, такой как Windows или Android, которая не поддерживает их, если не установлена ​​дополнительная возможность.
Крис Страттон

Ответы:

6

Мне не известны какие-либо общие возможности локального обнаружения, встроенные в браузер. Фактически, я считаю любую возможность проверкой безопасности, поскольку она позволит злоумышленникам удаленно профилировать вашу сеть, если у нее нет шага ручного взаимодействия для ее запуска, что действительно замедлит рабочий процесс, к которому, я думаю, вы стремитесь.

Я могу думать о 2 вещах, которые подходят близко:

  1. Обнаруживаемость Chromecast встраивается в Chrome. Раньше это был отдельный плагин, прежде чем он был добавлен. Но для этого все же требуется ручной шаг, чтобы пользователь запускал поиск, а затем вручную выбирал сведения об устройстве для передачи обратно на страницу / javascript. (это использует SSDP под крышками IIRC)

  2. Поддержка сканирования WebBluetooth. Это соответствует модели, аналогичной обнаружению Chromecast. Пользователь должен инициировать сканирование, а затем он должен вручную выбрать с устройств, обнаруженных браузером, какие данные передаются обратно в javascript на странице.

Я использовал подход WebBluetooth для обнаружения локального переключателя освещения (у меня есть приложение BLE на пи-ноль, управляющее лампочкой Belkin WeMo https://github.com/hardillb/physical-web-lightswitch ). Он работает, но не является бесшовным, так как для обнаружения одного устройства требуется как минимум 2 взаимодействия с пользователем.

Хотя он не отвечает всем вашим локальным требованиям, я думаю, что использование подхода облачного брокера даже для локальной работы будет более плавным для пользователя.

hardillb
источник
Хороший ответ. Я искал не это, но я ожидал, что это то, чего я ожидал. Существует API NSD от W3C, но единственная реализация - для Google Chrome Apps. Я
hjf
Похоже, что NSD API был убит из документа: w3.org/TR/discovery-api
hardillb
Теория безопасности, предложенная здесь, имеет вещи задом наперед: если есть проблема, дело не в том, что делает обнаружение (браузер), а в том, что делает себя обнаруживаемым. Вы можете принять собственное мнение о целесообразности обнаружения, но стоит отметить, что это очень распространенное поведение по умолчанию для многих персональных компьютеров, принтеров и других устройств. Готовность броузера эксплуатируемого уполномоченной стороны , чтобы найти что - то (или нет) ничего не говорит о возможности несанкционированной стороны обнаружения устройств.
Крис Страттон
2

Если у вас есть веб-интерфейс на устройстве и вы настроили его на использование имени хоста MDNS с помощью службы респондента MDNS, такой как bonjour или avahi, то в функциональных операционных системах вы можете просто указать свой браузер на

https: //livingroomlight.local

Или как бы вы ни настроили его для вызова себя.

Это будет работать из коробки с браузерами, работающими на OSX, iOS и большинстве Linuces, которые поддерживают разрешение имен хостов MDNS на системном уровне.

Однако это не будет работать в Windows, если вы не установите дополнительную поддержку MDNS, и не будет работать со стандартными браузерами Android, хотя возможно создание пользовательских приложений для Android, поддерживающих его.

Обнаружение неизвестных экземпляров в сети обычно не поддерживается браузером, но обычно поддерживается через API операционной системы и инструменты командной строки, такие как dns-sd(OSX) и avahi-browse(Linux).

Поэтому, хотя не кажется очевидным, что браузер может найти ваши устройства, если вы можете просто вспомнить, как вы назвали одно из них, вы можете подключиться к нему, и он может потенциально показать вам ссылки на все его одноранговые узлы, выполнив MDNS. ищи себя.

Или вы можете запустить терминал и получить ответ. В этом случае вы можете запустить локальный демон, который будет выполнять поиск в MDNS и показывать вам результат в виде страницы ссылок, обслуживаемой только через интерфейс обратной связи, и, следовательно, недоступной для любой другой машины.

Крис Страттон
источник
1
Какой позор. Это может быть альтернативой, если поддерживается. Интересно, в чем причина отсутствия поддержки mdns-sd в браузерах? В любом случае, я думаю, что единственный способ надежной работы - это просто использовать MQTT в качестве метода обнаружения. Имейте своего рода "объявить" конечную точку, где устройства сообщат о себе, и кешировать эти ответы.
февраля
Это не браузер делает это - это расширенная реализация DNS операционной системы, что означает, что браузер (или что-то еще) может использовать имя наподобие livingroomlight.local MQTT действительно не поможет вам - что-то будет иметь собирать результаты и представлять их, независимо от того, аппаратный блок, демон на ПК или человек.
Крис Страттон
1
Но android поддерживает mDNS в «приложениях». Можно отправлять mDNS-запросы через приложения и получать ответы. Почему никто не внедряет mDNS-SD и не подвергает его JS? Был стандарт, который был извлечен и реализован только частично, специально для обнаружения Chromecast.
августа
1
Опять же, потому что никто не имеет дело с MDNS в веб-браузерах; это работает для известных имен хостов, где DNS базовой операционной системы расширен для поддержки этого. Android нет, хотя он предлагает приложениям возможности MDNS через отдельный, уникальный для Android API, не имеющий ничего общего с тем, как он разрешает доменные имена.
Крис Страттон
1
Это моя точка зрения. Почему никто не настаивает на этом? В связи с тем, что IoT становится все более распространенным, как получается, что такого рода API-интерфейсы привязаны к конкретному поставщику, а W3C использует стандарт?
августа