Utilisation d'un GPS en Visual Basic .NET pour Pocket PC
Auteur
Stéphane Sibué
Date Mercredi 22 novembre 2006

L'utilisation du GPS dans les applications mobiles est de nos jours plus qu'à la mode. Qu'à cela ne tienne, nous allons nous aussi intégrer des fonctions GPS dans nos applications mobiles en Visual Basic .NET pour Pocket PC.

Avant toute chose vous devez installer le SDK Windows Mobile 5 pour Pocket PC sur votre machine si ce n'est pas déjà fait. Vous pouvez télécharger ce SDK à l'adresse suivante : http://www.microsoft.com/downloads/details.aspx?FamilyID=83A52AF2-F524-4EC5-9155-717CBE5D25ED&displaylang=en

Sources de cet article

Un GPS c'est quoi ?

Je sais que 99,9% d'entre vous sait ce qu'est un GPS, mais bon, pour les 0,1% restant nous allons faire un rapide rappel. Le GPS (Global Positioning Sytem) est un système de localisation terrestre. A la fin des années 70, le principal souci du département de la défense des US est de créer un système permettant à tous les éléments de l'armée américaine de se positionner de manière précise et rapide n'importe où à la surface de la terre.

Le système GPS est composé d'une constellation de satellites (24 au total) positionnées de telle manière qu'au moins 3 d'entre eux soient visibles de n'importe quel point du globe. Chaque satellite émet un message codé donnant à ceux qui le reçoivent des informations sur sa position. Le récepteur GPS fait alors de savants calculs pour déterminer, grâce au décalage entre le moment et l'envoi et de la réception du signal, la position en termes de latitude, longitude et altitude (d'autres informations telles que la vitesse sont aussi calculées).


Grâce à un ingénieux système de codage, les données sont très précises pour l'armée américaine, et beaucoup moins précises pour les civiles. Nous devons nous contenter des données civiles, mais généralement ça suffit pour se positionner. La réception des données provenant des satellites et les calculs complexes qui doivent être réalisés pour déterminer la position sont effectués par des appareils spécialisés, de plus en plus bon marché, que sont les GPS.

Le protocole NMEA

Le GPS est un périphérique qui dialogue avec le reste du monde via une liaison série en utilisant le protocole NMEA (National Marine & Electronics Association). Ce protocole a été tout d'abord utilisé dans la marine et il est devenu au fil du temps la référence dans ce domaine. Le protocole NMEA est une suite de trames ASCII séparées par les caractères CRLF (comme dans un fichier texte). Chaque trame étant elle-même composée de champs séparés par des virgules. A la fin d'une trame, une somme de contrôle permet de vérifier que la trame reçue est valide et qu'elle peut être prise en compte.

Voici un exemple de trame NMEA :

$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68

Cette trame a pour identifiant $GPRMC, ce qui permet de savoir quelles sont les informations que l'on va trouver ensuite et dans quel ordre. Cette trame est donc composée de 12 champs (en comptant $GPRMC) et sa somme de contrôle est la valeur hexadécimale 68. La somme de contrôle est séparée du reste de la trame par l'étoile. Elle est calculée en effectuant le "ou" exclusif (xor) entre tous les caractères ASCII de la trame jusqu'à l'étoile sans prendre le $ de début.

Il existe plusieurs type de trames ($GPGGA, $GPRMC, $GPVTG, etc..) car chacune existe pour un type de données bien précis. La trame $GPVTG donne des informations sur le cap et la vitesse, alors que $GPGGA sur les satellites disponibles et la précision des mesures.

La trame $GPRMC

Le but et tout de même de connaître notre position. Pour cela il existe la trame $GPRMC qui donne la latitude, la longitude et la vitesse. Pour notre exemple ce sera parfait.

La trame $GPRMC est composée des informations suivantes :

00 $GPRMC
01 Heure du fix
02 Alerte (A=OK ; V=WARNIG)
03 Latitude au format ddmm.ss
04 Sens de la latitude (N=Nord=Positif, S=Sud=Négatif)
05 Longitude au format dddmm.ss
06 Sens de la longitude (E=Est=Positif, W=Ouest=Négatif)
07 Vitesse au sol en Knots (noeuds)
08 Cap vrai
09 Date du fix
10 Déclinaison magnétique
11 Sens de la déclinaison magnétique

Vous noterez que les champs 3 et 4 nous donnent la latitude, les champs 5 et 6 la longitude et le champ 7 la vitesse. Le champ 2 est là pour nous indiquer si les données fournies sont fiables ou non. Le GPS délivre à intervalle régulier (généralement chaque seconde) une série trames dont la trame $GPRMC, et ce même s'il n'est pas encore dans la possibilité de donner des informations fiables (pas assez de satellites fixés par exemple). Cet indicateur permet de savoir à coup sûr si les données peuvent-être utilisées ou non.

Le projet Visual Basic .NET

Afin d'illustrer toute cette théorie je vous propose un projet Windows Mobile 5.0 pour Pocket PC qui affiche les trames reçues du GPS connecté et traitera plus particulièrement la trame $GPRMC. Le programme indique si les données reçues sont fiables et si oui affiche la latitude, la longitude et la vitesse en temps réel.

Le contrôle SerialPort

Comme le GPS communique via liaison série nous allons tout naturellement utiliser le contrôle System.IO.Serial.SerialPort qui est l'unes des nouveautés du Compact Framework 2.0.

Ce contrôle prend en charge la partie communication série. Il suffit de lui indiquer quel port utiliser, la vitesse, quelques paramètres concernant la forme du message série (parité, nombre de bits de données, etc..) et il nous rend capable de lire et d'écrire via une liaison série.

Dans notre exemple nous ne ferons que lire des données.

Et les GPS Bluetooth ?

Si vous utilisez un GPS connecté via Bluetooth à votre Pocket PC pas de panique. Ce type de liaison Bluetooth est " vu " par les logiciels comme une liaison série. Les principes de lecture des données sont donc exactement les mêmes, à part que dans ce cas précis les notions telles que la vitesse, la parité, le nombre de bits de données n'ont pas d'importance car c'est le protocole Bluetooth qui prend en charges ces détails, sinon tout est identique, sympa non ?

La classe CGPS

Vous trouverez dans le projet la classe CGPS qui est le cœur de cette application. Cette classe s'occupe de tout. Elle gère le port de communication, effectue la lecture des trames, vérifie qu'elles sont valides (la somme de contrôle) et dans le cas d'une trame $GPSRMC, effectue le découpage des données et créé un objet de type CGPS.InfoRMC qui porte toutes les informations décodées de ce type de trame. Cette classe communique avec le reste du monde par événements. Elle déclenche l'événement NewTrame à chaque nouvelle trame valide reçue, l'événement NewInfoRMC à chaque nouvelle trame $GPRMC valide reçue, TimeoutOccurs en cas d'arrêt de la communication avec le GPS et enfin un événement ExeptionOccurs en cas d'erreur interne rencontrée (pour le débogage principalement).

Elle possède une méthode Start pour lancer le moteur d'acquisition des trames et tout naturellement Stop pour l'arrêter. Il est possible de paramétrer la vitesse du port série, ainsi que le délai avant le déclenchement de l'événement TimeoutOccurs. Les paramètres de type parité, nombre de bits de données et nombre de bits de stop sont réglés en dur à l'initialisation de l'objet car ce sont des valeurs fixées par le protocole NMEA. En cas de besoin il est très simple de rendre ces propriétés modifiables.

Le code de découpage des trames NMEA

La classe CGPS utilise un Timer interne pour la lecture des données en provenance de la liaison série. A chaque déclenchement du Timer, la classe lit l'intégralité du buffer d'entrée du contrôle SerialPort, puis s'occupe de découper chaque trame. Chaque trame est ensuite testée au niveau de sa somme de contrôle. Si la trame reçue est bonne l'événement NewTrame est déclenché avec la trame en paramètre. Si la trame est de type $GPRMC, elle est vérifiée, découpée, certains calculs sont effectués afin d'obtenir des données numériques utilisables pour la latitude et la longitude, et la vitesse est convertie en Km/h, l'événement NewInfoRMC est ensuite déclenché avec les données fraichement récupérées en paramètre.

C'est dans le code du constructeur de la classe CGPS.InfoRMC que la trame de type $GPRMC est fournie. Si cette trame est correctement formatée, les données sont placées dans les différentes propriétés de cette classe, sinon une exception est déclenchée et la création de l'objet échoue. C'est brutal comme méthode, mais ça marche.

Quelques liens sur le GPS

Pour faire évoluer la classe CGPS vous allez avoir besoin d'informations sur les GPS, et le protocole NMEA. Je vous conseille le très bon site GpsPassion http://www.gpspassion.com qui propose beaucoup d'articles autour du GPS et du NMEA, ainsi qu'un article très complet sur le GPS en général que vous trouverez à cette adresse : http://ditwww.epfl.ch/SIC/SA/publications/FI98/fi-5-98/5-98-page1.html

En conclusion

Il est extrêmement simple d'utiliser un GPS, et Visual Studio 2005 nous donne tous les outils pour construire ce type d'application, que ce soit pour PC ou pour les machines mobiles. A titre d'information, le code de la classe CGPS fonctionne directement et sans modification sur un Smartphone Windows Mobile 5.0 et aussi sur PC.


Stéphane Sibué


Développez pour Windows Mobile
Copyright 2001-2006 - Tous droits réservés
Toutes les marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.