Détecter les appareils IoT dans le navigateur Web?

11

Récemment, j'ai acheté quelques relais wifi à Xiaomi. Bien qu'ils aient été solides jusqu'à présent, je n'aime vraiment pas l'application de Xiaomi. Mais, j'aime l'idée que cela fonctionne réellement à la fois en LAN et sur Internet. Lorsqu'ils sont en LAN, ils s'allument et s'éteignent très rapidement, étant donné que les serveurs de Xiaomi sont en Chine.

Je veux donc rouler mon propre relais basé sur ESP8266 (je sais que je peux préparer le matériel, c'est donc un bonus). Mon problème est, comment puis-je détecter automatiquement les relais sur mon réseau à partir d'une page Web?

À partir d'une «application», je pouvais utiliser SSDP, mDNS-SD ou UPNP pour détecter des choses. Mais je n'ai pas trouvé d'informations sur si cela est possible à partir du navigateur Web (Chrome sur Android essentiellement). Depuis que j'ai changé ma page Web de station météo pour devenir une application Web progressive, je suis accro. J'aime vraiment l'idée que les choses ne soient que des pages Web et non des applications que vous devez installer. Et les PWA comblent également le vide avec le mode hors ligne.

Il est étrange cependant, que la partie "difficile" (allumer et éteindre les relais depuis l'extérieur du LAN) soit triviale à résoudre via un serveur MQTT. Mais je préfère ne pas compter sur le serveur MQTT externe. Si je suis sur le LAN, je veux parler directement aux relais. Sinon, envoyez la commande via MQTT.

Je pouvais, bien sûr, compter sur le serveur pour interroger les relais, mais dans ce cas, j'aurais besoin d'une connexion Internet (si mon serveur MQTT est sur le "cloud"), ou d'un serveur hébergé à domicile. J'ai un serveur à la maison, et même si je n'en avais pas, un Raspberry Pi pourrait facilement combler le vide. Mais l'idéal serait de ne même pas avoir besoin d'un serveur pour parler aux appareils via LAN (Wifi dans ce cas). Je préfère le garder P2P autant que possible, et utiliser uniquement MQTT comme solution de rechange lorsque je suis sur WAN (MQTT résout les problèmes de CG-NAT et de redirection de port).

hjf
la source
1
Bienvenue sur le site, hjf! Actuellement, votre question est assez large. Il serait utile que vous soyez un peu plus précis: par exemple, dans quelles langues utilisez-vous actuellement et quelles erreurs / problèmes spécifiques rencontrez-vous?
anonyme2
1
@ anonymous2 et bien c'est une question très générale. Je ne veux pas demander spécifiquement "puis-je faire des requêtes mDNS directement à partir du navigateur?" parce que la réponse est NON. Il existe une norme à ce sujet, mais aucune mise en œuvre. Je recherche des alternatives ou des fonctionnalités similaires.
hjf
Les noms d'hôte MDNS connus fonctionnent très bien à partir d'un navigateur fonctionnant sur un système d'exploitation comme OSX ou la plupart des Linuces qui les prennent en charge, bien que la navigation ne fonctionne probablement pas. Et bien sûr, ils ne fonctionnent pas sur un système d'exploitation comme Windows ou Android qui ne les prend pas en charge, sauf si des capacités supplémentaires sont installées.
Chris Stratton

Réponses:

6

Je ne connais aucune capacité de découverte locale générique intégrée à un navigateur. En fait, je considérerais toute capacité comme une vénérabilité de sécurité car elle permettrait aux attaquants de profiler votre réseau à distance à moins qu'il n'ait une étape d'interaction manuelle pour le démarrer, ce qui ralentirait vraiment le flux de travail, je pense que vous visez.

Je peux penser à 2 choses qui se rapprochent:

  1. La visibilité du Chromecast intégrée dans le Chrome. Avant, il s'agissait d'un plugin séparé. Mais cela nécessite toujours une étape manuelle pour que l'utilisateur déclenche une recherche, puis une sélection manuelle des détails de l'appareil à renvoyer à la page / javascript. (ceci utilise SSDP sous les couvertures iirc)

  2. Prise en charge de l'analyse WebBluetooth. Cela suit un modèle similaire à la découverte Chromecast, l'utilisateur doit lancer l'analyse, puis il doit choisir manuellement à partir des appareils trouvés par le navigateur les détails qui sont retransmis au javascript dans la page.

J'ai utilisé l'approche WebBluetooth pour découvrir un interrupteur d'éclairage local (j'ai une application BLE sur un pi zéro contrôlant une ampoule Belkin WeMo https://github.com/hardillb/physical-web-lightswitch ). Cela fonctionne, mais ce n'est pas transparent car il nécessite au moins 2 interactions utilisateur pour découvrir un seul appareil.

Bien qu'il ne réponde pas à toutes vos exigences locales, je pense que l'utilisation de l'approche cloud broker, même pour une utilisation locale, sera une expérience utilisateur plus fluide.

hardillb
la source
Bonne réponse. Ce n'était pas ce que je cherchais, mais c'est ce à quoi je m'attendais, je suppose. Il existe l'API NSD du W3C, mais la seule implémentation concerne Google Chrome Apps. I
hjf
Il semble que l'API NSD ait été supprimée
hardillb
La théorie de la sécurité proposée ici a des choses en arrière: s'il y a un problème, ce n'est pas avec la chose qui fait la découverte (navigateur) mais plutôt avec la chose qui se fait découvrir. Vous êtes le bienvenu pour votre propre opinion sur la sagesse de la découvrabilité, mais il convient de noter qu'il s'agit d' un comportement par défaut extrêmement courant de nombreux ordinateurs personnels, imprimantes et autres appareils. La volonté d'un navigateur exploité par une partie autorisée à trouver (ou non) quelque chose ne dit rien sur la capacité d'une partie non autorisée à découvrir des appareils.
Chris Stratton
2

Si vous avez une interface Web sur un appareil et que vous la configurez pour avoir un nom d'hôte MDNS via un service de répondeur MDNS tel que bonjour ou avahi, alors à partir de systèmes d'exploitation fonctionnels, vous pouvez simplement pointer votre navigateur sur

https: //livingroomlight.local

Ou quoi que vous l'ayez configuré pour s'appeler.

Cela fonctionnera dès le départ avec les navigateurs fonctionnant sur OSX, iOS et la plupart des Linuces, qui prennent tous en charge la résolution du nom d'hôte MDNS au niveau du système.

Cependant, cela ne fonctionnera pas à partir de Windows à moins que vous n'installiez la prise en charge du module complémentaire MDNS, et cela ne fonctionnera pas avec les navigateurs Android d'origine, bien qu'il soit possible de créer des applications de navigateur personnalisées pour Android qui le prennent en charge.

La découverte d' instances inconnues sur le réseau n'est généralement pas prise en charge par un navigateur, mais est généralement prise en charge via les API du système d'exploitation et les outils de ligne de commande tels que dns-sd(OSX) et avahi-browse(Linux).

Donc, même s'il ne semble pas évident qu'un navigateur puisse trouver vos appareils, si vous vous souvenez simplement de ce que vous avez appelé l'un d'eux, vous pouvez vous y connecter, et il pourrait potentiellement vous montrer des liens vers tous ses pairs, en faisant un MDNS se rechercher.

Ou vous pouvez démarrer un terminal et obtenir une réponse. Pour cette question, vous pouvez exécuter un démon local qui ferait une recherche MDNS et vous montrerait le résultat sous la forme d'une page de liens servis uniquement sur l'interface de bouclage, et donc inaccessible à aucune autre machine.

Chris Stratton
la source
1
Quel dommage. Cela pourrait être une alternative si elle est prise en charge. Je me demande quelle est la raison de ne pas prendre en charge mdns-sd dans les navigateurs? Quoi qu'il en soit, je pense que la seule façon de fonctionner de manière fiable serait d'utiliser simplement MQTT comme méthode de découverte. Ayez une sorte de point de terminaison "d'annonce" où les appareils se rapportent eux-mêmes et mettez en cache ces réponses.
hjf
Ce n'est pas le navigateur qui fait tout cela - c'est l'implémentation étendue du système d'exploitation du DNS, ce qui signifie qu'un navigateur (ou toute autre chose) peut utiliser un nom comme livingroomlight.local MQTT ne vous aidera pas vraiment - quelque chose va avoir pour collecter les résultats et les présenter, qu'il s'agisse d'une boîte matérielle, d'un démon sur le PC ou d'un humain.
Chris Stratton
1
Mais Android prend en charge mDNS dans les "applications". Il est possible d'envoyer des requêtes mDNS via des applications et d'obtenir des réponses. Comment se fait-il que personne n'implémente mDNS-SD et l'expose à JS? Il y avait une norme qui a été extraite et seulement implémentée partiellement, spécifiquement pour détecter Chromecast.
hjf
1
Encore une fois, parce que personne ne traite de MDNS dans les navigateurs Web; il fonctionne pour les noms d'hôte connus où le DNS du système d'exploitation sous-jacent est étendu pour le prendre en charge. Ce n'est pas le cas d'Android, bien qu'il offre des fonctionnalités MDNS aux applications via une API distincte et unique à Android n'ayant rien à voir avec la façon dont il résout les noms de domaine.
Chris Stratton
1
C'est mon point. Pourquoi personne ne pousse pour cela? Avec l'IoT de plus en plus courant, comment est-il possible que ce type d'API soit verrouillé spécifique au fournisseur et que le W3C ait adopté la norme?
hjf