Partiamo da un paio di considerazioni:
- Stiamo sviluppando un’applicazione per la gestione dell’impianto domotico MyHome.
- Vogliamo “semplificare” la vita all’utente che deve utilizzare la nostra applicazione, evitando di fargli inserire l’indirizzo IP del gateway nella fase di configurazione
Come possiamo risolvere il secondo punto?
Ci sono due soluzioni, la prima abbastanza “tediosa” da implementare, la seconda più semplice e veloce:
- Proviamo ad effettuare una connessione TCP sulla porta 20000 con tutti gli indirizzi IP che la subnet mask “definisce”
- [Abbiamo un gateway con un firmware recente] Utilizziamo il protoccolo UPnP ed in particolare l’operazione di discovery
La parola gateway, nel titolo del post, è stata messa tra apici in quanto non tutte le periferiche che implementano UPnP sono gateway o meglio sono gateway non ufficializzati :)
In questo post vedremo solo la seconda soluzione in quanto BTicino sta aggiungendo il supporto al discovery UPnP a tutti i “gateway”.
Esistono varie librerie su codeplex che implementano UPnP, io, dopo averne provato un paio, ho scelto però questa.
Ok, passiamo al codice!
- Istanziamo la classe UPnPSmartControlPoint
- Sottoscriviamo l’evento OnAddDevice
- Nell’handler dell’evento OnAddDevice:
- controlliamo se la proprietà Manufacturer della classe UPnPDevice contiene la parola BTicino
- istanziamo la classe Gateway (contiene solamente alcune proprietà come: IP, Port, etc…) settando le varie proprietà
- scateniamo l’evento GatewayFound (creato da noi)
Il nostro programma può sottoscriversi all’evento GatewayFound, chiamare il metodo StartDiscovery, visualizzare all’utente i “gateway” trovati ed il gioco è fatto :)