Frédéric Colin
Windows Media Center et WCF : développez votre maison intelligente
Le développement d'applications pour Windows Media Center est facilité avec l'arrivée du SDK 5.3. Même si l'on sent un modèle objet bien lourd derrière, il devient plus facile d'exposer les fonctionnalités de WMC sous la forme de services WCF.
Par Frédéric Colin publié le 23/06/2008 à 08:04, lu 1395 fois, 10 pages
 9 | Le client de test
Comme indiqué précédemment et n'étant absolument pas versé dans l'utilisation du SDK natif IPhone, le plus simple pour moi était d'utiliser les standards du Web afin d'implémenter un client Javascript de mes services REST et fonctionnant aussi bien sur Internet Explorer, Safari et Safari Mobile.
Pour cela, je devais résoudre deux problématiques :
  1. Utiliser le minimum syndical en Javascript pour des raisons évidentes de portabilité
  2. Utiliser « XmlHttpRequest » pour les requêtage aux services REST
Globalement, je ne me suis pas trop focalisé sur la qualité de cette IHM. Tout juste me suis-je quelque peu frotté à Microsoft Expression Design pour générer l'image de ma télécommande en me faisant expliquer par un graphiste le B.A. BA des rudiments de cet outil ! On retrouve les fonctionnalités de base d'une télécommande basique. J'ai aussi ajouté une interface orientée développement. Voici ce que cela donne Safari pour Windows (mes excuses par avance pour les yeux qui risquent de piquer !) :
 
IHM Télécommande

IHM Télécommande

 
 
IHM de test

IHM de test

 
Voici l'URI REST utilisée et paramétrée pour récupérer la page html.

http://192.168.0.10:8000/MediaCenter/IWebManagement/GetFile?filename=default.htm&encoding=text/html

Ensuite, je me suis servi d'un image map afin de rendre cliquable certaines zones de l'image et le tour était joué pour cette IHM simplifiée.

Le code javascript développé pour l'occasion est somme toute assez simple. Voici une partie de la définition de l'image map utilisée, vous noterez, l'utilisation d'une fonction Javascript unique et paramétrée avec l'url du service accédé :

<map id="Map1" name="RemoteControl">

    <area alt="Stop" shape="circle" coords="48,32,20" title="Stop" 

        href="javascript:Execute('/SendKey?command=178');" />

    <area alt="Previous" shape="circle" coords="48,92,20" title="Previous" 

        href="javascript:Execute('/SendKey?command=177');" />

    <area alt="Play" shape="circle" coords="162,46,26" title="Play" 

        href="javascript:Execute('/SendKey?command=179');" />

    <area alt="Sleep" shape="circle" coords="272,32,20" title="Sleep" 

        href="javascript:Execute('/StandBy');" />

 

    ...

 

    <area alt="CursorDown" shape="rect" coords="125,282,198,327" title="CursorDown" 

        href="javascript:Execute('/SendKey?command=40');" />

</map>

Et voici le code de la fonction Javascript « Execute » ainsi utilisée :

function Execute(serviceUri)

{

    var proxy = null;

 

    if (window.ActiveXObject)

        proxy = new ActiveXObject("Microsoft.XMLHTTP");

    else if (window.XMLHttpRequest)

        proxy = new XMLHttpRequest("");       

 

 

    // POST to avoid Explorer Cache Problem

    proxy.open('POST', window.document.getElementById("txtServiceURL").value + serviceUri, false);

 

    proxy.send(null);

 

    window.document.getElementById("divStatus").innerHTML = proxy.status;

    window.document.getElementById("divStatusText").innerHTML = proxy.statusText;

    window.document.getElementById("divResponse").innerHTML = proxy.responseText;

}

Vous noterez l'utilisation d'un requêtage de type POST pour éviter les problématiques de mise en cache des navigateurs. Le paramètre « false » dans l'utilisation de la méthode « Open » permet d'indiquer que les appels seront synchrones. L'appel à la méthode « send » permet d'envoyer la requête http vers le serveur. Le paramètre « null » indique qu'on ne passe rien en temps que corps du message.

Voici un exemple d'url pour la récupération du guide :

« http://MonServeur:8000/MediaCenter/IWebManagement/GetGuideByDate?fromDate=05/08/2008&toDate=05/09/2008 »
 
» Démarrer une discussion