Version imprimable       Envoyer     
Cliquez pour évaluer et commenter
Related Articles

Nous vous présentons les techniques permettant de créer des applications adaptables pour une meilleure utilisation des différents écrans et fonctionnalités sur les périphériques Windows Mobile.

Michael Saffitz

MSDN Magazine Juin 2008

...

Read more!

Check out the cool new features in Windows XP Tablet PC Edition, including a number of Ink types, and ink that's stored as ink. Here Paul Yao takes you on a tour of everything you need to know to get started.

Paul Yao

MSDN Magazine December 2004

...

Read more!

Andre Michaud vous explique comment utiliser les notifications pour que vos applications puissent gérer l'alimentation.

Andre Michaud

MSDN Magazine July 2007

...

Read more!

Paul Yao présente Windows Embedded CE 6.0.

Paul Yao

MSDN Magazine December 2006

...

Read more!

Si vous développez déjà des applications clientes .NET, ciblez-les vers Windows Mobile en utilisant les mêmes compétences et ensemble d’outils.

Daniel Moth

MSDN Magazine July 2007

...

Read more!

Also by this Author

Mike Calligaro vous donne les règles d'utilisation de base de XNA Game Studio 3.0 afin d'écrire des jeux pour Zune.

Mike Calligaro

MSDN Magazine Mai 2009

...

Read more!

Apprenez à paramétrer n'importe quel périphérique mobile de votre entreprise avec quelques lignes de code et du XML grâce à la mise en service des API dans le kit de développement logiciel Windows Mobile.

Mike Calligaro

MSDN Magazine April 2008

...

Read more!

Popular Articles

Dans cette rubrique, nous vous présentons certains des concepts qui sous-tendent le nouveau langage F#, qui combine des éléments de langages .NET fonctionnels et orientés objet. Nous vous aidons ensuite à écrire quelques programmes simples.

Ted Neward

MSDN Magazine Launch 2008

...

Read more!

Vous pouvez désormais exécuter une analyse de texte efficace et élaborée à l'aide d'expressions régulières dans SQL Server 2005.

David Banister

MSDN Magazine February 2007

...

Read more!

WPF est l'une des nouvelles technologies les plus importantes de .NET Framework 3.0. Ce mois-ci, John Papa présente ses fonctionnalités de liaison de données.

John Papa

MSDN Magazine December 2007

...

Read more!

Un gadget Sidebar est un petit outil puissant qui est étonnamment facile à créer. Découvrez les gadgets avec Donavon West.

Donavon West

MSDN Magazine August 2007

...

Read more!

C# allows developers to embed XML comments into their source files-a useful facility, especially when more than one programmer is working on the same code. The C# parser can expand these XML tags to provide additional information and export them to an external document for further processing. This article shows how to use XML comments and explains the relevant tags. The author demonstrates how to set up your project to export your XML comments into convenient documentation for the benefit of other developers. He also shows how to use comments ...

Read more!

La vie errante
Qu'est-ce qu'un robot peut vous enseigner ?
Mike Calligaro
Qu'est-ce qu'un robot peut vous enseigner ? Si vous êtes fan de la meilleure émission de télévision, vous vous dites sans doute qu'il pourrait vous apprendre à marcher, à parler et à donner une raclée à vos adversaires. Si, toutefois, vous êtes également fan du meilleur système d'exploitation mobile de la planète, vous pensez peut-être qu'il peut vous apprendre à prendre des photos par programmation, à utiliser le système SMS comme canal de données, à envoyer des données par Bluetooth ou WiFi et à vous avertir à des stades différents de la lecture d'une chanson. Je ne peux pas vous aider à donner des raclées à vos adversaires. Mais si c'est la seconde option qui vous intéresse, poursuivez votre lecture.

Bien que j'occupe un poste de développeur de logiciels chez Microsoft depuis plus de 14 ans, j'ai démarré dans la vie en tant qu'ingénieur de conception de matériel. J'ai obtenu un diplôme d'ingénierie électrique et j'ai passé les années formatrices de ma carrière à concevoir des macroordinateurs. À cette époque, il fallait disposer les portes logiques à la main et il n'était pas question d'utiliser de faire joujou avec Verilog, comme le font aujourd'hui tous les jeunes freluquets. (On se tapait également plusieurs kilomètres à pied dans le brouillard pour aller au boulot. Et ça montait. Dans les deux sens. Et on adorait).
Je suis carrément à l'opposé de mon ami et collègue, Brian Cross. Brian a toujours baigné dans le logiciel, et il y baignera toujours. Il a toujours travaillé pour Microsoft et il parle C# presque aussi bien qu'anglais. (C'est Brian, avec Charles Petzold, bien sûr, qui m'a enseigné les merveilles du code géré). Donc il est quelque peu ironique que, de nous deux, ce soit Brian qui ait créé un robot.
Peut-être avez-vous entendu parler de WiMo, le robot basé sur Windows Mobile® de Brian, dont vous trouverez une illustration à la figure 1. WiMo doit sa notoriété au fait qu'il s'agit d'un robot entièrement programmable pouvant être créé par n'importe qui (pas besoin d'être un ingénieur électricien). Brian, dans le style typique de Microsoft, voit l'ensemble comme un problème logiciel. Dans sa forme la plus simple, vous pouvez créer un WiMo fonctionnel à partir de rien de plus qu'un téléphone Windows Mobile et de quelques éléments Lego (même pas besoin de fer à souder).
Figure 1 Représentation de WiMo par un artiste (Cliquez sur l'image pour l'agrandir)
Rappelons cependant que cet article est consacré au développement mobile et non à la robotique. Donc l'article d'aujourd'hui ne va pas vraiment vous expliquer comment construire un WiMo. Je vais plutôt détailler certaines des choses que fait la base de code de WiMo et vous expliquer comment les appliquer à vos applications mobiles. Si, en cours de route, vous êtes inspiré pour faire quelque chose de dingue avec votre téléphone, tant mieux !
Commençons par le commencement. WiMo est en fait un simple ensemble de moteurs et de capteurs dont le but principal est de transporter un appareil Windows Mobile qui lui sert de cerveau. Tout le vrai travail est fait par le téléphone et tout le code qui fait ce travail est disponible gratuitement sur le site Web de WiMo, wimobot.com. Si vous avez envie de créer un WiMo, suivez le lien de création de WiMo à l'adresse wimobot. com/Building.aspx. Si c'est le code source qui vous intéresse, cependant, vous le trouverez à l'adresse wimobot.com/SourceCode. aspx. Nous allons parler de ce code source pendant un bon moment, alors autant vous le procurer dès maintenant.
Allez-y. J'attendrai.
Pardon ? Oui, cliquez sur le dédit de responsabilité qui dit que vous ne poursuivrez pas Brian en justice si vous utilisez sa technologie pour créer une machine qui finira par se transformer en son créateur. Ça n'arrivera jamais. Faites-nous confiance.
Après avoir décompressé le code, ouvrez le fichier WiMo.sln dans Visual Studio®. Ne vous occupez pas des erreurs de document XML ; une partie du charme de WiMo tient au fait qu'il a été créé par Brian le développeur « On peut faire n'importe quoi », et non par le Brian costume-cravate « Il n'est même pas envisageable de songer à sortir un produit sans un plan de test correct ». WiMo.sln compte un certain nombre de projets, mais vous devriez commencer par Form1.cs dans le projet WiMo. Dans ce fichier, vous verrez l'utilisation d'un grand nombre des classes les plus intéressantes définies dans la solution.

WiMo chante le blues
La partie Windows Mobile de WiMo communique avec les roues et les capteurs via Bluetooth. Brian a fait preuve de beaucoup d'humour en choisissant ce style de connexion parce qu'il craignait de détruire son téléphone accidentellement en essayant d'y souder des câbles. Tant mieux, parce que maintenant vous pouvez vous servir de ce code et l'utiliser pour des choses non robotiques. Si vous cherchez un lieu plus officiel pour le code source, vous trouverez des exemples de code Bluetooth sur MSDN® à l'adresse msdn.microsoft.com/embedded/aa714519. Ceci dit, vous trouverez un grand nombre de similarités entre les classes Bluetooth WiMo et les exemples MSDN.
La plupart des téléphones Windows Mobile prennent en charge la technologie Bluetooth et si le vôtre utilise une pile Bluetooth Microsoft® (malheureusement, ce n'est pas le cas de tous), le code WiMo fonctionnera dessus. Dans la mesure où la technologie Bluetooth est extrêmement courante, si vous voulez écrire une application qui communique avec des téléphones proches, l'utilisation de Bluetooth comme canal de communication est recommandée.
Le cerveau de WiMo : un téléphone (Cliquez sur l'image pour l'agrandir)
Donc disons que vous avez copié les classes Bluetooth de WiMo ou les exemples MSDN et que vous avez associé votre téléphone à un périphérique appelé « MyDevice ». Voici le code pour effectuer la connexion avec le périphérique :
using Microsoft.WindowsMobile.SharedSource.Bluetooth;

BluetoothRadio radio = new BluetoothRadio();
NetworkStream bthStream = null;
foreach (BluetoothDevice device in radio.PairedDevices) {
  if (device.Name == "MyDevice") {
    try {
      bthStream = 
        device.Connect(StandardServices.SerialPortServiceGuid);
    }
    catch (SocketException) {
      // do error recovery stuff here
    }
    break;
  }
}
À ce stade, vous avez un NetworkStream standard que vous pouvez utiliser pour envoyer et recevoir des données avec bthStream.Read et bthStream.Write. Et comme ça, tout simplement, vous communiquez maintenant en mode Bluetooth. Vous pourriez utiliser cette méthode pour toutes les situations où vous avez une application qui s'exécute sur deux téléphones et souhaitez qu'ils communiquent ensemble. Mais il y a également une multitude d'autres possibilités.
Il s'agit ici de la méthode de base pour communiquer avec n'importe quel appareil Bluetooth qui parle le langage série. Ainsi, pour vous connecter à une unité GPS Bluetooth, vous feriez quelque chose de très similaire. Un blogueur sur le blog WiMo a dit qu'il utilisait un code tel que celui-ci pour recueillir les données de performances du moteur de sa voiture compatible Bluetooth. Lego Mindstorms parle Bluetooth, c'est donc comme ça que fonctionne la version Lego de WiMo. Et, si un peu de soudure ne vous fait pas peur, vous pouvez connecter un modem Bluetooth bon marché à n'importe quel périphérique série. (Brian fournit tous les détails nécessaires dans la section « Hardware to buy to build a WiMo » [Matériel à acheter pour construire un WiMo] du site WiMo). Il y a un tableau énorme des capteurs disponibles dans le monde que vous pourriez connecter à un de ces modems. En tant que développeurs de systèmes mobiles, vous savez que faire avec les données une fois qu'elles sont sur votre téléphone. Autrefois, tout le problème résidait dans leur transfert sur le téléphone. Mais ce n'est plus le cas.

WiMo et les messages SMS
Puisque le cerveau de WiMo est un téléphone, il peut recevoir des commandes d'un certain nombre de sources différentes, y compris le SMS. Ceci signifie que WiMo peut recevoir des commandes de la plupart des téléphones cellulaires sur la planète, Windows Mobile ou autres, et même communiquer avec des clients de messagerie instantanée qui prennent en charge le SMS. (Windows Live™ Messenger en fait partie.)
Ceci est géré par la classe MessageInterceptor, que vous pouvez voir utilisée dans le fichier DesktopSms.cs de WiMo. Ce fichier se trouve sous le projet WiMo.Common.Device. Il est également documenté dans son intégralité sur MSDN à l'adresse go.microsoft.com/fwlink/?LinkId=120888. MessageInterceptor dit en gros « Quand le téléphone reçoit un SMS remplissant ces conditions, envoyez-le sur mon application ». Vous pouvez même lui demander de lancer votre application si elle ne s'exécute pas encore.
L'interception des messages, comme la plupart des choses dans C#, est facile à implémenter. La figure 2 illustre le code de base dont vous aurez besoin.
using Microsoft.WindowsMobile.PocketOutlook;
using Microsoft.WindowsMobile.PocketOutlook.MessageInterception;

const string smsCommandId = "MyAppName";
const string smsComparisonValue = "MyAppSmsIdentfier";

MessageInterceptor intercept = 
  new MessageInterceptor(InterceptionAction.NotifyAndDelete);
intercept.MessageCondition = new MessageCondition();
intercept.MessageCondition.CaseSensitive = true;
intercept.MessageCondition.ComparisonType = 
  MessagePropertyComparisonType.StartsWith;
intercept.MessageCondition.ComparisonValue = smsComparisonValue;
intercept.EnableApplicationLauncher(smsCommandId);

intercept.MessageReceived += 
  new MessageInterceptorEventHandler(intercept_MessageReceived);

void intercept_MessageReceived(object sender, 
  MessageInterceptorEventArgs e) {
  if (e.Message is SmsMessage) {
    SmsMessage sms = (SmsMessage)e.Message;
    // sms.Body contains the text of the message we received
  }
}
Vous pensez peut-être aux SMS comme à des messages électroniques courts, mais ces classes vous permettent de les utiliser comme un canal de données complet. Imaginez que vous écrivez un jeu qui se joue par tour comme les échecs (ou le Shogi, version japonaise des échecs) où vous jouez en envoyant et recevant des messages SMS.
Ou imaginez que vous avez une application sur votre téléphone qui peut être configurée à distance. Vous arrive-t-il souvent d'égarer votre téléphone ? (Je parie qu'il se trouve au même endroit que vos clés de voiture). Vous pourriez vous connecter à votre client de messagerie instantanée et lui envoyer une commande pour lire un fichier WAV disant « Hé Mike, par ici ». (Bien qu'il serait un peu bizarre que vous me disiez où se trouve votre téléphone). Si vous voulez vraiment avoir l'air branché, faites-lui dire « WiMo 5 est vivant » ! Personne ne comprendrait la plaisanterie, mais cela fait partie de l'attrait.

Je mets le pied devant...
C'est un peu gênant, mais... comment dire ? OK, WiMo danse le hokey-cokey. Ça y est, je l'ai dit. Comme les trois lois de la robotique, c'est en fait une protection pour l'humanité. Si WiMo en arrive un jour à pouvoir saisir une arme et dire « Je suis désolé, Brian, mais je ne vais pas pouvoir faire ça », Brian répondra « WiMo, danse ! ». Une fois sa danse achevée, WiMo disparaîtra dans un coin et fera comme si de rien n'était.
Je ne vous suggère pas de coder vos applications Windows Mobile pour interagir avec le hokey-cokey, mais l'idée d'être averti à certains points d'une chanson est assez intéressante. Et l'infrastructure dévoilée par le hokey-poket de WiMo est vraiment très chouette.
L'infrastructure dont je parle est Windows Mobile State and Notifications Broker (SNAPI). La version gérée se trouve dans l'espace de noms Microsoft.WindowsMobile.Status et la classe qui vous intéresse vraiment est SystemState.
Vous trouverez des détails supplémentaires sur la classe SystemState à l'adresse go.microsoft.com/fwlink/?LinkId=120893. Cliquez sur le lien pour voir les propriétés de SystemState. Vous voyez cette liste d'une centaine de propriétés système auxquelles vous pouvez accéder ? Force du signal, niveau de la batterie, états Bluetooth, si l'utilisateur est au téléphone ou non, le numéro de téléphone de l'appareil, etc. ? Que pourriez-vous faire si vous aviez accès à un tel pouvoir ? Utilisez-le intelligemment. SNAPI peut vous prévenir lorsque l'une de ces valeurs change. Il peut même lancer votre application si la valeur que vous avez choisie change lorsque votre application ne s'exécute pas.
WiMo danse lorsqu'il est averti que la propriété MediaPlayerTrackTimeElapsed a changé. Il sait que faire à chaque moment de la chanson et réagit en conséquence. Voici le code :
using Microsoft.WindowsMobile.Status;

SystemState mediaTimeElapsed = 
  new SystemState(SystemProperty.MediaPlayerTrackTimeElapsed);
mediaTimeElapsed.Changed += 
  new ChangeEventHandler(mediaTimeElapsed_Changed);

void mediaTimeElapsed_Changed(object sender, ChangeEventArgs args) {
  int time = (int)args.NewValue;
  // Do something with the new value
}
Si vous aimeriez que votre application se lance lorsque l'un de ces états change, examinez la méthode EnableApplicationLauncher dans SystemState. Vous y trouverez le code WiMo qui s'en charge dans le fichier Form1.cs principal.

L'œil électrique de WiMo
De nos jours, la plupart des téléphones cellulaires sont dotés d'un appareil photo et WiMo fait bon usage de celui qui est intégré dans son cerveau. La partie de WiMo qui renferme le téléphone se trouve sur un disque attaché à un moteur. WiMo sait faire pivoter le téléphone pour que l'appareil soit orienté vers vous, prendre une photo et faire à nouveau pivoter le téléphone pour que vous puissiez voir l'écran. Le téléphone peut également servir de caméra vidéo rudimentaire, en vous permettant de diriger WiMo à distance et de regarder ce qu'il voit.
Dans Windows Mobile 5.0 (sur lequel WiMo est basé), l'API d'appareil photo est quelque peu limitée. Il y n'a pas d'interface gérée et l'interface native est fortement orientée vers la prise d'images fixes et leur enregistrement sur une carte de stockage. Si vous vous en servez comme d'une caméra vidéo, la fréquence d'image est limitée par la vitesse à laquelle l'appareil peut enregistrer et récupérer les images sur cette carte de stockage. Personne ne prétend qu'il s'agit d'une solution idéale, mais l'objectif est atteint.
Cette situation offre cependant quelques avantages. Tout d'abord, si vous souhaitiez écrire une DLL native que vous pourriez appeler depuis votre application gérée, WiMo fournit un très bon exemple pour y parvenir. Examinez le projet WiMoNative, puis regardez comment le reste de la solution de WiMo interagit avec lui. Si vous avez déjà utilisé PInvoke à partir d'un code géré, vous avez déjà parcouru la moitié du chemin. Pour appeler une DLL que vous avez écrite, il suffit d'utiliser la méthode PInvoke sur les fonctions que vous avez exportées. Par exemple, regardez la fin du fichier Camera.cs sous le projet Wimo.Common.Device. Voici deux des déclarations PInvoke que vous y trouverez :
[DllImport("WiMoNative.dll")]
private static extern int OpenCamera(int id, ref IntPtr hCamera);

[DllImport("WiMoNative.dll")]
private static extern int CloseCamera(IntPtr hCamera);
Et voici les déclarations natives des mêmes fonctions dans ­WiMoNative.cpp :
HRESULT OpenCamera(DWORD dwResolutionId, HANDLE* hCamera);
HRESULT CloseCamera(HANDLE hCamera);
Par ailleurs, WiMoNative.cpp est sans doute l'introduction à DirectShow la plus simple qui soit. La fonction OpenCamera crée un graphique de filtre et raccorde les broches appropriées dans soixante lignes de code environ. Au fil des années, de nombreux experts ont essayé de m'enseigner le fonctionnement de DirectShow. Et, à chaque fois, j'ai renoncé à comprendre au bout de cinq minutes. Mais quand il s'agit de comprendre du code, rien ne vaut un exemple solide qui fait quelque chose d'utile.

WiMo a démarré lorsque Brian a eu envie d'apprendre quelque chose de nouveau. Il a opté pour l'électronique et a décidé de créer un robot. Mais il ne s'agit là que d'une partie de l'histoire. Brian a également dit : « J'ai écrit toutes ces classes gérées Windows Mobile. Je devrais faire quelque chose pour montrer aux gens comment les utiliser ». Si WiMo donne l'impression d'utiliser toutes les technologies possibles, c'est parce qu'il le fait. Volontairement.
Le protocole TCP/IP est l'une de ces technologies. WiMo peut communiquer avec un ordinateur de bureau via WiFi, qui utilise le même TcpClient géré que les connexions Ethernet câblées. Le code est disponible dans WimoNetTcp.cs sous le projet Wimo.Common. La page MSDN pour le TcpClient est msdn.microsoft.com/system.net.sockets.tcpclient.
La communication via TCP est similaire à la communication via Bluetooth. Vous commencez par établir une connexion, puis vous utilisez NetworkStream pour envoyer et recevoir des données. Si vous vous connectez à un serveur, c'est aussi simple que ceci :
using System.Net.Sockets;
using System.Net;

const string myServer = "www.myserver.com";
const int myPort = 11000;

TcpClient client = new TcpClient();
client.Connect(myServer, myPort);

NetworkStream stream = client.GetStream();

// From here you can call the stream.Read and stream.Write APIs

stream.Close();
Si vous communiquez avec un autre périphérique, vous pouvez utiliser la version de client.Connect qui se sert d'une adresse IP plutôt que d'un nom d'hôte. Bien entendu, il vous faudra alors obtenir cette adresse IP de l'ordinateur distant. Il est toutefois facile d'obtenir vos propres adresses. Imaginons par exemple que vous voulez votre adresse IPv4.
string myHostName = Dns.GetHostName();
IPHostEntry hostEntry = Dns.GetHostEntry(myHostName);
foreach (IPAddress ip in hostEntry.AddressList) {
  if (ip.AddressFamily == AddressFamily.InterNetwork) {
    // ip is the IPv4 address   
  }
}
Si vous écrivez une application qui communique via TCP avec la même application sur un autre téléphone, vous obtiendrez votre adresse IP, l'enverrez sur l'autre téléphone par SMS, puis l'autre téléphone utilisera cette adresse IP pour se connecter à vous. Pour cela, consultez la classe TcpListener à l'adresse msdn.microsoft.com/system.net.sockets.tcplistener. Voici l'idée générale :
TcpListener listener = 
  new TcpListener(IPAddress.Any, port);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
listener.Stop();
Il s'agit d'une présentation éclair de TCP/IP, mais je crois que cela suffira pour vous lancer.

Les WiMo rêvent-ils de moutons électriques ?
Il y a encore beaucoup plus à dire sur la base de code de WiMo. WiMo est en fait une escadrille de robots avec un certain nombre de modules de roues et de capteurs différents. Les premiers ont été créés à partir de pièces de robots (moteurs, microcontrôleurs et cartes de circuits imprimés). Mais les WiMo suivants étaient basés sur d'autres choses, y compris un gros camion télécommandé et Lego Mindstorms. Actuellement, Brian travaille sur la transformation d'un aspirateur Roomba en WiMo (vous trouverez le début de ce code dans les sources). Il y a par la-bas du bien joli code qui extrait ces bases différentes, ainsi que des trucs pratiques pour communiquer avec un microcontrôleur bon marché.
L'objectif de cet article était de vous montrer quelques-unes des technologies qui sont à votre disposition lorsque vous développez vos applications Windows Mobile. Mais si vous voulez en savoir plus, n'hésitez pas. Si vous avez toujours voulu plonger dans l'électronique, WiMo est un point de départ formidable, même si vous ne connaissez pas la différence entre un inducteur et un condensateur. Le site Wimobot vous montrera toutes les étapes nécessaires, tout des composants à acheter à comment les relier, en passant par l'écriture du code qui communique avec eux.
Si vous n'êtes pas intéressé par un appareil qui peut danser le hokey-cokey, toute une série d'options s'offrent à vous. Un téléphone Windows Mobile type est composé d'un matériel qui est meilleur en tous points que l'ordinateur que j'utilisais lorsque j'ai commencé à travailler pour Microsoft. Il a un processeur plus rapide, plus de mémoire vive, plus de stockage et un écran qui affiche plus de pixels. Et vous pouvez l'emmener partout où vous allez.
Avez-vous remplacé un appareil Windows Mobile 5.0 par un appareil Windows Mobile 6 ? Qu'est devenu votre appareil WM5 ? Vous avez probablement désactivé votre service de téléphone portable, mais tout le reste doit encore fonctionner. Si c'est le cas, vous disposez d'un ordinateur mobile entièrement programmable qui ramasse la poussière dans un placard ; pourquoi ne pas lui offrir une seconde vie ? Créez un robot. Faites-en une caméra de surveillance (WiMo prend des photos et les envoie à un PC ; pas besoin de roues ou de capteurs). Créez ou achetez une station météorologique qui parle Bluetooth et utilisez votre téléphone pour rassembler et analyser les données. Vous pourriez même commencer à créer un droïde astromécano. (« Par ici, WiMo ».)
Laissez courir votre imagination. Si vous lisez ceci, vous êtes probablement un ingénieur. Vous pouvez faire n'importe quoi. Il vous suffit de vous lancer. J'espère que WiMo et cet article vous ont inspiré pour créer quelque chose de passionnant avec vos appareils Windows Mobile. Amusez-vous bien à coder !


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