Rilevamento dei dispositivi IoT nel browser Web?


11

Di recente ho acquistato un paio di relè wifi da Xiaomi. Finora sono stati solidi, non mi piace molto l'app di Xiaomi. Ma mi piace l'idea che funzioni davvero sia in LAN che su Internet. Quando sono in LAN sono molto veloci da accendere e spegnere, considerando che i server di Xiaomi sono in Cina.

Quindi voglio lanciare il mio relè basato su ESP8266 (so che posso avere l'hardware pronto, quindi questo è un bonus). Il mio problema è: come posso rilevare automaticamente i relè sulla mia rete da una pagina Web?

Da una "App" ho potuto usare SSDP, mDNS-SD o UPNP per rilevare cose. Ma non ho trovato informazioni su ciò sia possibile dal browser web (Chrome su Android in pratica). Da quando ho cambiato la mia pagina web della stazione meteorologica per renderla un'app Web progressiva, mi sono appassionato. Mi piace molto l'idea che le cose siano solo pagine web e non app che devi installare. E i PWA riempiono anche il gap con la modalità offline.

È strano, tuttavia, che la parte "difficile" (attivazione e disattivazione dei relè dall'esterno della LAN) sia banale da risolvere tramite un server MQTT. Ma preferirei non fare affidamento sul server MQTT esterno. Se sono sulla LAN, voglio parlare direttamente con i relè. In caso contrario, inviare il comando tramite MQTT.

Ovviamente, potevo fare affidamento sul server per interrogare i relè, ma in quel caso avrei bisogno di una connessione Internet (se il mio server MQTT è sul "cloud") o di un server ospitato a casa. Ho un server a casa, e anche se non lo facessi, un lampone pi potrebbe facilmente colmare il vuoto. Ma l'ideale sarebbe non avere nemmeno bisogno di un server quando si parla ai dispositivi tramite LAN (Wifi in questo caso). Preferisco mantenerlo P2P il più possibile e uso MQTT solo come fallback per quando sono su WAN (MQTT risolve i problemi di CG-NAT e port forwarding).


1
Benvenuti nel sito, hjf! Attualmente, la tua domanda è piuttosto ampia. Sarebbe utile se tu potessi essere un po 'più specifico: ad esempio, quali lingue stai attualmente utilizzando e in quali errori / problemi specifici stai riscontrando?
anonymous2

1
@ anonymous2 bene è una domanda molto generale. Non desidero chiedere specificamente "posso fare query mDNS direttamente dal browser?" perché la risposta è NO. C'è uno standard a riguardo ma nessuna implementazione. Sto cercando alternative o funzionalità simili.
hjf

I nomi host MDNS noti funzionano bene da un browser in esecuzione su un sistema operativo come OSX o la maggior parte di Linuces che li supporta, sebbene la navigazione probabilmente non funzioni. E ovviamente non funzionano su un sistema operativo come Windows o Android che non li supporta, a meno che non sia installata funzionalità aggiuntiva.
Chris Stratton,

Risposte:


6

Non sono a conoscenza di alcuna funzionalità di individuazione locale generica integrata in un browser. In effetti, considererei qualsiasi capacità come una venerabilità della sicurezza in quanto consentirebbe agli aggressori di profilare la tua rete in remoto a meno che non avesse una fase di interazione manuale per avviarla, il che rallenterebbe davvero il flusso di lavoro che penso stia puntando.

Mi vengono in mente 2 cose che si avvicinano:

  1. La rilevabilità del Chromecast integrata nel Chrome. In precedenza si trattava di un plug-in separato prima del roll-in. Ma ciò richiede ancora un passaggio manuale in cui l'utente avvia una ricerca e quindi una selezione manuale dei dettagli del dispositivo da restituire alla pagina / javascript. (questo utilizza SSDP sotto le copertine iirc)

  2. Il supporto per la scansione WebBluetooth. Questo segue un modello simile alla scoperta di Chromecast. L'utente deve avviare la scansione, quindi deve selezionare manualmente dai dispositivi trovati dal browser quali dettagli vengono passati al javascript nella pagina.

Ho usato l'approccio WebBluetooth per scoprire un interruttore della luce locale (ho un'app BLE su uno zero che controlla una lampadina Belkin WeMo https://github.com/hardillb/physical-web-lightswitch ). Funziona ma non è fluido in quanto richiede almeno 2 interazioni dell'utente per scoprire un singolo dispositivo.

Sebbene non soddisfi tutti i requisiti locali, penso che l'utilizzo dell'approccio del cloud broker anche quando operi localmente sarà un'esperienza utente più fluida.


Bella risposta. Non era quello che stavo cercando, ma è quello che mi aspettavo immagino. Esiste l'API NSD del W3C ma l'unica implementazione è per le app di Google Chrome. I
hjf

Sembra che l'API NSD sia stata uccisa dal documento: w3.org/TR/discovery-api
hardillb

La teoria della sicurezza proposta qui ha cose all'indietro: se c'è un problema, non è con la cosa che sta facendo la scoperta (browser) ma piuttosto la cosa che si sta facendo scoprire. Sei il benvenuto alla tua opinione sulla saggezza della rilevabilità, ma vale la pena notare che è un comportamento predefinito estremamente comune di molti personal computer, stampanti e altri dispositivi. La volontà di un browser gestito da una parte autorizzata di trovare qualcosa (o meno) non dice nulla sulla capacità di una parte non autorizzata di scoprire dispositivi.
Chris Stratton

2

Se hai un'interfaccia web su un dispositivo e configurala per avere un nome host MDNS tramite un servizio di risposta MDNS come bonjour o avahi, dai sistemi operativi con funzionalità puoi semplicemente puntare il tuo browser su

https: //livingroomlight.local

O qualunque cosa tu abbia configurato per chiamarsi.

Funzionerà immediatamente con i browser in esecuzione su OSX, iOS e la maggior parte di Linuces, che supportano tutti la risoluzione del nome host MDNS a livello di sistema.

Tuttavia, questo non funzionerà da Windows a meno che non si installi il supporto aggiuntivo MDNS e non funzionerà con i browser Android di serie sebbene sia possibile creare app personalizzate per il browser per Android che lo supportano.

Il rilevamento di istanze sconosciute sulla rete non è in genere supportato da un browser, ma in genere è supportato tramite API del sistema operativo e strumenti da riga di comando come dns-sd(OSX) e avahi-browse(Linux).

Quindi, anche se non sembra ovvio che un browser può trovare i tuoi dispositivi, se riesci semplicemente a ricordare quello che hai chiamato uno di essi, puoi collegarti ad esso e potrebbe potenzialmente mostrarti collegamenti a tutti i suoi peer, facendo un MDNS cerca se stesso.

Oppure puoi accendere un terminale e ottenere una risposta. Per questo motivo potresti eseguire un demone locale che farebbe una ricerca MDNS e ti mostrerebbe il risultato come una pagina di collegamenti serviti solo sull'interfaccia di loopback, e quindi non accessibile a nessun altro computer.


1
Che peccato. Questa potrebbe essere un'alternativa se supportata. Mi chiedo quale sia la logica di non supportare mdns-sd nei browser? Ad ogni modo, penso che l'unico modo per far funzionare le cose in modo affidabile sarebbe semplicemente usare MQTT come metodo di scoperta. Avere una sorta di endpoint "annunciare" in cui i dispositivi si segnalarebbero e memorizzare nella cache quelle risposte.
hjf

Non è il browser che fa nulla di tutto ciò - è l'implementazione estesa del DNS del sistema operativo, il che significa che un browser (o qualsiasi altra cosa) può usare un nome come livingroomlight.local MQTT non ti aiuterà davvero - qualcosa avrà per raccogliere risultati e presentarli, indipendentemente dal fatto che si tratti di una scatola hardware, un demone sul PC o un essere umano.
Chris Stratton,

1
Ma Android supporst mDNS in "app". È possibile inviare query mDNS tramite app e ottenere risposte. Come mai nessuno sta implementando mDNS-SD ed esponendolo a JS? C'era uno standard che è stato tirato e implementato solo parzialmente, in particolare per rilevare Chromecast.
hjf

1
Ancora una volta, perché nessuno si occupa di MDNS nei browser Web; funziona per nomi host noti in cui il DNS del sistema operativo sottostante viene esteso per supportarlo. Android non lo è, sebbene offra funzionalità MDNS alle app tramite un'API separata, unica per Android, che non ha nulla a che fare con il modo in cui risolve i nomi di dominio.
Chris Stratton,

1
Questo è il mio punto. Perché nessuno spinge per questo? Con l'IoT sempre più comune, come è possibile che questo tipo di API sia bloccato dal fornitore specifico e che il W3C abbia superato lo standard?
hjf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.