IoT-Geräte im Webbrowser erkennen?

11

Kürzlich habe ich ein paar WLAN-Relais von Xiaomi gekauft. Obwohl sie bisher solide waren, mag ich Xiaomis App wirklich nicht. Aber ich mag die Idee, dass es tatsächlich sowohl im LAN als auch über das Internet funktioniert. Im LAN lassen sie sich sehr schnell ein- und ausschalten, wenn man bedenkt, dass sich die Server von Xiaomi in China befinden.

Ich möchte also mein eigenes ESP8266-basiertes Relais rollen (ich weiß, dass ich die Hardware fertig machen kann, das ist also ein Bonus). Mein Problem ist, wie kann ich die Relais in meinem Netzwerk automatisch von einer Webseite erkennen?

Von einer "App" könnte ich SSDP, mDNS-SD oder UPNP verwenden, um Dinge zu erkennen. Ich habe jedoch keine Informationen darüber gefunden, ob dies über den Webbrowser möglich ist (Chrome unter Android im Grunde). Seit ich meine Webseite für Wetterstationen in eine progressive Web-App geändert habe, bin ich begeistert. Ich mag die Idee wirklich, dass Dinge nur Webseiten sind und keine Apps, die Sie installieren müssen. Und PWAs füllen die Lücke auch mit dem Offline-Modus.

Es ist jedoch seltsam, dass der "schwierige" Teil (Ein- und Ausschalten der Relais von außerhalb des LAN) über einen MQTT-Server trivial zu lösen ist. Ich würde mich aber lieber nicht auf den externen MQTT-Server verlassen. Wenn ich im LAN bin, möchte ich direkt mit den Relais sprechen. Wenn nicht, senden Sie den Befehl über MQTT.

Ich könnte mich natürlich darauf verlassen, dass der Server die Relais abfragt, aber in diesem Fall benötige ich eine Internetverbindung (wenn sich mein MQTT-Server in der "Cloud" befindet) oder einen zu Hause gehosteten Server. Ich habe einen Server zu Hause, und selbst wenn ich es nicht tun würde, könnte ein Himbeer-Pi leicht die Lücke füllen. Ideal wäre es jedoch, nicht einmal einen Server zu benötigen, wenn Sie über LAN mit den Geräten kommunizieren (in diesem Fall Wifi). Ich ziehe es vor, P2P so weit wie möglich beizubehalten und MQTT nur als Ersatz für WAN zu verwenden (MQTT löst die Probleme von CG-NAT und Portweiterleitung).

hjf
quelle
1
Willkommen auf der Seite, hjf! Derzeit ist Ihre Frage ziemlich weit gefasst. Es wäre hilfreich, wenn Sie etwas spezifischer sein könnten: Zum Beispiel, welche Sprachen verwenden Sie derzeit und auf welche Fehler / spezifischen Probleme stoßen Sie?
anonymous2
1
@ anonym2 Nun, es ist eine sehr allgemeine Frage. Ich möchte nicht speziell fragen: "Kann ich mDNS-Abfragen direkt über den Browser durchführen?" weil die Antwort NEIN ist. Es gibt einen Standard, aber keine Implementierung. Ich suche nach Alternativen oder ähnlichen Funktionen.
hjf
Bekannte MDNS-Hostnamen funktionieren problemlos mit einem Browser, der unter einem Betriebssystem wie OSX oder den meisten Linuces ausgeführt wird, die sie unterstützen, obwohl das Surfen wahrscheinlich nicht funktioniert. Und natürlich funktionieren sie nicht auf einem Betriebssystem wie Windows oder Android, das sie nicht unterstützt, es sei denn, zusätzliche Funktionen sind installiert.
Chris Stratton

Antworten:

6

Mir sind keine generischen lokalen Erkennungsfunktionen bekannt, die in einen Browser integriert sind. Tatsächlich würde ich jede Fähigkeit als eine Ehrwürdigkeit der Sicherheit betrachten, da sie es Angreifern ermöglichen würde, Ihr Netzwerk remote zu profilieren, es sei denn, es hätte einen manuellen Interaktionsschritt zum Starten, was den Workflow, den Sie anstreben, wirklich verlangsamen würde.

Ich kann mir zwei Dinge vorstellen, die nahe kommen:

  1. Die Erkennbarkeit von Chromecast ist in Chrome integriert. Dies war früher ein separates Plugin, bevor es eingeführt wurde. Dies erfordert jedoch noch einen manuellen Schritt dahin, wo der Benutzer eine Suche auslöst, und anschließend eine manuelle Auswahl der Gerätedetails, die an die Seite / das Javascript zurückgegeben werden sollen. (Dies verwendet SSDP unter der Abdeckung iirc)

  2. Die WebBluetooth-Scan-Unterstützung. Dies folgt einem ähnlichen Modell wie die Chromecast-Erkennung. Der Benutzer muss den Scan starten und dann manuell aus den vom Browser gefundenen Geräten auswählen, welche Details an das Javascript auf der Seite zurückgegeben werden.

Ich habe den WebBluetooth-Ansatz verwendet, um einen lokalen Lichtschalter zu entdecken (ich habe eine BLE-App auf einem Nullpunkt, der eine Belkin-WeMo-Glühbirne steuert https://github.com/hardillb/physical-web-lightswitch ). Es funktioniert, ist aber nicht nahtlos, da mindestens zwei Benutzerinteraktionen erforderlich sind, um ein einzelnes Gerät zu erkennen.

Obwohl es nicht alle lokalen Anforderungen erfüllt, denke ich, dass die Verwendung des Cloud-Broker-Ansatzes auch für den lokalen Betrieb eine reibungslosere Benutzererfahrung darstellt.

hardillb
quelle
Gute Antwort. Es war nicht das, wonach ich gesucht habe, aber es ist das, was ich erwartet hatte, denke ich. Es gibt die NSD-API aus dem W3C, die einzige Implementierung ist jedoch für Google Chrome Apps. I
hjf
Es sieht so aus, als ob die NSD-API aus dem Dokument getötet wurde: w3.org/TR/discovery-api
hardillb
Die hier vorgeschlagene Sicherheitstheorie hat die Dinge rückwärts: Wenn es ein Problem gibt, ist es nicht das, was das Entdecken (Browser) macht, sondern das, was sich selbst auffindbar macht. Sie können gerne Ihre eigene Meinung zur Weisheit der Auffindbarkeit abgeben, aber es ist erwähnenswert, dass dies bei vielen PCs, Druckern und anderen Geräten ein äußerst häufiges Standardverhalten ist. Die Bereitschaft eines von einer autorisierten Partei betriebenen Browsers , etwas zu finden (oder nicht), sagt nichts über die Fähigkeit einer nicht autorisierten Partei aus, Geräte zu entdecken.
Chris Stratton
2

Wenn Sie ein Webinterface auf einem Gerät haben und es so konfigurieren, dass es über einen MDNS-Responderdienst wie bonjour oder avahi einen MDNS-Hostnamen hat, können Sie von funktionsfähigen Betriebssystemen aus einfach auf Ihren Browser zeigen

https: //livingroomlight.local

Oder wie auch immer Sie es konfiguriert haben, um sich selbst aufzurufen.

Dies funktioniert sofort mit Browsern unter OSX, iOS und den meisten Linuces, die alle die Auflösung von MDNS-Hostnamen auf Systemebene unterstützen.

Dies funktioniert jedoch nicht unter Windows, es sei denn, Sie installieren zusätzliche MDNS-Unterstützung, und es funktioniert nicht mit Standard-Android-Browsern, obwohl es möglich ist, benutzerdefinierte Browser-Apps für Android zu erstellen, die dies unterstützen.

Das Erkennen unbekannter Instanzen im Netzwerk wird normalerweise nicht von einem Browser unterstützt, sondern normalerweise über Betriebssystem-APIs und Befehlszeilentools wie dns-sd(OSX) und avahi-browse(Linux).

Es ist zwar nicht offensichtlich, dass ein Browser Ihre Geräte finden kann, aber wenn Sie sich einfach daran erinnern können, wie Sie eines von ihnen genannt haben, können Sie eine Verbindung zu ihm herstellen und möglicherweise mithilfe eines MDNS Links zu allen Peers anzeigen Suche selbst.

Oder Sie können ein Terminal starten und sich eine Antwort geben. In diesem Fall könnten Sie einen lokalen Daemon ausführen, der eine MDNS-Suche durchführt und Ihnen das Ergebnis als Seite mit Links anzeigt, die nur auf der Loopback-Schnittstelle bereitgestellt werden und daher für keinen anderen Computer zugänglich sind.

Chris Stratton
quelle
1
So eine Schande. Dies könnte eine Alternative sein, wenn dies unterstützt wird. Ich frage mich, was der Grund dafür ist, mdns-sd in Browsern nicht zu unterstützen. Ich denke, die einzige Möglichkeit, um zuverlässig zu arbeiten, besteht darin, nur MQTT als Erkennungsmethode zu verwenden. Haben Sie eine Art "Ansage" -Endpunkt, an dem sich Geräte melden würden, und speichern Sie diese Antworten im Cache.
hjf
Es ist nicht der Browser, der dies tut - es ist die erweiterte Implementierung von DNS durch das Betriebssystem, was bedeutet, dass ein Browser (oder irgendetwas anderes) einen Namen wie livingroomlight verwenden kann. Lokales MQTT wird Ihnen nicht wirklich helfen - etwas wird es haben um Ergebnisse zu sammeln und zu präsentieren, unabhängig davon, ob es sich um eine Hardware-Box, einen Daemon auf dem PC oder einen Menschen handelt.
Chris Stratton
1
Aber Android unterstützt mDNS in "Apps". Es ist möglich, mDNS-Anfragen über Apps zu senden und Antworten zu erhalten. Wie kommt es, dass niemand mDNS-SD implementiert und es JS aussetzt? Es gab einen Standard, der gezogen und nur teilweise implementiert wurde, insbesondere um Chromecast zu erkennen.
hjf
1
Wiederum, weil sich niemand mit MDNS in Webbrowsern befasst; Es funktioniert für bekannte Hostnamen, bei denen das DNS des zugrunde liegenden Betriebssystems erweitert wird, um es zu unterstützen. Android ist dies nicht, obwohl es Apps MDNS-Funktionen über eine separate, für Android einzigartige API bietet, die nichts damit zu tun hat, wie Domain-Namen aufgelöst werden.
Chris Stratton
1
Das ist mein Punkt. Warum drängt niemand darauf? Wie ist es möglich, dass diese Art von APIs mit zunehmender Verbreitung des IoT immer herstellerspezifischer sind und das W3C den Standard übernommen hat?
hjf