KMP Agency | uPnP : L'art de connecter les objets

uPnP : L'art de connecter les objets

Je souhaiterais faire communiquer mon application mobile avec ma caméra connectée, pour cela je rentre son adresse IP dans mon application pour interagir avec.

Cependant l'IP de la caméra peut changer à tout moment, en redémarrant ma box, ou tout simplement en la branchant sur un autre réseau.

Et si je souhaite avoir plusieurs caméras sur mon réseau ? Comment mes utilisateurs peuvent les trouver à travers tous les appareils connectés ?

Fortement utilisé dans la domotique, le protocole Universal Plug and Play — Wikipédia répond à toutes ces problématique, c'est ce que nous allons voir dans cet article

⚠️ Nous ne rentrerons pas dans les détails techniques du protocole. Nous parlerons seulement de ses cas d'usages et de comment l'utiliser.

uPnP, à quoi ça sert ?

Le Protocole UPnP — Wikipédia permet à un périphérique (caméra, sonnette, ampoule) de se connecter dynamiquement au réseau (recevoir une IP aléatoire) et d'annoncer :

  • Je suis une ampoule connectée
  • J'ai l'adresse IP 192.168.1.12
  • Mon identifiant unique est 56a5c464-24eb-485a-8825-920a5a6a0e0f
  • Je suis en version 1.12
  • Vous pouvez accéder à mon API sur le port 3200

De cette manière les autres appareils présent dans le réseau auront toutes les informations nécessaires pour communiquer avec.

ℹ️ uPnP est le protocole utilisé par quasiment tous les appareils domotiques (Philips Hue, Google Nest, etc)

Mettons uPnP en pratique

Pour écrire notre application serveur (l'ampoule) et notre application client (app mobile) nous allons utiliser NodeJS avec la libraire node-ssdp

⚠️ Ceci est une preuve de concept ! N'utilisez pas ce code en production, cela pourrait causer des problèmes de sécurité.

L'ampoule connectée

Nous allons créer une API avec Express - Node.js web application framework pour que notre application mobile puisse allumer et éteindre la lampe.

Nous lancerons aussi un serveur node-ssdp pour publier toutes les informations de communication sur le réseau.

var port = 3200;
var express = require('express');
var app = express();

// POST /toggle
app.post('/toggle', function (req, res) {
  toggle();
  res.send('Toggled')
});

app.listen(port);

var server = new require('node-ssdp').Server({
  udn: 'uuid:56a5c464-24eb-485a-8825-920a5a6a0e0f',
});
server.addUSN('urn:schemas-upnp-org:service:bulb:1.12');

L'UDN correspond à un identifiant unique, il est intéressant de le générer automatiquement et de le stocker pour que ce dernier persiste après un redémarrage.

Nous pouvons ajouter des USN, ces derniers permettent de décrire notre appareil : A quoi il sert, sa version, etc.

L'application mobile

var client = new require('node-ssdp').Client();
var devices = [];

client.on('response', function (headers, statusCode, rinfo) {
  devices.push({
    address: rinfo.address,
    uuid: headers.USN,
  });
});

client.search('urn:schemas-upnp-org:service:bulb:*');

toggle() {
  for (const device of devices) {
    axios.post(`http://${device.address}:3200/toggle`);
  }
}

Une recherche sur le réseau est lancée pour trouver toutes les ampoules avec pour USN urn:schemas-upnp-org:service:bulb:*. Le wildcard permet de récupérer toutes les ampoules, peut importe la version.

Une fois les ampoules trouvées, elles sont ajoutées à une liste pour que l'on puisse les allumer/éteindre via notre application mobile (toggle()).

Cas d'usages

Les écrans connectés

J'aime beaucoup cet exemple car c'est exactement le cas d'usage que nous avons eu pour l'un de nos clients.

Nous avons une tablette (ou plusieurs !) et un certain nombre d'écrans géants. La tablette affiche la liste des écrans présents sur le réseau, il suffit de sélectionner celui sur lequel nous souhaitons afficher du contenu et en un clique c'est parti !

ℹ️ C'est exactement le fonctionnement des Chromecasts, ils utilisent le même protocole !

Une application pour la domotique

Il y a déjà un certain temps, j'avais conçu une application desktop pour pouvoir gérer tous mes appareils connectés, peut importe la marque au même endroit.

Dès le lancement, l'application cherche les différents appareils sur le réseau, et c'est partie, il n'y a plus qu'à configurer les jeux de lumières.

De cette manière, plus besoin de s'embêter de passer de Google à Philips Hue !

Nous vous présentons nos cookies

Sur ce site, nous utilisons des cookies pour mesurer notre audience. Pas de crainte, votre anonymat est conservé. Vous pouvez sélectionner ici ceux que vous autorisez à rester.

Google Analytics

Un projet ? Une idée ? Parlons-en !