UPnP : La machine à laver

Dans cet article, nous allons analyser les paquets UPnP qui circulent entre la télécommande et la machine à laver. Pour cela, nous utiliserons l’analyseur de paquets WIRESHARK.

washerupnp

 

En première étape, nous avons lancé l’outil WIRESHARK et activé la capture des paquets de la boucle locale 127.0.0.1. Ensuite, nous avons lancé l’application de la machine à laver « WASHER » puis celle de la télécommande. A ce niveau nous avons pu identifier les paquets échangés entre les deux dispositifs.

Phase d’initialisation :

Lorsqu’on lance la télécommande, le paquet le plus important généré par cette application est un paquet TCP, ou précisément une requête HTTP utilisant la méthode GET : La télécommande cherche à connaître tous dispositifs UPnP sur le réseau et les services qu’ils offrent.

 GET /description.xml HTTP/1.1\r\n
Request Method: GET
Request URI: /description.xml
Request Version: HTTP/1.1
User-Agent: Java/1.7.0_65\r\n
Host: [fe80:0:0:0:3a59:f9ff:fe17:2c9%3]:4004\r\n
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n
Connection: keep-alive\r\n

La machine à laver répond avec un fichier XML décrivant l’équipement (fabriquant, modèle, numéro de série) et listant tous les services qu’elle offre.


<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<URLBase>http://[fe80:0:0:0:3a59:f9ff:fe17:2c9%3]:4004</URLBase>
	<device>
		<deviceType>urn:schemas-upnp-org:device:washer:1</deviceType>
		<friendlyName>CyberGarage Washer Device</friendlyName>
		<manufacturer>CyberGarage</manufacturer>
		<manufacturerURL>http://www.cybergarage.org</manufacturerURL>
		<modelDescription>CyberUPnP Washer Device</modelDescription>
		<modelName>Washer</modelName>
		<modelNumber>1.0</modelNumber>
		<modelURL>http://www.cybergarage.org</modelURL>
		<serialNumber>1234567890</serialNumber>
		<UDN>uuid:cybergarageWasherDevice</UDN>
		<UPC>123456789012</UPC>
		<iconList>
			<icon>
				<mimetype>image/gif</mimetype>
				<width>48</width>
				<height>32</height>
				<depth>8</depth>
				<url>icon.gif</url>
			</icon>
		</iconList>
		<serviceList>
			<service>
				<serviceType>urn:schemas-upnp-org:service:state:1</serviceType>
				<serviceId>urn:schemas-upnp-org:serviceId:state:1</serviceId>
				<SCPDURL>/service/state/description.xml</SCPDURL>
				<controlURL>/service/state/control</controlURL>
				<eventSubURL>/service/state/eventSub</eventSubURL>
			</service>
		</serviceList>
		<presentationURL>http://www.cybergarage.org</presentationURL>
	</device>
</root>

On remarque que cette machine à laver offre un seul service d’ID « urn:schemas-upnp-org:serviceId:state:1 » et qui est disponible à l’adresse suivante :/service/state/description.xml

Lorsqu’on appuie sur un bouton de la télécommande, elle envoie une requête HTTP à l’URL « service/state/description.xml » pour récupérer la description du services “state” offert par la machine à laver.


GET /service/state/description.xml HTTP/1.1\r\n
Request Method: GET
Request URI: /service/state/description.xml
Request Version: HTTP/1.1
User-Agent: Java/1.7.0_65\r\n
Host: [fe80:0:0:0:3a59:f9ff:fe17:2c9%3]:4004\r\n
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n
Connection: keep-alive\r\n

La machine répond par un fichier xml « description.xml » qui décrit le service state. On remarque que ce service propose deux méthodes :

  • SetState : qui permet de changer l’état de la machine à laver (démarrer/ arrêter la machine) et qui prend comme argument un état ( de type chaîne de caractère (« 1 » ou « 0 »))
  • GetState : cette méthode sert à récupérer l’état de la machine (« 1″<=> ON ou « 0 »<=> OFF )

<?xml version="1.0"?>
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<actionList>
		<action>
			<name>SetState</name>
			<argumentList>
				<argument>
					<name>State</name>
					<relatedStateVariable>State</relatedStateVariable>
					<direction>in</direction>
				</argument>
				<argument>
					<name>Result</name>
					<relatedStateVariable>Result</relatedStateVariable>
					<direction>out</direction>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetState</name>
			<argumentList>
				<argument>
					<name>State</name>
					<relatedStateVariable>State</relatedStateVariable>
					<direction>out</direction>
				</argument>
			</argumentList>
		</action>
	</actionList>
	<serviceStateTable>
		<stateVariable sendEvents="yes">
			<name>State</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>Result</name>
			<dataType>string</dataType>
		</stateVariable>
	</serviceStateTable>
</scpd>

Phase d’accès au service :

Une fois que la télécommande a récupéré la description des services offerts par la machine à laver, elle peut maintenant envoyer des messages SOAP pour invoquer ses méthodes.

L’appui sur le bouton start fait appel à la méthode SetState et passe le caratère « 1 » comme argument et l’appui sur le bouton stop fait appel à la même méthode mais passe « 0 » comme argument.


<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
	<s:Body>
		<u:SetState xmlns:u="urn:schemas-upnp-org:service:state:1">
			<State>1</State>
		</u:SetState>
	</s:Body>
</s:Envelope>

Le dispositif envoie ensuite son nouvel état


<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
	<s:Body>
		<u:SetStateResponse xmlns:u="urn:schemas-upnp-org:service:state:1">
			<Result />
		</u:SetStateResponse>
	</s:Body>
</s:Envelope>

SEDDIK Houssem Eddine

Ce contenu a été publié dans L'Internet des Objets, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *