Detectando dispositivos IoT no navegador da web?

11

Recentemente, comprei alguns relés wifi da Xiaomi. Embora tenham sido sólidos até agora, eu realmente não gosto do aplicativo da Xiaomi. Mas gosto da ideia de que ele realmente funciona tanto na LAN quanto na Internet. Quando na LAN, eles são muito rápidos de ligar e desligar, considerando que os servidores da Xiaomi estão na China.

Então, eu quero rolar meu próprio relé baseado no ESP8266 (eu sei que posso preparar o hardware, então isso é um bônus). Meu problema é: como posso detectar automaticamente os relés na minha rede a partir de uma página da web?

Em um "aplicativo", eu poderia usar SSDP, mDNS-SD ou UPNP para detectar coisas. Mas não encontrei informações sobre se isso é possível no navegador da web (Chrome no Android basicamente). Desde que mudei minha página da estação meteorológica para um aplicativo da Web progressivo, fiquei viciado. Eu realmente gosto da idéia de coisas serem apenas páginas da Web e não aplicativos que você precisa instalar. E os PWAs também preenchem a lacuna com o modo offline.

É estranho, porém, que a parte "difícil" (ligar e desligar os relés de fora da LAN) seja trivial para resolver por meio de um servidor MQTT. Mas eu preferiria não confiar no servidor MQTT externo. Se eu estiver na LAN, quero falar diretamente com os relés. Caso contrário, envie o comando através do MQTT.

É claro que eu poderia confiar no servidor para consultar os relés, mas nesse caso eu precisaria de uma conexão com a Internet (se meu servidor MQTT estiver na "nuvem") ou um servidor hospedado em casa. Eu tenho um servidor em casa e, mesmo que não tivesse, um pi de framboesa poderia facilmente preencher a lacuna. Mas o ideal seria nem precisar de um servidor ao conversar com os dispositivos pela LAN (neste caso, Wifi). Prefiro manter o máximo possível o P2P e usar o MQTT apenas como alternativa quando estou na WAN (o MQTT resolve os problemas do CG-NAT e do encaminhamento de porta).

hjf
fonte
11
Bem-vindo ao site, hjf! Atualmente, sua pergunta é bastante ampla. Ajudaria se você pudesse ser um pouco mais específico: por exemplo, em quais idiomas você está usando atualmente e quais erros / problemas específicos você está enfrentando?
anonymous2
11
@ anonymous2 bem, é uma pergunta muito geral. Não quero perguntar especificamente "posso fazer consultas mDNS diretamente do navegador?" porque a resposta é NÃO. Existe um padrão sobre isso, mas nenhuma implementação. Estou procurando alternativas ou funcionalidade semelhante.
Hjf 7/03
Os nomes de host MDNS conhecidos funcionam bem em um navegador executando um sistema operacional como o OSX ou a maioria dos Linuces que os suportam, embora a navegação provavelmente não funcione. E é claro que eles não funcionam em um sistema operacional como Windows ou Android que não os suporte, a menos que um recurso adicional esteja instalado.
Chris Stratton

Respostas:

6

Não conheço nenhum recurso genérico de descoberta local incorporado a um navegador. Na verdade, eu consideraria qualquer capacidade uma venerabilidade de segurança, pois permitiria que os invasores criassem o perfil da sua rede remotamente, a menos que houvesse uma etapa de interação manual para iniciá-la, o que reduziria a velocidade do fluxo de trabalho que você está buscando.

Eu posso pensar em duas coisas que se aproximam:

  1. A capacidade de descoberta do Chromecast inserida no Chrome. Isso costumava ser um plug-in separado antes de ser introduzido. Mas isso ainda requer uma etapa manual para onde o usuário aciona uma pesquisa e, em seguida, uma seleção manual dos detalhes do dispositivo a serem passados ​​de volta à página / javascript. (isso usa SSDP sob as capas iirc)

  2. O suporte à digitalização do WebBluetooth. Isso segue um modelo semelhante à descoberta do Chromecast. O usuário precisa iniciar a verificação e escolher manualmente nos dispositivos encontrados pelo navegador quais detalhes são repassados ​​ao javascript na página.

Usei a abordagem WebBluetooth para descobrir um interruptor de luz local (eu tenho um aplicativo BLE em um pi zero controlando uma lâmpada Belkin WeMo https://github.com/hardillb/physical-web-lightswitch ). Funciona, mas não é fácil, pois requer pelo menos 2 interações do usuário para descobrir um único dispositivo.

Embora ele não atenda a todos os seus requisitos locais, acho que usar a abordagem do Cloud Broker, mesmo quando estiver operando localmente, será uma experiência mais agradável para o usuário.

hardillb
fonte
Boa resposta. Não era o que eu estava procurando, mas é o que eu esperava, eu acho. Existe a API NSD do W3C, mas a única implementação é para o Google Chrome Apps. I
hjf 7/0318
Parece que a API NSD foi morto do doc: w3.org/TR/discovery-api
hardillb
A teoria de segurança proposta aqui tem coisas ao contrário: se houver um problema, não é com a coisa que faz a descoberta (navegador), mas com a coisa que está se tornando detectável. Você é bem-vindo à sua própria opinião sobre a sabedoria da descoberta, mas vale a pena notar que esse é o comportamento padrão extremamente comum de muitos computadores pessoais, impressoras e outros dispositivos. A disposição de um navegador operado por uma parte autorizada para encontrar algo (ou não) não diz nada sobre a capacidade de uma parte não autorizada de descobrir dispositivos.
Chris Stratton
2

Se você possui uma interface da web em um dispositivo e o configura para ter um nome de host MDNS por meio de um serviço de resposta MDNS, como bonjour ou avahi, em sistemas operacionais avançados, basta apontar o navegador para

https: //livingroomlight.local

Ou o que você configurou para se chamar.

Isso funcionará imediatamente com navegadores executados no OSX, iOS e na maioria dos Linuces, todos compatíveis com a resolução de nome de host MDNS no nível do sistema.

No entanto, isso não funcionará no Windows, a menos que você instale o suporte adicional ao MDNS e não funcionará com navegadores Android padrão, embora seja possível criar aplicativos de navegador personalizados para Android que o suportem.

A descoberta de instâncias desconhecidas na rede geralmente não é suportada por um navegador, mas normalmente por APIs do sistema operacional e ferramentas de linha de comando como dns-sd(OSX) e avahi-browse(Linux).

Portanto, embora não pareça óbvio que um navegador possa encontrar seus dispositivos, se você puder simplesmente se lembrar do que chamou de um deles, poderá conectar-se a ele e, potencialmente, mostrar links para todos os seus pares, fazendo um MDNS pesquisar em si.

Ou você pode ligar um terminal e obter uma resposta. Nesse caso, você pode executar um daemon local que faria uma pesquisa MDNS e mostraria o resultado como uma página de links servidos apenas na interface de loopback e, portanto, não acessível a qualquer outra máquina.

Chris Stratton
fonte
11
Que vergonha. Esta poderia ser uma alternativa se suportada. Gostaria de saber qual é a lógica de não suportar mdns-sd em navegadores? De qualquer forma, acho que a única maneira de as coisas funcionarem de forma confiável seria usar apenas o MQTT como um método de descoberta. Tenha algum tipo de terminal de "anúncio" onde os dispositivos se reportarão e armazene em cache essas respostas.
hjf 8/0318
Não é o navegador que faz isso - é a implementação estendida do DNS do sistema operacional, o que significa que um navegador (ou qualquer outra coisa) pode usar um nome como livingroomlight.local MQTT realmente não irá ajudá-lo - algo terá coletar resultados e apresentá-los, independentemente de ser uma caixa de hardware, um daemon no PC ou um ser humano.
22818 Chris Stratton
11
Mas o Android suporta mDNS em "aplicativos". É possível enviar consultas mDNS através de aplicativos e obter respostas. Por que ninguém está implementando o mDNS-SD e expondo-o ao JS? Havia um padrão que foi extraído e implementado apenas parcialmente, especificamente para detectar o Chromecast.
Hjf 8/03
11
Novamente, porque ninguém lida com o MDNS em navegadores da web; funciona para nomes de host conhecidos nos quais o DNS do sistema operacional subjacente é estendido para suportá-lo. O Android não é, apesar de oferecer recursos de MDNS para aplicativos por meio de uma API exclusiva do Android, que não tem nada a ver com a maneira como resolve nomes de domínio.
Chris Stratton
11
Esse é meu argumento. Por que ninguém está pressionando por isso? Com a IoT se tornando cada vez mais comum, como é possível que esse tipo de API seja específico do fornecedor e o W3C tenha adotado o padrão?
Hjf 09/03