Micro Projet Systèmes Embarqués Envoi et Réception de SMS sous
Transcription
Micro Projet Systèmes Embarqués Envoi et Réception de SMS sous
Nicolas BESSON Emilie COUSIN Nicolas MARTIN Christophe PARIS ESSI3 – STREAM Mars 2002 Micro Projet Systèmes Embarqués Envoi et Réception de SMS sous PocketPC J.Y. TIGLI & E. MATHIEU Présentation du sujet : Dans le cadre du module Systèmes Embarqués, nous avons étudié la possibilité d’envoyer et de recevoir des messages SMS sur un Pocket PC grâce à un modem GSM (ou GPRS). En effet, les SMS (Short Message Service) sont de plus en plus utilisés pour assurer une communication simple et rapide. A l’heure actuelle, ils peuvent être expédiés depuis un téléphone GSM, un système, un réseau informatique ou par internet. Notre projet s’inscrit donc dans la mouvance actuelle des appareils et technologies mobiles, comme les Pocket PC, appareil en pleine expansion. Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM SOMMAIRE 1 INTRODUCTION........................................................................................................................................................3 2 FONCTIONNALITES DE L’APPLICATION ....................................................................................................4 3 ETUDE DES METHODES DE DEVELOPPEMENT EXIS TANTES ..........................................................4 3.1 3.2 4 LE PROTOCOLE SMS ............................................................................................................................................ 4 LES METHODES POSSIBLES DE PROGRAMMATION ............................................................................................ 6 MAQUETTAGE, TEST ET VALIDATION :....................................................................................................10 4.1 4.1.1 4.1.2 4.1.3 4.1.4 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.3 4.3.1 4.3.2 4.3.3 4.3.4 4.4 ECRITURE /LECTURE SUR LE PORT SERIE ......................................................................................................... 10 Objectif ...........................................................................................................................................................10 Plate-forme de Test.......................................................................................................................................10 Tests pratiqués...............................................................................................................................................10 Résultats.........................................................................................................................................................11 ENCODAGE D’UN SMS....................................................................................................................................... 12 Objectif ...........................................................................................................................................................12 Plate-forme de Test.......................................................................................................................................12 Tests pratiqués...............................................................................................................................................12 Résultats.........................................................................................................................................................13 INTERFACE GRAPHIQUE...................................................................................................................................... 14 Objectif ...........................................................................................................................................................14 Plate-forme de Test.......................................................................................................................................14 Description de l’interface............................................................................................................................14 Evolutions.......................................................................................................................................................16 CONCLUSIONS SUR LES TESTS........................................................................................................................... 17 5 CONCLUSION............................................................................................................................................................19 6 BIBLIOGRAPHIE.....................................................................................................................................................20 6.1 6.2 SITE W EB :........................................................................................................................................................... 20 DOCUMENTATION............................................................................................................................................... 20 ANNEXES ANNEXE 1 : LE PROTOCOLE SMS .............................................................................................................................21 ANNEXE 2 : 7 BIT DEFAULT ALPHABET................................................................................................................30 ANNEXE 3 : TRIUM MONDO.........................................................................................................................................34 ANNEXE 4 : GESTION DU PORT SERIE POUR POCKET PC ET WINDOWS CE....................................35 Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 2 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 1 Introduction A l’heure actuelle, les Pocket PC proposent les applications standards suivantes : - une boîte de réception pour lire, écrire et envoyer des messages électroniques comme vous pourriez le faire sur un PC normal. - un calendrier qui permet de gérer un planning et des rendez- vous. - un gestionnaire de contacts. - un bloc-note. - un gestionnaire de tâches. - Pocket Internet explorer. - Pocket Word. - Pocket Excel. - Microsoft Reader qui permet d’accéder à une bibliothèques de livres. - un lecteur Windows Media Player pour écouter de la musique. A cet ensemble de fonctions disponibles, nous nous proposons d’ajouter ou du moins d’étudier la possibilité d’ajouter une application permettant l’envoi et la réception de SMS. Nous allons dans un premier temps présenter les fonctionnalités de notre application puis nous parlerons des normes existantes que nous avons étudiés ainsi que des méthodes de développement possibles. Dans une autre partie, nous montrerons les tests effectués avec notre maquette et pour finir, nous établirons des conc lusions quant à la réalisation réelle d’une telle application. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 3 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 2 Fonctionnalités de l’application L’objectif de notre application est de permettre l’envoi et la réception de messages SMS sur un IPAQ Pocket PC grâce à une carte GSM. Les fonctionnalités principales sont donc : - l’écriture d’un message - l’envoi d’un message à une adresse demandée par l’utilisateur - la réception d’un message - la lecture du message reçu Pour un confort d’utilisation, nous proposons d’ajouter une gestion d’un répertoire téléphonique qui associe un numéro de téléphone à un nom défini par l’utilisateur. Il existe différentes méthodes pour développer ces fonctionnalités. Nous allons maintenant les présenter et montrer comment nous les avons utilisées. 3 Etude des méthodes de développement existantes Nous avons dans un premier temps effectué des recherches concernant le protocole normalisé SMS. Nous nous sommes ensuite intéressés au différents méthodes de programmation possibles. 3.1 Le protocole SMS Le protocole SMS a été spécifié par l’organisation ETSI (European Telecommunications Standards Institute) dans les documents GSM 03.40 et GSM 03.38. Le SMS est un protocole appelé protocole sans connexion car, lors de l’acheminement d’un message, aucune connexion n’est établie entre le terminal qui envoie et celui qui reçoit. Il existe deux méthodes pour envoyer et recevoir des messages SMS, en mode texte ou en mode PDU (Protocol Data Unit). Le mode texte est juste un codage de l’ensemble des bits représentés par le mode PDU. Ces codages diffèrent selon les téléphones. Il est donc préférable d’utiliser le mode PDU. Les PDU contiennent non seulement les messages mais aussi un ensemble de métainformations à propos de l’émetteur, de son centre de message, etc. L’envoi d’un SMS s’effectue en deux phases : - l’acheminement du message depuis le terminal émetteur vers une entité particulière appelé SMSC (Short Message Service Center) - l’acheminement du message depuis le SMSC jusqu’au terminal récepteur. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 4 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM Chacune de ces deux phases correspond à une unité de donnée du protocole (PDU). Il existe en fait 6 types de PDU : Type PDU Direction Fonction SMS-Deliver SMSC => Terminal Envoie un bref message SMS-DELIVER-REPORT Terminal => SMSC Envoie le motif de la non réception du message SMS-SUBMIT Terminal => SMSC Envoie un message bref SMS-SUBMIT-REPORT SMSC => Terminal Envoie le motif de la non réception du message SMS-STATUS-REPORT SMSC => Terminal Envoie l'indication de l'état d'un message SMS-COMMAND Terminal => SMSC Envoie un ordre La tache principale de SMS-DELIVER et de SMS-SUBMIT est celle de transmettre, aux entités SMS, le contenu du message et les informations relatives au terminal GSM et au SMSC. La structure de celles-ci est décrite en annexe. Les PDU SMS-DELIVER-REPORT et SMS-SUBMIT-REPORT notifient aux entités SMS que le message reçu n'est pas correct et qu'il faut effectuer une retransmission. La PDU SMS-STATUS-REPORT contient des informations sur l'état du message: s'il a été transmis ou non par l'entité réceptrice, et quand il a été transmis. La PDU SMS-COMMAND contient les ordres qui doivent être associés à un message déjà acheminé à travers le SMS-SUBMIT. Un message est constitué d’au maximum 160 caractères où chaque caractère est codé sur 7 bits en accord avec le 7-bit default alphabet décrit en annexe. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 5 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 3.2 Les méthodes possibles de programmation Après avoir trouvé les renseignements concernant le protocole SMS, nous nous sommes intéressés aux méthodes de programmation possibles. Les différentes techniques disponibles sont les suivantes: Ø Utiliser l’API SMS de Pocket PC 2002. En effet, la nouvelle version de Pocket PC, la version 2002, fournit en natif une API permettant la gestion des SMS. Voici les différentes fonctions qu’elle propose . Function SmsClearMessageNotification SmsClose SmsGetBroadcastMsgRanges Description Cancels registration for SMS notifications. Closes an existing SMS Messaging handle. Gets the range of broadcast messages the mobile will listen for. SmsGetMessageSize Determines an upper-bound for the size of the buffer. SmsGetMessageStatus Retrieves a status report for a sent message. SmsGetSMSC Reads the default Short Message Service Center (SMSC) address. SmsGetPhoneNumber Gets the phone number of the device associated with the SMS bearer. SmsGetTime Gets an estimate of the current time approximated by the SMSC's clock. SmsOpen Opens the SMS Messaging component for send and/or receive access. SmsReadMessage Reads a previously received SMS message. SmsSendMessage Sends an SMS message. SmsSetBroadcastMsgRanges Sets the broadcast message range the mobile will listen for. SmsSetMessageNotification Starts your application when an SMS message arrives. SmsSetSMSC Sets the default SMSC. Pour utiliser cette API, un SDK est disponible chez Microsoft à l’adresse suivante : http://www.microsoft.com/mobile/developer/downloads/ppcsdk2002.asp. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 6 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM Ø Envoyer par le port IRDA du terminal à un téléphone mobile. C’est ensuite le téléphone mobile qui se charge d’envoyer le SMS. Voici le schéma d’une telle architecture : Réseau GSM Téléphone cellulaire Communication IRDA Un logiciel existe utilisant cette méthode pour envoyer des SMS. Il s’agit de Visual IT Simple SMS V2.0 dont la présentation est à l’adresse suivante : http://www.mobilemag.ch/news/article.asp?articleid=1289) et dont une démo est téléchargeable à l’adresse : http://www.visualit.co.uk/simplesms.htm Ø Envoyer par l’intermédiaire de Pocket Outlook et du port IRDA du terminal et d’un téléphone mobile. En effet, SMS extension est une application intégrée dans Pocket Outlook qui vous permet d'envoyer des SMS avec un téléphone équipé d'un port infrarouge IRDA. On peut aussi envoyer des SMS d'alerte, recevoir des compte-rendus de réception et gérer simplement la base de donnée des contacts. SMS extension est un freeware et la version finale sera disponible très prochaine ment. Vous pouvez télécharger ce programme sur PocketGear.com à l’adresse suivante : http://www.pocketgear.com/software_detail.asp?id=2814&associateid=13 Ø Réaliser une communication directe avec le port série sur lequel se trouve le modem GPS. Une technique simple est de pouvoir dialoguer directement avec le modem GSM à l’aide de commande AT. Le jeu le plus courant de commandes textuelles est appelé le jeu AT ou encore Hayes , du nom de l'entreprise ayant commercialisé les premiers modems dits intelligents. Le jeu se compose de commandes simples préfixées par AT. Chaque commande doit se terminer par le caractère de fin de ligne retour chariot (0D en hexadécimal). Les commandes peuvent être envoyées en minuscule ou en majuscule. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 7 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM Dans le cadre de notre projet, les techniques suivantes ont du être abandonnées : Ø Utilisation de l’API SMS de Pocket PC 2002. En effet, nous disposions d’un Trium Mondo pour développer et celui-ci n’a pas la version 2002 de Pocket PC. Ø Utilisation du port IRDA du terminal avec un téléphone mobile. En effet, nous n’avons pas à notre disposition de téléphone possédant un port IRDA. Ø Utilisation de Pocket Outlook et du port IRDA du terminal. En effet, il nous a été déconseillé d’utiliser cette méthode. Nous nous sommes donc dirigés vers la dernière solution qui consiste à utiliser le port série sur lequel est connecté le modem GSM. En effet, le Trium Mondo possède un modem GSM intégré connecté sur le port COM6. Il faut noter que cette méthode est indépendante du terminal utilisé et peut donc être réutilisée pour un Ipaq. Après avoir décidé d’utiliser cette méthode, nous avons défini l’architecture de l’application pour l’envoi d’un SMS de la façon suivante : Paramètres du port Message Date de validité Encodeur de SMS Numéro du destinataire Trame SMS Port Série Modem GSM Réseau GSM Envoi d’un SMS par modem GSM Les composants «Message », « Date de validité » et « Numéro du destinataire » sont des éléments qui doivent être saisis par l’utilisateur à travers l’interface graphique. L’encodeur de SMS est un composant qui encode une trame SMS envoyée par la suite sur le modem. La trame ainsi constituée est ensuite écrite à l’aide de commandes AT sur le port série connecté au modem GSM. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 8 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM En ce qui concerne la réception d’un SMS, l’architecture est la suivante : Message Paramètres du port Réseau GSM Modem GSM Port Série Trame SMS Réception d’un SMS par modem GSM Décodeur de SMS Numéro de l’émetteur La trame SMS est reçue sur le modem GSM qui la transmet par le port série à l’application. Elle est ensuite décodée pour récupérer les informations du message, le message texte ainsi que le numéro de l’émetteur. Celles-ci sont ensuite fournies à l’utilisateur grâce à l’interface graphique. Par manque de temps, nous n’avons pu développer le décodage d’un message. Par contre, la lecture/écriture sur le port et l’encodage d’un message ont été réalisé et testé. Nous allons maintenant présenter les tests effectués et les conclusions obtenues. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 9 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 4 Maquettage, Test et Validation : 4.1 Ecriture/Lecture sur le port série 4.1.1 Objectif L’objectif de ce test est d’écrire et lire des données sur le port série du Trium Mondo, afin de pouvoir dialoguer avec le modem GSM interne. 4.1.2 Plate-forme de Test • • • • • Développement d’une application eMbedded Visual C++ 3.0. ActiveSync 3.5 FR sur port série. Trium Mondo connecté à la plate- forme de développement. Remote registry editor de Visual c++ 3.0 pour avoir accès à la base de registre et tout particulièrement la clef indiquant le port de communication du modem. Remote process viewer d e Visual c++ 3.0 pour visualiser les différents processus tournant sur le Trium. Le prototype permettant de faire ce test se trouve dans le répertoire : Src/TryPort2 4.1.3 Tests pratiqués L’application de test développée permet donc d’envoyer une chaîne de caractère sur le port série (COM6 :). Cette chaîne doit être saisie dans la zone «Emit » et doit être une commande AT. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 10 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM Nous avons utilisé les commandes AT suivantes : - ATZ : correspondant à un reset du modem, la réponse doit être la chaîne "OK" - ATI0 : demande d’informations sur le modem, la réponse doit être le numéro d’identification du fabricant. Les étapes lors de l’appui sur le bouton send sont les suivantes : • Ouverture d’un handle sur le port COM6 : • Configuration du port série : o vitesse = 9600 bauds o parité présente ou non o bit de stop présent ou non o taille de l’octet 8 ou 7 bits • Configuration du timeout en lecture et en écriture • Ecriture de la chaîne de caractères • Lecture de la réponse avec timeout • Affichage du résultat dans la zone « Receive » • Libération du handle 4.1.4 Résultats L’ouverture du port se déroule normalement, la configuration aussi et l’écriture ne pose pas de problèmes. Malheureusement, après de nombreuses tentatives, avec des configurations différentes, nous n’avons pas réussi à lire une réponse émise par le modem. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 11 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 4.2 Encodage d’un SMS 4.2.1 Objectif L’objectif de ce test est de produire une trame SMS correspondant au message que l’on désire envoyer. 4.2.2 Plate-forme de Test • • • • Développement d’une application eMbedded Visual C++ 3.0. ActiveSync 3.5 FR sur port série. Trium Mondo connecté à la plate- forme de développement. PDUSpy qui permet de décoder une trame SMS et d’afficher les différentes informations contenues Le prototype permettant de faire ce test se trouve dans le répertoire : Src/smsCodereMb 4.2.3 Tests pratiqués Le test consiste à renseigner les différents champs de l’interface, puis en utilisant PDUSpy, de retrouver ces données dans l’onglet de décodage. L’encodage est réalisé par une classe en C++ (SMS_SUBMIT) disponible dans les sources. NO SMSC ADDRESS PRESENT MESSAGE HEADER FLAGS (0x11) MESSAGE TYPE : SMS SUBMIT REJECT DUPLICATES : NO VALIDITY PERIOD : RELATIVE REPLY PATH : NOT SET USER DATA HEADER : NO UDH REQ. STATUS REPORT : NO MSG REFERENCE NR. : 0 (0x00) RECIPIENTS ADDRESS NUMBER IS : +0615652185 TYPE OF NR. (0x10) : INTERNATIONAL NPI (0x01) : ISDN/TELEPHONE (E.164/E.163) PROTOCOL IDENTIFIER (0x00) MESSAGE ENTITIES : SME-to-SME PROTOCOL USED : implicit DATA CODING SCHEME COMPRESSION MESSAGE CLASS ALPHABET USED (0x00) : OFF : NONE : 7bit default VALIDITY OF MESSAGE : 15,0 hrs USER DATA PART OF SM USER DATA LENGTH : 10 septets USER DATA (TEXT) : HelloHello Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 12 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 4.2.4 Résultats Récapitulatif des différents tests : Data Phone Number Validity Résultat HelloHello 0615652185 15 hours OK HelloHello 0615652185 OK 0615652185 15 hours OK 0615652185 OK HelloHello 15 hours OK HelloHello OK 15 hours OK OK HelloHello@ * * Invalide * toutes les valeurs possibles, - aucune valeur Si les données du message à encoder contient des caractères autres que l’alphanumérique le codage n’est pas correcte, car selon la spécification il faudrait utiliser une table de conversion. (http://www.dreamfabric.com/sms/default_alphabet.html). Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 13 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 4.3 Interface graphique 4.3.1 Objectif Cette maquette est un exemple d’application qui pourrait être développée pour les Pocket PC. Cet outil permet d’envoyer des SMS, de gérer un carnet de numéros de téléphones, de manière simple et intuitive. 4.3.2 Plate-forme de Test • • • Développement d’une application eMbedded Visual C++ 3.0. ActiveSync 3.5 FR sur port série. Trium Mondo connecté à la plate- forme de développement. Le prototype permettant de faire ce test se trouve dans le répertoire : Src/sendSMS 4.3.3 Description de l’interface Le logiciel contient trois zones distinctes : - une zone dans laquelle on peut entrer un numéro de téléphone, - une zone contenant la liste des contacts, - une zone dans laquelle on écrit le message à envoyer. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 14 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM Il est possible d’ajouter un numéro de téléphone dans la liste des contacts en appuyant sur le bouton ajouter. Il suffit alors de donner un nom au contact, qui sera associé à ce numéro de téléphone. Lorsqu’un numéro se trouve dans la liste des contacts, il suffit de le sélectionner (identifié par le nom de son propriétaire) dans la liste déroulante du « carnet d’adresses ». Lorsqu’on écrit un numéro qui fait parti du carnet d’adresses, celui-ci s’affiche automatiquement. Le contenu du SMS est limité à 160 caractères. Une zone de texte indique le nombre de caractères restant à écrire avant d’atteindre cette limite. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 15 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 4.3.4 Evolutions Ø Evolutions impératives : Dans sa version définitive, l’application devra intégrer la gestion du modem GSM et la configuration de celui-ci. Ø Evolutions facultatives : La version définitive pourrait lier son carnet d’adresses à celui contenu dans Outlook. Elle pourrait gérer automatiquement le découpage de longs messages en plusieurs fragments. Elle pourrait importer le carnet d’adresses inclus dans la carte SIM. Elle pourrait intégrer l’envoi d’images liées au message. Elle pourrait stocker les messages envoyés, afin de pouvoir les visualiser ultérieurement. Elle pourrait envoyer un même message à une liste de contacts. Elle pourrait permettre de recevoir des SMS. Elle pourrait permettre de faire du chat par SMS avec d’autres personnes utilisant le même programme. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 16 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 4.4 Conclusions sur les tests A la suite des tests, nous avons conclu sur différents problèmes technologiques qu’il faudrait résoudre pour envisager une version finale du produit. Pour corriger le problème du port série, il faudrait monter un projet de recherche sur les modems GSM afin de connaître précisément les commandes AT normalisées. La réalisation de cette application en version finale impliquerait une décomposition en tâches suivantes : Ø Gestion du modem : Travail à effectuer : Initialisation du modem, configuration du modem, lecture, écriture et attente de données. Matériel nécessaire : Un modem GSM, une station de développement avec Visual Embedded Tools et un PDA Coût : Prix du PDA (~700 Euros), prix du modem GSM compatible avec le PDA (~550 Euros) Temps de travail : Difficile à évaluer car dépend de la disponibilité de la documentation technique du modem GSM. En moyenne, 1 mois et demi pour une personne. Ø Encodage d‘une trame SMS : Travail à effectuer : Encodage de toutes les trames du protocole SMS (envoi d’un message, acquittement, erreur). Matériel nécessaire : Une station de développement avec Visual Embedded Tools. Coût : Aucun. Temps de travail : 2 mois pour une personne. Ø Décodage d‘une trame SMS : Travail à effectuer : Décodage de toutes les trames du protocole SMS (réception d’un message, acquittement, erreur). Matériel nécessaire : Une station de développement avec Visual Embedded Tools. Coût : Aucun. Temps de travail : 2 mois pour une personne. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 17 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM Ø Réalisation de l’interface graphique : Travail à effectuer : Réaliser une interface agréable, conviviale, facile d’utilisation et adaptée au PDA. Matériel nécessaire : Une station de développement avec Visual Embedded Tools, un émulateur Pocket PC pour tester localement et un PDA pour une étude ergonomique. Coût : Prix du PDA (~700 Euros). Temps de travail : 3 semaines pour une personne. Ø Intégration et validation : Travail à effectuer : Assembler les différents éléments, tester et valider. Matériel nécessaire : Tout le matériel nécessaire à chacune des tâches. Coût : Aucun supplémentaire. Temps de travail : 3 semaines pour une personne. Voici donc un récapitulatif pour la réalisation d’un produit final : Tâche Coût en Euros Temps de travail Nombre de personnes en semaines Gestion du modem 1250 5 1 Encodage des trames 0 8 1 Décodage des trames 0 8 1 Interface Graphique 0 3 1 Intégration 0 3 1 Total 1250 27 5 Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 18 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 5 Conclusion Nous avons atteint l’objectif initial qui était la compréhension et l’étude de l’envoi de SMS depuis un Pocket PC à l’aide d’un modem GSM. Les résultats de cette étude pourront être réutilisés dans un projet futur. Ce projet nous a permis d’effectuer des recherches sur un sujet qui ne possède pas beaucoup de documentation, et d’apporter notre contribution au développement des nouvelles technologies. L’application que nous avons développée permettra de remplir sa mission dès que nous aurons à notre disposition un modem GSM fonctionnel et une carte SIM permettant d’envoyer des SMS gratuitement. Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 19 sur 40 Nicolas BESSON – Emilie COUSIN – Nicolas MARTIN – Christophe PARIS ESSI3 - STREAM 6 Bibliographie 6.1 Site Web : Trium http://www.mitsubishi-telecom.com Site du fabricant du Mondo. Informations techniques sur l’appareil (orienté sur la vente du produit). ETSI http://www.etsi.org/ Description des standards dans les télécoms Advanced Wireless Planet http://www.gsm- modem.de/sms-pdu- mode.html Détail sur les différents formats de SMS DreamFabric http://www.dreamfabric.com/sms/ Décodage d’une trame SMS en émission et en réception sur un téléphone mobile. Nobbi http://www.nobbi.com Site des créateurs de PDUSpy, qui permet de décoder les différentes trames SMS. SendMyStuff http://www.aspekt1.net/ms/sms SendMyStuff est un outils permettant la création d’un message SMS-SUBMIT. GsmLib http://www.pxh.de/fs/gsmlib Librairie de gestion de modem GSM et de création de messages SMS sous Win32 et Linux. SmartSMS http://www.smartsms.ch/ Outils pour envoyer des SMS payant depuis un PC tournant sous Windows. 6.2 Documentation Spécification ETSI : 03.40 Référence: TS/SMG-040340QR2 Technical realization of the Short Message Service (SMS). Systèmes embarqués - Projet envoi d’un SMS sous Pocket PC Page 20 sur 40 Annexe 1 : le protocole SMS 1 Trame SMS-SUBMIT Voici les éléments de base de la trame SMS-SUBMIT : Représentation 2 octets 1 octet Integer 2-12 octets 1 octet Integer 1-7 octets Integer (dépend du TP-DCS) Description Length of SMSC information First octet of the PDU TP-MR TP-DA TP-PID TP-DCS TP-VP TP-UDL TP-UD 1.1 Length of SMSC information Ce champ représente la longueur des informations concernant le centre de messages SMS. Cet octet est optionnel. S’il est présent et qu’il a une valeur égale à 0 ou s’il est émis, cela signifie que les informations stockées dans le téléphone concernant le SMSC seront utilisées. 1.2 First octet of the PDU Le premier octet de la trame a la forme suivante: Bit n° 7 Nom TP-RP 6 TP-UDHI 5 TP-SRR 4 TP-VPF 3 TP-VPF 2 TP-RD 1 TP-MTI 0 TP-MTI 1.2.1 TP-MTI Ce champ est le “Message Type Indicator”, il renseigne sur le type de message. Dans le cas du SMS-SUBMIT, le bit n°1 et 0 ont respectivement les valeurs 0 et 1. Les différentes valeurs possibles sont les suivantes : Bit n°1 0 0 1 1 0 0 Bit n°0 0 0 0 0 1 1 Description Sens SMS-DELIVER SMS-DELIVER-REPORT SMS-STATUS-REPORT SMS-COMMAND SMS-SUBMIT SMS-SUBMIT-REPORT SC -> MS MS -> SC SC -> MS MS -> SC MS -> SC SC -> MS 1.2.2 TP-RD Ce champ est le « Reject Duplicates », il indique si un message identique à un message déjà reçu et stocké par le centre de messages doit être rejeté ou accepté. 1.2.3 TP-VPF Ce champ est le « Validity Period Format », il définit la présence et le format de la période de validité du message. Les différentes valeurs sont les suivantes : Bit n°4 Bit n°3 0 0 1 0 0 1 1 1 Description Le champ TP-VP est absent Le champ TP-VP est présent au format relatif sur 1 octet (représentation avec un entier) Réservé Le champ TP-VP est présent au format absolu sur 7 octets (représentation avec un semi-octet) 1.2.4 TP-SRR Ce champ est le « Status Report Request », il indique si le message nécessite un acknowledge ou non. Le bit est placé à 1 s’il est demandé. 1.2.5 TP-UDHI Ce champ est le « User Data Header Indicator », il indique si le champ TP-UD comporte une entête. Le bit est placé à 1 si oui. 1.2.6 TP-RP Ce champ est le « Reply Path », il indique si un répertoire de réponse existe ou non. Le bit est placé à 1 si oui. 1.2.7 Exemple Si le premier octet a une valeur de 11 en hexadécimal, cela signifie la chose suivante : Bit n° Nom 7 0 6 0 5 0 4 1 3 0 2 0 1 0 0 1 Il s’agit donc d’un message de type SMS-SUBMIT qui sera accepté même si un message identique existe dans le SMSC. Le champ TP-VP sera présent et aura un format relatif. Aucun acknowledge n’est demandé, le champ TP-UD ne contient pas d’entête et il n’existe pas de répertoire de réponse. 1.3 TP-MR Ce champ est le « Message Reference », il s’agit d’un identifiant du message. Si sa valeur est 00, cela signifie que le téléphone aura libre choix pour cet identifiant de message. 1.4 TP-DA Ce champ est « Destination Address », il précise les informations concernant l’adresse du destinataire du message. Il se décompose de la façon suivante : Représentation Integer 1 octet Length Semi-Octets Description Address Length Type of Address Address Value Taille Octets 1 1 x 1.4.1 Address Length Ce champ indique la longueur de l’adresse en nombre de semi-octets (1octet=2semioctets), c’est un entier. 1.4.2 Type of Address Ce champ indique le format de l’adresse (du numéro de téléphone). Il se décompose de la façon suivante : Bit n° Nom 7 Toujours à 1 6 5 4 Type-of-number 3 2 1 0 Numbering Pla n Identification Ø Type of number Ce champ représente le type de l’adresse.Voici les différentes valeurs possibles de ce champ: Bit n°6 0 0 0 0 1 1 1 1 Bit n°5 0 0 1 1 0 0 1 1 Bit n°4 0 1 0 1 0 1 0 1 Description Type inconnu Numéro international. Numéro national. Numéro spécifique d’ un réseau. Subscriber number. Alphanumérique Abréviation Réservé Ø Numbering Plan Identification Ce champ n’est valable que pour un « type- number » égal à 000 ou 001 ou 010. Pour les autres valeurs de « type of number », il doit être transmis avec la valeur 0000. Les valeurs possibles dans le cas où il est valable sont : Bit n°3 0 0 0 0 1 1 1 1 Bit n°2 0 0 0 1 0 0 0 1 Bit n°1 0 0 1 0 0 0 1 1 Bit n°0 0 1 1 0 0 1 0 1 Description Inconnu ISDN/telephone numbering plan (E.164/E.163). Data numbering plan (X.121). Telex numbering plan National numbering plan. Private numbering plan ERMES numbering plan (ETSI DE/PS 3 01-3) Réservé Ø Exemple Un type d’adresse égal à 91 en hexadécimal signifie qu’il s’agit d’un numé ro de téléphone international. Bit n° 7 Valeur 1 6 0 5 0 4 1 3 0 2 0 1 0 0 1 1.4.3 Address value Ce champ contient l’adresse. Elle est encodée de la façon suivante : les chiffres sont inversés deux à deux. Par exemple le numéro suivant : 06 65 45 51 27 est codé par la valeur hexadécimal 60 56 54 15 72. 1.5 TP-PID Ce champ est le “Protocol Identifier”, il s’agit d’un octet utilisé de la façon suivante: Ø Le «MS» interprètera des valeurs réservées ou inconnues de ce champ comme une valeur 00000000. Ø Le « SC » refusera les messages contenant une valeur réservée ou inconnue pour ce champ. 1.6 TP-DCS Ce champ est le “Data Coding System”,il indique quel codage est utilisé pour le message. Dans notre cas, nous utiliserons la valeur 00 qui signifie un codage sur 7 bits. Pour information, la valeur 02 signifie un codage sur 8 bits. 1.7 TP-VP Ce champ est le « Validity Period », il donne le temps au bout duquel le message expire. Ø Pour un format relatif Il s’agit d’un Integer donnant la longueur de la période depuis le moment où le message a été reçu par le centre de messages. Valeur du champ 0 to 143 144 to 167 168 to 196 197 to 255 Valeur de la période (TP-VP + 1) * 5 min (i.e. des intervalles de 5 min jusqu’à 12 h) 12 hr + ((TP-VP - 143) * 30 min) (TP-VP - 166) * 1 jour (TP-VP - 192) * 1 semaine Ø Pour un format absolu Il est donné sur 7 octets contenant le champ « TP-SCTS » qui précise le format utilisé. 1.8 TP-UDL Ce champ est le « User Data Length », il indique la longueur du message selon le codage du message. Par exe mple, pour un codage sur 7 bits, la longueur donnera le nombre de septets (données codés sur 7 bits) 1.9 TP-UD Ce champ est le « User Data », il contient le message à envoyer. Sa longueur maximale est de 140 octets. Il contient soit le message seul, soit une entête suivi du message. 1.10 Exemple de trame 00 11 00 0B 91 6407281553F8 00 00 AA 0A E8329BFD4697D9EC37 Cette trame correspond à l’envoi du message « hellohello » au numéro de téléphone « 0708251358 ». 2 Trame SMS-DELIVER Voici les éléments de base de la trame SMS-DELIVER : Représentation 2 octets 2-12octets 1 octet 2-12 octets 1 octet Integer 1-7 octets Integer (dépend du TP-DCS) Description Length of SMSC information TP-DA First octet of the PDU TP-OA TP-PID TP-DCS TP-SCTS TP-UDL TP-UD 2.1 Length of SMSC information Ce champ représente la longueur des informations concernant le centre de messages SMS. Elle comprend la longueur du type d’adresse et de l’adresse elle- même. 2.2 TP-DA Ce champ est « Destination Address », il précise les informations concernant l’adresse du centre de message destinataire. Il se décompose de la façon suivante : Représentation Description 1 octet Type of Address n Semi-Octets Address Value 2.2.1 Type of Address Ce champ indique le format de l’adresse (du numéro de téléphone). Il a la même forme que le champ de même nom vu précédemment. 2.2.2 Address value Ce champ contient l’adresse. Elle est encodée de la façon suivante : les chiffres sont inversés deux à deux. Par exemple le numéro suivant : 06 65 45 51 27 est codé par la valeur hexadécimal 60 56 54 15 72. 2.3 First octet of the PDU Le premier octet de la trame a la forme suivante: Bit n° 7 Nom TP-RP 6 TP-UDHI 5 TP-SRI 4 unused 3 unused 2 1 TP-MMS TP-MTI 0 TP-MTI 2.3.1 TP-MTI Ce champ est le “Message Type Indicator”, il renseigne sur le type de message. Dans le cas du SMS-DELIVER, le bit n°1 et 0 ont respectivement les valeurs 0 et 0. Les différentes valeurs possibles sont les suivantes : Bit n°1 0 0 1 1 0 0 Bit n°0 0 0 0 0 1 1 Description Sens SMS-DELIVER SMS-DELIVER-REPORT SMS-STATUS-REPORT SMS-COMMAND SMS-SUBMIT SMS-SUBMIT-REPORT SC -> MS MS -> SC SC -> MS MS -> SC MS -> SC SC -> MS 2.3.2 TP-MMS Ce champ est le «More Message to Send », il indique s’il y a d’autres messages en attente pour le même destinataire. Ce champ est à 1 s’il y a des messages en attente et 0 sinon. 2.3.3 TP-SRI Ce champ est le «Status Report Indication », il indique si le message nécessite un rapport d’exécution ou non. Le bit est placé à 1 s’il est demandé et à 0 sinon. 2.3.4 TP-UDHI Ce champ est le « User Data Header Indicator », il indique si le champ TP-UD comporte une entête. Le bit est placé à 1 si oui. 2.3.5 TP-RP Ce champ est le « Reply Path », il indique si un répertoire de réponse existe ou non. Le bit est placé à 1 si oui. 2.3.6 Exemple Si le premier octet a une valeur de 4 en hexadécimal, cela signifie la chose suivante : Bit n° Nom 7 0 6 0 5 0 4 0 3 0 2 1 1 0 0 0 Il s’agit donc d’un message de type SMS-DELIVER. Aucun acknowledge n’est demandé, il indique qu’il n’y a qu’un message à recevoir et qu’il n’existe pas de répertoire de réponse. 2.4 TP-OA Ce champ est « Originating Address », il précise les informations concernant l’adresse du destinataire du message. Il se décompose de la même façon que le champ TP-DA de la trame SMS-SUBMIT 2.5 TP-PID Ce champ est le “Protocol Identifier”, il s’agit d’un octet utilisé de la façon suivante: Ø Le «MS» interprètera des valeurs réservées ou inconnues de ce champ comme une valeur 00000000. Ø Le « SC » refusera les messages contenant une valeur réservée ou inconnue pour ce champ. 2.6 TP-DCS Ce champ est le “Data Coding System”,il indique quel codage est utilisé pour le message. Dans notre cas, nous utiliserons la valeur 00 qui signifie un codage sur 7 bits. Pour information, la valeur 02 signifie un codage sur 8 bits. 2.7 TP-SCTS Ce champ est le « Service Centre Time Stamp », il donne le temps local. Il est donné par des semi-octets dont la signification est la suivante : Year Nbre de Semi-octets 2 Month 2 Day 2 Hour 2 Minute 2 Second 2 TimeZone 2 De plus, chaque semi-octet est codé par inversion. Voici un exemple : Le 12 février (02) 1999 à 5h 57min 30s dans la zone locale GMT+3 sera codé : 0x99 0x20 0x21 0x50 0x75 0x03 0x21 2.8 TP-UDL Ce champ est le « User Data Length », il indique la longueur du message selon le codage du message. Par exemple, pour un codage sur 7 bits, la longueur donnera le nombre de septets (données codés sur 7 bits) 2.9 TP-UD Ce champ est le « User Data », il contient le message à envoyer. Sa longueur maximale est de 140 octets. Il contient soit le message seul, soit une entête suivi du message. 2.10 Exemple de trame 07 91 04 0B 72 83 01 00 10 F5 C8 72 38 88 09 00 F1 00 00 99 30 92 51 61 95 80 0A E8329BFD4697D9EC37 Cette trame correspond à la réception du message « hellohello » venant du numéro de téléphone « 0708251358 ». Annexe 2 : 7 bit default alphabet This is the 7 bit default alphabet as specified by GSM 03.38. The corresponding ISO8859-1 decimal codes are shown in the rightmost column. Note that the euro sign (€) is a member of the ISO-8859-15 character set. 0x00 0x01 0 1 COMMERCIAL AT POUND SIGN @ £ ISO-8859-1 DEC 64 163 0x02 0x03 2 3 DOLLAR SIGN YEN SIGN $ ¥ 36 165 0x04 0x05 0x06 4 5 6 LATIN SMALL LETTER E WITH GRAVE LATIN SMALL LETTER E WITH ACUTE LATIN SMALL LETTER U WITH GRAVE è é ú 232 233 250 0x07 0x08 7 8 LATIN SMALL LETTER I WITH GRAVE LATIN SMALL LETTER O WITH GRAVE ì ò 236 242 0x09 9 Ç 199 0x0A 10 0x0B 11 0x0C 0x0D 12 13 0x0E 14 0x0F 15 0x10 0x11 Hex Dec Character name LATIN CAPITAL LETTER C WITH CEDILLA LINE FEED LATIN CAPITAL LETTER O WITH STROKE Character 10 Ø 216 ø 248 13 Å 197 å 229 16 17 LATIN SMALL LETTER O WITH STROKE CARRIAGE RETURN LATIN CAPITAL LETTER A WITH RING ABOVE LATIN SMALL LETTER A WITH RING ABOVE GREEK CAPITAL LETTER DELTA LOW LINE ? _ 95 0x12 0x13 18 19 GREEK CAPITAL LETTER PHI GREEK CAPITAL LETTER GAMMA F G 0x14 0x15 0x16 20 21 22 GREEK CAPITAL LETTER LAMBDA GREEK CAPITAL LETTER OMEGA GREEK CAPITAL LETTER PI ? O ? 0x17 0x18 23 24 GREEK CAPITAL LETTER PSI GREEK CAPITAL LETTER SIGMA ? S 0x19 0x1A 0x1B 25 26 27 GREEK CAPITAL LETTER THETA GREEK CAPITAL LETTER XI ESCAPE TO EXTENSION TABLE T ? 0x1B0A 27 10 FORM FEED 12 0x1B14 27 20 CIRCUMFLEX ACCENT 0x1B28 27 40 LEFT CURLY BRACKET 0x1B29 27 41 RIGHT CURLY BRACKET ^ { } 94 123 125 0x1B2F 27 47 REVERSE SOLIDUS (BACKSLASH) 0x1B3C 27 60 LEFT SQUARE BRACKET \ [ 92 91 0x1B3D 27 61 TILDE 0x1B3E 27 62 RIGHT SQUARE BRACKET 0x1B40 27 64 VERTICAL BAR ~ ] | 126 93 124 € 164 (ISO-885915) 0x1B65 27 101 EURO SIGN 0x1C 0x1D 0x1E 28 29 30 LATIN CAPITAL LETTER AE Æ LATIN SMALL LETTER AE æ LATIN SMALL LETTER SHARP S (German) ß 198 230 223 0x1F 0x20 31 32 LATIN CAPITAL LETTER E WITH ACUTE Ê SPACE 202 32 0x21 0x22 0x23 33 34 35 EXCLAMATION MARK QUOTATION MARK NUMBER SIGN ! " # 33 34 35 0x24 36 CURRENCY SIGN ¤ 164 (ISO-88591) 0x25 0x26 0x27 37 38 39 PERCENT SIGN AMPERSAND APOSTROPHE % & ' 37 38 39 0x28 0x29 40 41 LEFT PARENTHESIS RIGHT PARENTHESIS ( ) 40 41 0x2A 0x2B 0x2C 42 43 44 ASTERISK PLUS SIGN COMMA * + , 42 43 44 0x2D 0x2E 45 46 HYPHEN-MINUS FULL STOP . 45 46 0x2F 0x30 0x31 47 48 49 SOLIDUS (SLASH) DIGIT ZERO DIGIT ONE / 0 1 47 48 49 0x32 0x33 50 51 DIGIT TWO DIGIT THREE 2 3 50 51 0x34 0x35 0x36 52 53 54 DIGIT FOUR DIGIT FIVE DIGIT SIX 4 5 6 52 53 54 0x37 55 DIGIT SEVEN 7 55 0x38 0x39 0x3A 56 57 58 DIGIT EIGHT DIGIT NINE COLON 8 9 : 56 57 58 0x3B 0x3C 59 60 SEMICOLON LESS-THAN SIGN ; < 59 60 0x3D 0x3E 0x3F 61 62 63 EQUALS SIGN GREATER-THAN SIGN QUESTION MARK = > ? 61 62 63 0x40 0x41 64 65 INVERTED EXCLAMATION MARK LATIN CAPITAL LETTER A ¡ A 161 65 0x42 0x43 0x44 66 67 68 LATIN CAPITAL LETTER B LATIN CAPITAL LETTER C LATIN CAPITAL LETTER D B C D 66 67 68 0x45 0x46 69 70 LATIN CAPITAL LETTER E LATIN CAPITAL LETTER F E F 69 70 0x47 0x48 0x49 71 72 73 LATIN CAPITAL LETTER G LATIN CAPITAL LETTER H LATIN CAPITAL LETTER I G H I 71 72 73 0x4A 0x4B 74 75 LATIN CAPITAL LETTER J LATIN CAPITAL LETTER K J K 74 75 0x4C 0x4D 0x4E 76 77 78 LATIN CAPITAL LETTER L LATIN CAPITAL LETTER M LATIN CAPITAL LETTER N L M N 76 77 78 0x4F 0x50 79 80 LATIN CAPITAL LETTER O LATIN CAPITAL LETTER P O P 79 80 0x51 0x52 0x53 81 82 83 LATIN CAPITAL LETTER Q LATIN CAPITAL LETTER R LATIN CAPITAL LETTER S Q R S 81 82 83 0x54 0x55 84 85 LATIN CAPITAL LETTER T LATIN CAPITAL LETTER U T U 84 85 0x56 0x57 0x58 86 87 88 LATIN CAPITAL LETTER V LATIN CAPITAL LETTER W LATIN CAPITAL LETTER X V W X 86 87 88 0x59 0x5A 89 90 LATIN CAPITAL LETTER Y LATIN CAPITAL LETTER Z Y Z 89 90 0x5B 91 Ä 196 0x5C 92 Ö 214 LATIN CAPITAL LETTER A WITH DIAERESIS LATIN CAPITAL LETTER O WITH DIAERESIS 0x5D 93 LATIN CAPITAL LETTER N WITH TILDE LATIN CAPITAL LETTER U WITH DIAERESIS Ñ 209 0x5E 94 Ü 220 0x5F 0x60 95 96 SECTION SIGN INVERTED QUESTION MARK § ¿ 167 191 0x61 0x62 0x63 97 98 99 LATIN SMALL LETTER A LATIN SMALL LETTER B LATIN SMALL LETTER C a b c 97 98 99 0x64 0x65 100 101 LATIN SMALL LETTER D LATIN SMALL LETTER E d e 100 101 0x66 0x67 0x68 102 103 104 LATIN SMALL LETTER F LATIN SMALL LETTER G LATIN SMALL LETTER H f g h 102 103 104 0x69 0x6A 105 106 LATIN SMALL LETTER I LATIN SMALL LETTER J i j 105 106 0x6B 0x6C 0x6D 107 108 109 LATIN SMALL LETTER K LATIN SMALL LETTER L LATIN SMALL LETTER M k l m 107 108 109 0x6E 0x6F 110 111 LATIN SMALL LETTER N LATIN SMALL LETTER O n o 110 111 0x70 0x71 0x72 112 113 114 LATIN SMALL LETTER P LATIN SMALL LETTER Q LATIN SMALL LETTER R p q r 112 113 114 0x73 0x74 115 116 LATIN SMALL LETTER S LATIN SMALL LETTER T s t 115 116 0x75 0x76 0x77 117 118 119 LATIN SMALL LETTER U LATIN SMALL LETTER V LATIN SMALL LETTER W u v w 117 118 119 0x78 0x79 120 121 LATIN SMALL LETTER X LATIN SMALL LETTER Y x y 120 121 0x7A 122 z 122 0x7B 123 LATIN SMALL LETTER Z LATIN SMALL LETTER A WITH DIAERESIS ä 228 0x7C 124 ö 246 0x7D 125 ñ 241 0x7E 126 LATIN SMALL LETTER N WITH TILDE LATIN SMALL LETTER U WITH DIAERESIS ü 252 0x7F 127 LATIN SMALL LETTER A WITH GRAVE à 224 LATIN SMALL LETTER O WITH DIAERESIS Annexe 3 : TRIUM MONDO Model Height (mm) Width (mm) Depth (mm) Weight Network gprs hscsd WAP Talk time (hours) Standby (hours) Display SMS smsext Picture SMS smsemotions smschat t9 Icons Ringtones Vibrating Alarm voicedial voicectrl voicerec handsfree infrared Fax organizer calendar email html radio mp3 games Trium Mondo 139.5 84 19 200 g EGSM 900/1800 Yes No Yes upto 3 upto 100 N/A Yes No No No No No No Yes No No No Yes Yes No Yes Yes Yes Yes No No Yes Yes Annexe 4 : Gestion du port série pour Pocket PC et Windows CE Les ports séries sont l'un des modes de communication qui est souvent utilisé en industrie. Lors de projet, on doit implémenter une couche de communication pour les ports séries et régulièrement le document associé fournit par le constructeur de carte électronique est un exemple en C pour attaquer directement le HardWare de votre matériel. Or si nous disposons d'un OS tel que Windows CE, alors on va rapidement se rendre compte que ce type d'accès direct est interdit. Nous sommes obligés de passer par un driver. Ce document explique l'utilisation des fonctions API qui utilisent les fonctions des drivers de base qui seront utiles pour programmer une communication via les ports série que se soit pour Pocket PC ou Windows CE en général. 1 Comment utiliser un port série via les API ? Pour pouvoir effectuer une communication via un port série, il faut en premier lieu pouvoir l'atteindre par l'intermédiaire de l'OS. Pour effectuer cette manœuvre, on dispose d'API permettant d'obtenir un chemin entre votre application et le port série en passant successivement les couches de l'OS et des drivers associés à la gestion des ports série. La fonction CreateFile va renvoyer une instance sur le chemin d'accès qui permettra d'utiliser le port série. Il nous suffit seulement de lui passer en paramètre le nom du port que l’on souhaite utiliser. Cette fonction va par la suite récupérer dans la base de registre les informations correspondant au port de communication désigné tel que son adresse de base, etc. Une fois que nous possédons ce chemin d'accès, nous devez passer à l'étape suivant qui est la configuration du port série. Pour ce faire, il faut configurer le registre hardware du port via les fonctions GetCommState et SetCommState. Ces fonctions vont récupérer dans une structure les informations du registre pour ensuite les remettre modifiées selo n nos désirs. Une fois ces étapes finalisées, vous pouvez commencer à dialoguer. Pour envoyer un caractère sur le port série, on utilise la fonction WriteFile. Pour Recevoir un caractère sur le port série, la fonction ReadFile. Pour mettre fin à la communication, il suffit de libérer le port série en libérant l'instance créée précédemment. Pour cette manœuvre il faut utiliser la fonction CloseHandle. Explication détaillée de l'utilisation de ces fonctions ci-après. 2 Comment avoir accès au port série ? Pour avoir accès au port série, il faut créer une instance de type HANDLE qui permettra via les drivers d'activer l'utilisation d'un port. Pour ce faire, nous disposons de cette fonction : HANDLE CreateFile( LPCTSTR lpFileName, // pointer sur le nom du port à utiliser DWORD dwDesiredAccess, // mode d'accès (read-write) DWORD dwShareMode, // share mode LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes DWORD dwCreationDisposition, // Condition pour créer l'instance DWORD dwFlagsAndAttributes, // file attributes HANDLE hTemplateFile // handle to file with attributes to copy ); Exemple commenté: // Déclaration de notre instance pour accueillir l'accès au port série HANDLE hPort; //Nom du port série auquel on veut accéder LPSTR lpszPortName = _T("COM1:"); //Les deux points ( : ) sont important ils indiquent à la fonction qu'il s'agit du chemin d'une // ressource de communication. Ce chemin est connu de Windows grâce à la base de registre // de l'OS. Il n'est donc pas nécessaire de connaître l'adresse de base du port série en question //Ouverture du port série. hPort = CreateFile ( lpszPortName, //Pointer to the name of the port GENERIC_READ | GENERIC_WRITE, //accès en lecture ou en écriture 0, //Share mode NULL, //Pointer to the security attribute OPEN_EXISTING, //Cela indique que l'instance sera créée //à condition que le port de communication //demandé existe et donc est connu de l'OS 0, //Port attributes NULL); //Handle to port with attribute to copy //Vérification sur la création de l'instance if ( hPort == INVALID_HANDLE_VALUE ) { //code d'erreur } 3 Comment configurer le port série ? Pour qu'une communication entre deux appareils puisse exister, il faut qu'ils parlent le même langage. Pour ce faire, la configuration des ports série doit être identique des deux cotés. Le procédé de configuration est simple et se passe en trois temps. - Récupérer la structure de configuration du port série - Mettre à jour cette structure selon nos critères - Renvoyer la structure vers le port série Au bout de cette étape les registres de nos ports série sont prêts, nous pouvons communiquer. La structure du port série : typedef struct _DCB { DWORD DCBlength; DWORD BaudRate; DWORD fBinary: 1; DWORD fParity: 1; DWORD fOutxCtsFlow:1; DWORD fOutxDsrFlow:1; DWORD fDtrControl:2; DWORD fDsrSensitivity:1; DWORD fTXContinueOnXoff:1; DWORD fOutX: 1; DWORD fInX: 1; DWORD fErrorChar: 1; DWORD fNull: 1; DWORD fRtsControl:2; DWORD fAbortOnError:1; DWORD fDummy2:17; WORD wReserved; WORD XonLim; WORD XoffLim; BYTE ByteSize; BYTE Parity; BYTE StopBits; char XonChar; char XoffChar; char ErrorChar; char EofChar; char EvtChar; WORD wReserved1; } DCB; //dcb //sizeof(DCB) //current baud rate //binary mode, no EOF check //enable parity checking //CTS output flow control //DSR output flow control //DTR flow control type // DSR sensitivity // XOFF continues Tx //XON/XOFF out flow control //XON/XOFF in flow control //enable error replacement //enable null stripping //RTS flow control //abort reads/writes on error //reserved //not currently used //transmit XON threshold //transmit XOFF threshold //number of bits/byte, 4-8 //0-4=no,odd,even,mark,space //0,1,2 = 1, 1.5, 2 //Tx and Rx XON character //Tx and Rx XOFF character //error replacement character //end of input cha racter //received event character //reserved; do not use La fonction de récupération : BOOL GetCommState( HANDLE hFile, LPDCB lpDCB ); //instance d'accès de votre port série //Pointeur sur votre structure de configuration La fonction de renvoie : BOOL SetCommState( HANDLE hFile, LPDCB lpDCB ); // instance d'accès de votre port série // Pointeur sur votre structure de configuration Exemple commenté : Nous ne sommes pas obligé de mettre à jour entièrement la structure, car elle représente une copie du registre du port série et donc les champs non modifiés resterons à l’ancienne valeur ou à la valeur par défaut. DCB PortDCB; //Récupération des informations enregistées du port série dans votre structure. GetCommState (hPort, // instance d'accès de votre port série &PortDCB); // Structure de configuration // mise à jour de la structure PortDCB.DCBlength = sizeof (DCB); PortDCB.BaudRate = 9600; PortDCB.fBinary = TRUE; PortDCB.fParity = TRUE; PortDCB.fOutxCtsFlow = FALSE; PortDCB.fOutxDsrFlow = FALSE; PortDCB.fDtrControl = DTR_CONTROL_ENABLE; PortDCB.fDsrSensitivity = FALSE; PortDCB.fTXContinueOnXoff = TRUE; PortDCB.fOutX = FALSE; PortDCB.fInX = FALSE; PortDCB.fErrorChar = FALSE; PortDCB.fNull = FALSE; PortDCB.fRtsControl = RTS_CONTROL_ENABLE; PortDCB.fAbortOnError = FALSE; PortDCB.ByteSize = 8; PortDCB.Parity = NOPARITY; PortDCB.StopBits = ONESTOPBIT; //Mis à jour des nouvelles informations dans le registre du port série if (!SetCommState (hPort, &PortDCB)) { // code d'erreur } 4 Comment écrire sur le port série ? Pour ce faire, utiliser cette fonction : BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); //Instance de notre accès au port série //Pointeur sur la donnée à écrire //Nombre de bytes à écrire //pointeur sur le nombre de bytes écrits //Doit être NULL pour windows CE Exemple commenté : DWORD dwNumBytesWritten; BYTE Byte = 'a'; if (!WriteFile (hPort, &Byte, 1, &dwNumBytesWritten, NULL)) { //code d'erreur } // Instance d'accès de notre port série //Pointeur sur la donnée à envoyer //Nombre de byte à envoye r //Pointer sur la variable contenant le nombre //bytes écrits dans le buffer //Doit être NULL pour Windows CE 5 Comment lire sur le port série ? Le port série peut recevoir différents types d'événements comme l'arrivée d'une donnée, buffer d'envoie vide ou différents signaux (CTS, DSR) ce qui permet une large manipulation de ceux-ci Ici seul l'arrivée d'une donnée nous intéresse. Exemple commenté : BYTE Byte; DWORD dwCommStatus, DWORD dwBytesTransferred; // variable de stockage pour les évènements //Cette fonction définit les évènements pour lesquels ont va réagir par rapport à notre instance SetCommMask (hPort, EV_RXCHAR ); //ici EV_RXCHAR indique que l'on va détecter la // réception de données (cette entrée est de type // DWORD) //Cette fonction est bloquante, elle va attendre des événements définis par le mask et //Elle stockera le type d'événement qui l'aura réveillée dans une variable. WaitCommEvent (hPort, //instance d'accès du port série &dwCommStatus, //Pointeur sur la variable de stockage pour les //évènements //Cette entrée est de type LPDWORD 0); //pointeur sur la structure d'overlapped. //Ici il n'y en a pas. //cette entrée est de type LPOVERLAPPED //Cette fonction permet la lecture du buffer d'entrée du port série ReadFile (hPort, //Instance sur l'accès du port série &Byte, //Conteneur pour récupérer le byte lu 1, //Nombre de byte à lire &dwBytesTransferred, //Pointer sur le nombre de byte lu, sert à //la gestion propre de la fonction read. 0); //Doit être NULL pour Windows CE // Permet l'affichage de votre conteneur Printf("%c",Byte); 6 Comment fermer l'accès au port série ? Pour ce faire, utilisez cette fonction : BOOL CloseHandle( HANDLE hObject ); //Instance d'accès du port série