MSDN Magazine > Home > Issues > 2008 > April >  La vie errante: Configuration de périph...
La vie errante
Configuration de périphériques mobiles
Mike Calligaro

Bienvenue dans La vie errante, une nouvelle rubrique consacrée au développement des périphériques mobiles. Nous nous concentrerons sur les téléphones Windows Mobile® et les Tablet PC, même si tout sujet associé à la mobilité est également bienvenu.
Mon nom est Mike Calligaro et je suis développeur chez Microsoft depuis 14 ans. À part deux semaines passées dans l'équipe Bureau Windows®, j'ai passé toute ma carrière dans ce qui est maintenant la division Windows Mobile. J'ai travaillé sur une large gamme de produits, notamment une version antérieure de télévision interactive, Sega Dreamcast et le système d'exploitation Windows CE. J'ai passé les huit dernières années à travailler sur différentes parties de Windows Mobile.
Aujourd'hui je parlerai de la configuration par programmation des périphériques Windows Mobile. Si vous êtes responsable informatique ou technicien du support technique et que vous configurez manuellement des périphériques Windows Mobile pour vos utilisateurs, ne partez pas. Cet article est pour vous. Si vous êtes développeur d'applications mobiles et que vous souhaitez un moyen facile d'ajouter votre page Web aux favoris du navigateur, cela vous aidera aussi.
Si je vous disais qu'il suffit de quelques lignes de code et du XML pour configurer un VPN, définir la date et l'heure du périphérique, configurer un compte de messagerie, ajouter un fichier au périphérique, définir une sonnerie, modifier une clé de registre et bien plus encore ? Maintenant combien me payeriez-vous ? Un million de dollars ? Deux ? Eh bien, dans cette offre spéciale de MSDN Magazine®, nous mettons ces fonctionnalités à votre disposition gratuitement ! Oui, oui. Gratuitement ! Dépêchez-vous !
Heureusement je suis meilleur développeur que vendeur. Plus sérieusement, la configuration des API fait partie du SDK standard de Windows Mobile, qui est un téléchargement gratuit disponible au Centre de développement Windows Mobile à l'adresse msdn.microsoft.com/windowsmobile.

Pourquoi une configuration ?
Bien que le nom Windows Mobile soit arrivé plus tard, Microsoft a créé sa première plate-forme de téléphones cellulaires en 2002. Entrer dans le monde de la téléphonie signifiait l'implémentation d'un certain nombre de choses que les opérateurs mobiles souhaitaient mais auxquelles ils n'étaient pas familiarisés, comme la capacité de configurer des périphériques à distance. Il n'y avait pas grand-chose à configurer sur le téléphone de 2002 ! Mais nous devions prendre en charge ce niveau basique de configuration pour être compétitif. Une fois l'infrastructure en place, nous avons pensé qu'il serait utile d'effectuer de nombreuses configurations à distance.
Par exemple, en raison des exigences de ma tâche, j'ai fini par utiliser plusieurs téléphones et plusieurs versions de systèmes d'exploitation. Pendant la période la plus instable du cycle de vie de développement, j'ai eu parfois à configurer plusieurs téléphones par jour. Et même lorsque tout se passe bien, il n'est pas rare que je configure au moins un téléphone par semaine. Ainsi au lieu de saisir manuellement mon adresse Exchange Server et de configurer ma sonnerie, je crée un blob XML qui réalise la plupart de mon installation. Je garde le fichier XML et un petit programme pour le traiter sur une carte de stockage. Ainsi, je suis toujours prêt lorsque quelqu'un me remet un nouveau téléphone à essayer.
Je suis sûr que définir Penny Arcade comme un favori de navigateur n'a jamais été une exigence d'un opérateur mobile, mais je suis satisfait que nous ayons appliqué dans ce cas l'adage « Lorsqu'on est muni d'un marteau, tout ressemble à un clou ».
Pour participer à cette magie de la configuration, tout ce dont vous avez besoin c'est d'une seule API (DMProcessConfigXML) et du XML. Par exemple, admettons que vous voulez définir Live Search comme un favori du navigateur. Démarrez avec le XML suivant :
// WAP provisioning XML to add a new browser favorite.
LPCWSTR g_wszFavoriteXml = 
    L"<wap-provisioningdoc> "
    L"   <characteristic type=\"BrowserFavorite\"> "
    L"      <characteristic type=\"Live Search\"> "
    L"         <parm name=\"URL\" value=\"http://m.live.com/\"/> "
    L"      </characteristic> "
    L"   </characteristic>"
    L"</wap-provisioningdoc>";
Voici tout le code dont vous avez besoin pour définir un favori à l'aide de XML :
HRESULT AddFavorite() {
   HRESULT hr         = E_FAIL;
   LPWSTR wszOutput   = NULL;
   
   // Process the XML.
   hr = DMProcessConfigXML(g_wszFavoriteXml, 
     CFGFLAG_PROCESS, &wszOutput);
 
   // The caller must delete the XML returned from DMProcessConfigXML.
   delete [] wszOutput;
   return hr;
 }
Je simplifie un peu les choses pour des raisons d'espace. Dans votre propre code vous devez effectuer des vérifications de sécurité et d'erreur. Et vous êtes plus susceptible de lire le XML d'un fichier que de le compiler dans votre code. Mais, en bref, c'est ce que vous devez faire.
Il y a également un wrapper géré pour DMProcessConfigXML. Dans C#, vous pouvez utiliser ConfigurationManager.ProcessConfiguration à la place. Voici le même code dans C# :
XmlDocument configDoc = new XmlDocument();
configDoc.LoadXml(
    "<wap-provisioningdoc>"+
    "<characteristic type=\"BrowserFavorite\">"+
    "<characteristic type=\"Live Search\">"+
    "<parm name=\"URL\" value=\"http://m.live.com/\"/>"+
    "</characteristic>"+
    "</characteristic>"+
    "</wap-provisioningdoc>"
    );
ConfigurationManager.ProcessConfiguration(configDoc, false);

Fournisseurs de services de configuration
DMProcessConfigXML envoie le XML qu'il reçoit aux divers fournisseurs de services de configuration (CSP). Ces fournisseurs lisent le XML et travaillent dessus. S'il y a une configuration non prise en charge à modifier, il est probable que nous n'ayons pas encore écrit de fournisseur de services de configuration pour cela. Nous sommes intéressés par vos commentaires sur les nouveaux fournisseurs de services de configuration que vous trouvez utiles à ajouter.
La liste définitive des fournisseurs de services de configuration est disponible à l'adresse msdn2.microsoft.com/bb737536.aspx. Il y a également un certain nombre d'exemples de XML disponibles à l'adresse msdn2.microsoft.com/bb737572.aspx.
Malheureusement, en ce qui concerne la disponibilité des fournisseurs de services de configuration, il y a toujours une différence entre les téléphones Windows Mobile Professional (Pocket PC) et les téléphones Windows Mobile Standard (Smartphone). Vous découvrirez que certains fournisseurs de services de configuration sont disponibles pour le Standard mais pas pour le Professional. (Nous avons gardé le sens de l'humour). Nous mettons tout en œuvre pour unifier les plates-formes à l'avenir. Les OEM et les opérateurs mobiles ont également la possibilité de désactiver de manière sélective les fournisseurs de services de configuration pour verrouiller les fonctionnalités qu'ils ne veulent pas modifier. Pour être sûr, vous devez toujours tester les configurations que vous avez l'intention de déployer sur les téléphones que vous souhaitez prendre en charge.
Vous voulez quelques exemples ? D'abord, voici un blob de XML qui définit le fuseau horaire, active l'alarme et la définit :
<wap-provisioningdoc>
   <characteristic type="clock">
      <parm name="TimeZone" value="4"/>
      <parm name="AlarmOn" value="1"/>
      <parm name="AlarmTime" value="06:30:00Z"/>  
   </characteristic>
</wap-provisioningdoc>
Le type de caractéristique vous indique qu'il utilise le fournisseur de services de configuration d'horloge. Chaque fournisseur de services de configuration dispose d'une page MSDN qui décrit les paramètres que vous pouvez modifier ainsi que les valeurs possibles de chaque paramètre. Par exemple, la documentation du fournisseur de services de configuration d'horloge est disponible à l'adresse msdn2.microsoft.com/bb737261.aspx et elle décrit les valeurs possibles pour TimeZone, AlarmOn et AlarmTime ainsi que deux paramètres non présents dans cet exemple (la date et l'heure).
Assurez-vous de vérifier les documents pour attribuer aux paramètres des valeurs correctes. Je suis sûr qu'ils ont un sens, mais souvent pas pour de simples mortels comme moi. Par exemple, la valeur de TimeZone pour GMT -8 est 4, mais la valeur pour GMT -5 est 35. Vous vous imaginez...
La figure 1 présente un exemple des opérations que vous pouvez faire avec le fournisseur de services de configuration de synchronisation. (Notez que la documentation du fournisseur de synchronisation est à l'adresse msdn2.microsoft.com/bb737700.aspx.) Comme vous pouvez le voir, vous pouvez choisir quelles données sont à synchroniser, à partir d'où, à quelle fréquence, etc. Il y a environ 50 paramètres associés à synchroniser que vous pouvez configurer avec ce fournisseur.
<wap-provisioningdoc>
   <characteristic type="Sync">
      <characteristic type="Connection">
         <parm name="Server" value="testserver"/>
         <parm name="User" value="testuser"/>
         <parm name="Domain" value="thephone-company"/>
         <parm name="AllowSSLOption" value="1"/>
      </characteristic>
      <characteristic type="Settings">
         <parm name="PeakStartTime" value="0800"/>
         <parm name="PeakEndTime" value="1800"/>
         <parm name="PeakFrequency" value="0"/>
         <parm name="BodyTruncation" value="5120"/>
      </characteristic>
      <characteristic type="Calendar">
         <parm name="Enabled" value="1"/>
      </characteristic>
      <characteristic type="Contacts">
         <parm name="Enabled" value="1"/>
      </characteristic>
      <characteristic type="Mail">
         <parm name="Enabled" value="1"/>
      </characteristic>
   </characteristic>
</wap-provisioningdoc>

Même si ces exemples ne sont qu'un aperçu, ils vous donnent une idée de la manière dont fonctionnent les fournisseurs de services de configuration.

Installation de votre XML sur le périphérique
Donc vous avez conçu un XML génial et vous avez écrit une petite application qui ouvre un fichier XML et envoie les données à DMProcessConfigXML. Mais vous n'effectuerez aucune configuration tant que vous n'avez pas installé le XML et l'application sur le périphérique.
Voici quelques options. Le plus simple est d'installer le fichier et l'application sur une carte de stockage, d'insérer la carte dans un périphérique, puis d'exécuter l'application à l'aide de l'explorateur de fichiers. C'est ce que je fais pour configurer mes périphériques.
Mais que se passe-t-il si vous êtes responsable informatique avec des centaines de périphériques à configurer ? Les étapes supplémentaires pour lancer l'explorateur de fichiers et accéder à l'application prendraient trop de temps. Dans ce cas, vous pouvez exécuter l'application de configuration automatiquement lorsque vous insérez la carte de stockage.
Créez un dossier appelé 2577 (ne me demandez pas pourquoi) à la racine de la carte de stockage et mettez votre application de configuration dans ce dossier. Nommez l'application autorun.exe. Si l'application ouvre automatiquement un nom de fichier XML standard (par exemple, config.xml), tout ce que vous devez faire pour configurer le périphérique, c'est insérer la carte. L'astuce AutoRun fonctionne également lorsque le périphérique démarre, donc il fonctionnera même si vous avez un téléphone qui nécessite de retirer la batterie pour insérer la carte de stockage.
Bien sûr, il y a davantage d'options. Si, après l'installation initiale, vous envisagez d'effectuer d'autres configurations avec vos périphériques, vous pouvez installer l'application de configuration sur le périphérique et lui associer une extension. Vous pouvez ensuite envoyer les fichiers de configuration par message électronique avec l'extension associée à vos utilisateurs. Il leur suffit d'ouvrir le fichier de configuration joint pour configurer leurs périphériques. Vos utilisateurs peuvent également parcourir un site Web qui télécharge le fichier de configuration pour eux.
Il est également possible d'utiliser PushRouter pour envoyer les fichiers de configuration avec le protocole WAP (Wireless Application Protocol) sur SMS vers les périphériques. PushRouter dépasse le cadre de cet article, mais c'est ainsi que les opérateurs de mobiles envoient les fichiers de configuration aux téléphones sur leurs réseaux.
Si vous êtes un fabricant indépendant de logiciels (FIL), vous pouvez utiliser les fournisseurs de services de configuration dans votre programme d'installation pour effectuer la configuration de périphérique nécessaire, de l'ajout de fichiers à la modification de clés de registre, en passant par l'ajout de favoris de navigateur et la modification de l'écran d'accueil. La simplicité du format de configuration permet également de disposer d'un fichier XML correspondant pour votre programme de désinstallation qui annule les actions de votre programme d'installation.
Si vous êtes connecté au périphérique par ActiveSync® ou le Gestionnaire pour appareils Windows Mobile, vous pouvez configurer le périphérique sans y placer de fichiers. L'outil de bureau rapiconfig.exe est situé dans le répertoire d'outils du kit de développement logiciel Windows Mobile. Cet outil lira un fichier XML et utilisera RAPI pour configurer le périphérique actuellement connecté à ActiveSync. Après avoir installé le périphérique, accédez au répertoire d'outils dans le SDK et (supposons que votre fichier XML soit appelé config.xml) tapez ceci :
rapiconfig config.xml
Pour plus d'informations sur RapiConfig, lisez l'article à l'adresse suivante msdn2.microsoft.com/bb737541.aspx.
Enfin, vous pouvez créer un fichier CAB ou un fichier CPF (CAB Provisioning Format). Les CAB et les CPF peuvent être copiés sur un périphérique et exécutés directement sans nécessité d'un programme. L'outil de bureau makecab.exe qui permet de créer les deux types de fichiers est également disponible dans le kit de développement logiciel Windows Mobile.
La principale différence entre un CAB et un fichier CPF est que le CPF n'ouvre pas de boîte de dialogue lors de son exécution (il s'exécute silencieusement). Cela s'avère être également l'inconvénient principal du CPF. Selon les paramètres de sécurité du périphérique et selon que le fichier est signé ou pas, les CAB et CPF peuvent afficher une boîte de dialogue demandant à l'utilisateur s'il veut configurer le périphérique. Comme le CPF doit s'exécuter silencieusement, il ne peut pas afficher cette boîte de dialogue. Donc il échoue. Au final, si vous avez l'intention de signer le fichier de configuration, utilisez un CPF. Sinon, utilisez un CAB.
Les deux sont très simples. Transférez simplement un fichier XML normal vers makecab et donnez-lui le nom du fichier de sortie que vous souhaitez. L'astuce est que le fichier XML doit être nommé _setup.xml. Si vous le nommez autrement, makecab réussira, le fichier CAB ou CPF sera bien généré, puis il échouera avec une erreur cryptée lorsque vous essayez de l'utiliser. Attention, la documentation n'est pas très claire à ce sujet.
La syntaxe pour créer un fichier CAB est :
makecab _setup.xml config.cab
Contrairement au fichier XML, il n'y a pas de restrictions sur le nom du fichier CAB généré. Par exemple, au lieu de config.cab, vous pouvez choisir le nom de votre choix pour le fichier CAB généré. La syntaxe pour créer un fichier CPF est, de la même manière :
makecab _setup.xml config.cpf
Encore une fois, remplacez config.cpf par le nom de votre choix pour le fichier CAB. Oui, c'est correct, la seule différence entre les deux, c'est l'extension .cab ou .cpf du fichier de sortie. Et, encore une fois, dans les deux cas, le fichier XML doit être appelé _setup.xml.
Consultez l'adresse suivante msdn2.microsoft.com/bb737689.aspx pour plus d'informations sur les fichiers CPF et msdn2.microsoft.com/bb416436.aspx pour plus d'informations sur la signature des fichiers CPF.

Qui veut saisir du XML ?
Saisir à la main le XML est parfait pour les professionnels de l'informatique, mais que se passe-t-il si vous souhaitez autoriser vos utilisateurs à choisir leur propre configuration parmi une série d'options ? Ne serait-il pas appréciable d'avoir un site Web avec une série de cases à cocher et autres ? Les utilisateurs navigueraient sur le site, choisiraient ce qu'ils veulent et généreraient le fichier XML.
Pour ce scénario, Microsoft® .NET Framework fournit la classe XmlDocument, en facilitant la génération de XML par programmation. Par exemple, rappelez-vous le XML d'horloge ci-dessus ? Le code de la figure 2 le crée immédiatement.
void CreateXML()
{
    XmlDocument xmlDoc = new XmlDocument();
    XmlElement root = CreateRoot(xmlDoc);

    XmlElement type = CreateCharacteristic(xmlDoc, "clock", root);
    CreateParm(xmlDoc, "TimeZone", "4", type);
    CreateParm(xmlDoc, "AlarmOn", "1", type);
    CreateParm(xmlDoc, "AlarmTime", "06:30:00Z", type);

    xmlDoc.Save("config.xml");           
}

XmlElement CreateRoot(XmlDocument xmlDoc)
{
    XmlElement root = xmlDoc.CreateElement("wap-provisioningdoc");
    xmlDoc.AppendChild(root);
    return root;
}

XmlElement CreateCharacteristic(XmlDocument xmlDoc, string type, XmlElement parent)
{
    XmlElement element = xmlDoc.CreateElement("characteristic");
    element.SetAttribute("type", type);
    parent.AppendChild(element);
    return element;
}

XmlElement CreateParm(XmlDocument xmlDoc, string name, string value, XmlElement parent)
{
    XmlElement element = xmlDoc.CreateElement("parm");
    element.SetAttribute("name", name);
    element.SetAttribute("value", value);
    parent.AppendChild(element);
    return element;
}

CreateRoot, CreateCharacteristic et CreateParm sont des fonctions d'assistance que vous pouvez copier tel quel. Alors créez votre propre CreateXML qui les appelle. Cet exemple code en dur les informations de paramètres, mais dans votre page Web les valeurs viennent des choix d'interface utilisateur. Après avoir généré le XML, le site Web le télécharge vers le périphérique pour que l'utilisateur l'exécute.
Vous pourriez aussi parfaitement écrire une application de configuration qui s'exécute sur le périphérique. Après avoir sélectionné la configuration appropriée, un code comme celui de la figure 2 générerait le XML et l'enverrait directement à ConfigurationManager.ProcessConfiguration. Donc vous n'auriez pas besoin d'effectuer la procédure d'envoi du XML à un fichier et de le lire.

Tout configuré et prêt à fonctionner
Si vous avez déjà eu à entrer une adresse Exchange Server sur le pavé numérique de votre téléphone, vous avez dû avoir recours au confort du clavier de votre bureau et de composer du XML. Personne ne devrait avoir à traverser une telle épreuve. J'espère que cet article vous a... libéré. Bonne configuration !

Veuillez envoyer vos questions et commentaires à goplaces@microsoft.com.


Mike Calligaro est responsable de développement senior dans l'équipe Windows Mobile chez Microsoft et il contribue au blog de cette équipe qui se trouve à l'adresse blogs.msdn.com/windowsmobile.

Page view tracker