Nicolas MARTIN Christophe PARIS
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.
SOMMAIRE
1 INTRODUCTION ...3
2 FONCTIONNALITES DE L’APPLICATION ...4
3 ETUDE DES METHODES DE DEVELOPPEMENT EXIS TANTES ...4
3.1 LE PROTOCOLE SMS ... 4
3.2 LES METHODES POSSIBLES DE PROGRAMMATION... 6
4 MAQUETTAGE, TEST ET VALIDATION :...10
4.1 ECRITURE/LECTURE SUR LE PORT SERIE... 10
4.1.1 Objectif ...10
4.1.2 Plate-forme de Test...10
4.1.3 Tests pratiqués...10
4.1.4 Résultats ...11
4.2 ENCODAGE D’UN SMS... 12
4.2.1 Objectif ...12
4.2.2 Plate-forme de Test...12
4.2.3 Tests pratiqués...12
4.2.4 Résultats ...13
4.3 INTERFACE GRAPHIQUE... 14
4.3.1 Objectif ...14
4.3.2 Plate-forme de Test...14
4.3.3 Description de l’interface...14
4.3.4 Evolutions...16
4.4 CONCLUSIONS SUR LES TESTS... 17
5 CONCLUSION...19
6 BIBLIOGRAPHIE...20
6.1 SITE WEB :... 20
6.2 DOCUMENTATION... 20
ANNEXES
ANNEXE 1 : LE PROTOCOLE SMS ...21ANNEXE 2 : 7 BIT DEFAULT ALPHABET ...30
ANNEXE 3 : TRIUM MONDO...34
ANNEXE 4 : GESTION DU PORT SERIE POUR POCKET PC ET WINDOWS CE...35
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.
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éveloppe ment 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éta- informations à 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.
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.
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 Description
SmsClearMessageNotification Cancels registration for SMS notifications.
SmsClose Closes an existing SMS Messaging handle.
SmsGetBroadcastMsgRanges 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.
Ø 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 :
Téléphone cellulaire
Réseau GSM
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.
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 :
Modem GSM Port Série
Trame SMS Encodeur de
SMS
Numéro du destinataire Message
Réseau GSM
Envoi d’un SMS par modem GSM
Date de validité
Paramètres du port
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.
En ce qui concerne la réception d’un SMS, l’architecture est la suivante :
Modem GSM Port Série Trame SMS
Réseau GSM
Paramètres du port
Décodeur de SMS
Numéro de l’émetteur
Message
Réception d’un SMS par modem GSM
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.
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.
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.
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 (0x00) COMPRESSION : OFF MESSAGE CLASS : NONE
ALPHABET USED : 7bit default VALIDITY OF MESSAGE : 15,0 hrs
USER DATA PART OF SM
USER DATA LENGTH : 10 septets USER DATA (TEXT) : HelloHello
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).
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.
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.
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.
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.
Ø 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
en semaines
Nombre de personnes
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
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.
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).
Annexe 1 : le protocole SMS
1 Trame SMS-SUBMIT
Voici les éléments de base de la trame SMS-SUBMIT : Représentation Description
2 octets Length of SMSC information 1 octet First octet of the PDU
Integer TP-MR
2-12 octets TP-DA
1 octet TP-PID
Integer TP-DCS
1-7 octets TP-VP
Integer TP-UDL
(dépend du TP-DCS) 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 6 5 4 3 2 1 0
Nom TP-RP TP-UDHI TP-SRR TP-VPF TP-VPF TP-RD TP-MTI 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
Bit n°0
Description Sens
0 0 SMS-DELIVER SC -> MS
0 0 SMS-DELIVER-REPORT MS -> SC
1 0 SMS-STATUS-REPORT SC -> MS
1 0 SMS-COMMAND MS -> SC
0 1 SMS-SUBMIT MS -> SC
0 1 SMS-SUBMIT-REPORT 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 Description
0 0 Le champ TP-VP est absent
1 0 Le champ TP-VP est présent au format relatif sur 1 octet (représentation avec un entier)
0 1 Réservé
1 1 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° 7 6 5 4 3 2 1 0
Nom 0 0 0 1 0 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 Description Taille Octets Integer Address Length 1
1 octet Type of Address 1 Length Semi-Octets Address Value x
1.4.1 Address Length
Ce champ indique la longueur de l’adresse en nombre de semi-octets (1octet=2semi- octets), 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° 7 6 5 4 3 2 1 0
Nom Toujours à 1 Type-of-number 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 Bit n°5 Bit n°4 Description
0 0 0 Type inconnu
0 0 1 Numéro international.
0 1 0 Numéro national.
0 1 1 Numéro spécifique d’ un réseau.
1 0 0 Subscriber number.
1 0 1 Alphanumérique
1 1 0 Abréviation
1 1 1 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 Bit n°2 Bit n°1 Bit n°0 Description
0 0 0 0 Inconnu
0 0 0 1 ISDN/telephone numbering plan (E.164/E.163).
0 0 1 1 Data numbering plan (X.121).
0 1 0 0 Telex numbering plan
1 0 0 0 National numbering plan.
1 0 0 1 Private numbering plan
1 0 1 0 ERMES numbering plan (ETSI DE/PS 3 01-3)
1 1 1 1 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 6 5 4 3 2 1 0
Valeur 1 0 0 1 0 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 Valeur de la période
0 to 143 (TP-VP + 1) * 5 min (i.e. des intervalles de 5 min jusqu’à 12 h) 144 to 167 12 hr + ((TP-VP - 143) * 30 min)
168 to 196 (TP-VP - 166) * 1 jour 197 to 255 (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 Description
2 octets Length of SMSC
information
2-12octets TP-DA
1 octet First octet of the PDU
2-12 octets TP-OA
1 octet TP-PID
Integer TP-DCS
1-7 octets TP-SCTS
Integer TP-UDL
(dépend du TP-DCS) 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
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 6 5 4 3 2 1 0
Nom TP-RP TP-UDHI TP-SRI unused unused TP-MMS TP-MTI 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
Bit n°0
Description Sens
0 0 SMS-DELIVER SC -> MS
0 0 SMS-DELIVER-REPORT MS -> SC
1 0 SMS-STATUS-REPORT SC -> MS
1 0 SMS-COMMAND MS -> SC
0 1 SMS-SUBMIT MS -> SC
0 1 SMS-SUBMIT-REPORT 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
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° 7 6 5 4 3 2 1 0
Nom 0 0 0 0 0 1 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 Month Day Hour Minute Second TimeZone
Nbre de Semi-octets 2 2 2 2 2 2 2
De plus, chaque semi-octet est codé par inversion. Voici un exemple :
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 72 83 01 00 10 F5
04 0B 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 ».
This is the 7 bit default alphabet as specified by GSM 03.38. The corresponding ISO- 8859-1 decimal codes are shown in the rightmost column. Note that the euro sign (€) is a member of the ISO-8859-15 character set.
Hex Dec Character name Character ISO-8859-1 DEC
0x00 0 COMMERCIAL AT @ 64
0x01 1 POUND SIGN £ 163
0x02 2 DOLLAR SIGN $ 36
0x03 3 YEN SIGN ¥ 165
0x04 4 LATIN SMALL LETTER E WITH GRAVE è 232
0x05 5 LATIN SMALL LETTER E WITH ACUTE é 233
0x06 6 LATIN SMALL LETTER U WITH GRAVE ú 250
0x07 7 LATIN SMALL LETTER I WITH GRAVE ì 236
0x08 8 LATIN SMALL LETTER O WITH GRAVE ò 242
0x09 9 LATIN CAPITAL LETTER C WITH
CEDILLA Ç 199
0x0A 10 LINE FEED 10
0x0B 11 LATIN CAPITAL LETTER O WITH
STROKE Ø 216
0x0C 12 LATIN SMALL LETTER O WITH STROKE ø 248
0x0D 13 CARRIAGE RETURN 13
0x0E 14 LATIN CAPITAL LETTER A WITH RING
ABOVE Å 197
0x0F 15 LATIN SMALL LETTER A WITH RING
ABOVE å 229
0x10 16 GREEK CAPITAL LETTER DELTA ?
0x11 17 LOW LINE _ 95
0x12 18 GREEK CAPITAL LETTER PHI F
0x13 19 GREEK CAPITAL LETTER GAMMA G
0x14 20 GREEK CAPITAL LETTER LAMBDA ?
0x15 21 GREEK CAPITAL LETTER OMEGA O
0x16 22 GREEK CAPITAL LETTER PI ?
0x17 23 GREEK CAPITAL LETTER PSI ?
0x18 24 GREEK CAPITAL LETTER SIGMA S
0x19 25 GREEK CAPITAL LETTER THETA T
0x1A 26 GREEK CAPITAL LETTER XI ?
0x1B 27 ESCAPE TO EXTENSION TABLE
0x1B0A 27 10 FORM FEED 12
0x1B28 27 40 LEFT CURLY BRACKET { 123
0x1B29 27 41 RIGHT CURLY BRACKET } 125
0x1B2F 27 47 REVERSE SOLIDUS (BACKSLASH) \ 92
0x1B3C 27 60 LEFT SQUARE BRACKET [ 91
0x1B3D 27 61 TILDE ~ 126
0x1B3E 27 62 RIGHT SQUARE BRACKET ] 93
0x1B40 27 64 VERTICAL BAR | 124
0x1B65 27
101 EURO SIGN € 164 (ISO-8859-
15)
0x1C 28 LATIN CAPITAL LETTER AE Æ 198
0x1D 29 LATIN SMALL LETTER AE æ 230
0x1E 30 LATIN SMALL LETTER SHARP S (German) ß 223 0x1F 31 LATIN CAPITAL LETTER E WITH ACUTE Ê 202
0x20 32 SPACE 32
0x21 33 EXCLAMATION MARK ! 33
0x22 34 QUOTATION MARK " 34
0x23 35 NUMBER SIGN # 35
0x24 36 CURRENCY SIGN ¤ 164 (ISO-8859-
1)
0x25 37 PERCENT SIGN % 37
0x26 38 AMPERSAND & 38
0x27 39 APOSTROPHE ' 39
0x28 40 LEFT PARENTHESIS ( 40
0x29 41 RIGHT PARENTHESIS ) 41
0x2A 42 ASTERISK * 42
0x2B 43 PLUS SIGN + 43
0x2C 44 COMMA , 44
0x2D 45 HYPHEN-MINUS - 45
0x2E 46 FULL STOP . 46
0x2F 47 SOLIDUS (SLASH) / 47
0x30 48 DIGIT ZERO 0 48
0x31 49 DIGIT ONE 1 49
0x32 50 DIGIT TWO 2 50
0x33 51 DIGIT THREE 3 51
0x34 52 DIGIT FOUR 4 52
0x35 53 DIGIT FIVE 5 53
0x36 54 DIGIT SIX 6 54
0x39 57 DIGIT NINE 9 57
0x3A 58 COLON : 58
0x3B 59 SEMICOLON ; 59
0x3C 60 LESS-THAN SIGN < 60
0x3D 61 EQUALS SIGN = 61
0x3E 62 GREATER-THAN SIGN > 62
0x3F 63 QUESTION MARK ? 63
0x40 64 INVERTED EXCLAMATION MARK ¡ 161
0x41 65 LATIN CAPITAL LETTER A A 65
0x42 66 LATIN CAPITAL LETTER B B 66
0x43 67 LATIN CAPITAL LETTER C C 67
0x44 68 LATIN CAPITAL LETTER D D 68
0x45 69 LATIN CAPITAL LETTER E E 69
0x46 70 LATIN CAPITAL LETTER F F 70
0x47 71 LATIN CAPITAL LETTER G G 71
0x48 72 LATIN CAPITAL LETTER H H 72
0x49 73 LATIN CAPITAL LETTER I I 73
0x4A 74 LATIN CAPITAL LETTER J J 74
0x4B 75 LATIN CAPITAL LETTER K K 75
0x4C 76 LATIN CAPITAL LETTER L L 76
0x4D 77 LATIN CAPITAL LETTER M M 77
0x4E 78 LATIN CAPITAL LETTER N N 78
0x4F 79 LATIN CAPITAL LETTER O O 79
0x50 80 LATIN CAPITAL LETTER P P 80
0x51 81 LATIN CAPITAL LETTER Q Q 81
0x52 82 LATIN CAPITAL LETTER R R 82
0x53 83 LATIN CAPITAL LETTER S S 83
0x54 84 LATIN CAPITAL LETTER T T 84
0x55 85 LATIN CAPITAL LETTER U U 85
0x56 86 LATIN CAPITAL LETTER V V 86
0x57 87 LATIN CAPITAL LETTER W W 87
0x58 88 LATIN CAPITAL LETTER X X 88
0x59 89 LATIN CAPITAL LETTER Y Y 89
0x5A 90 LATIN CAPITAL LETTER Z Z 90
0x5B 91 LATIN CAPITAL LETTER A WITH
DIAERESIS Ä 196
0x5C 92 LATIN CAPITAL LETTER O WITH
DIAERESIS Ö 214
0x5E 94 LATIN CAPITAL LETTER U WITH
DIAERESIS Ü 220
0x5F 95 SECTION SIGN § 167
0x60 96 INVERTED QUESTION MARK ¿ 191
0x61 97 LATIN SMALL LETTER A a 97
0x62 98 LATIN SMALL LETTER B b 98
0x63 99 LATIN SMALL LETTER C c 99
0x64 100 LATIN SMALL LETTER D d 100
0x65 101 LATIN SMALL LETTER E e 101
0x66 102 LATIN SMALL LETTER F f 102
0x67 103 LATIN SMALL LETTER G g 103
0x68 104 LATIN SMALL LETTER H h 104
0x69 105 LATIN SMALL LETTER I i 105
0x6A 106 LATIN SMALL LETTER J j 106
0x6B 107 LATIN SMALL LETTER K k 107
0x6C 108 LATIN SMALL LETTER L l 108
0x6D 109 LATIN SMALL LETTER M m 109
0x6E 110 LATIN SMALL LETTER N n 110
0x6F 111 LATIN SMALL LETTER O o 111
0x70 112 LATIN SMALL LETTER P p 112
0x71 113 LATIN SMALL LETTER Q q 113
0x72 114 LATIN SMALL LETTER R r 114
0x73 115 LATIN SMALL LETTER S s 115
0x74 116 LATIN SMALL LETTER T t 116
0x75 117 LATIN SMALL LETTER U u 117
0x76 118 LATIN SMALL LETTER V v 118
0x77 119 LATIN SMALL LETTER W w 119
0x78 120 LATIN SMALL LETTER X x 120
0x79 121 LATIN SMALL LETTER Y y 121
0x7A 122 LATIN SMALL LETTER Z z 122
0x7B 123 LATIN SMALL LETTER A WITH
DIAERESIS ä 228
0x7C 124 LATIN SMALL LETTER O WITH
DIAERESIS ö 246
0x7D 125 LATIN SMALL LETTER N WITH TILDE ñ 241 0x7E 126 LATIN SMALL LETTER U WITH
DIAERESIS ü 252
Annexe 3 : TRIUM MONDO
Model Trium Mondo
Height (mm) 139.5 Width (mm) 84 Depth (mm) 19 Weight 200 g
Network EGSM 900/1800
gprs Yes
hscsd No
WAP Yes
Talk time (hours) upto 3 Standby (hours) upto 100
Display N/A
SMS Yes
smsext No
Picture SMS No smsemotions No
smschat No
t9 No
Icons No
Ringtones Yes Vibrating Alarm No voicedial No voicectrl No voicerec Yes handsfree Yes infrared No
Fax Yes
organizer Yes calendar Yes
email Yes
html No
radio No
mp3 Yes
games 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 { //dcb
DWORD DCBlength; //sizeof(DCB) DWORD BaudRate; //current baud rate
DWORD fBinary: 1; //binary mode, no EOF check DWORD fParity: 1; //enable parity checking DWORD fOutxCtsFlow:1; //CTS output flow control DWORD fOutxDsrFlow:1; //DSR output flow control DWORD fDtrControl:2; //DTR flow control type DWORD fDsrSensitivity:1; // DSR sensitivity DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX: 1; //XON/XOFF out flow control DWORD fInX: 1; //XON/XOFF in flow control DWORD fErrorChar: 1; //enable error replacement DWORD fNull: 1; //enable null stripping DWORD fRtsControl:2; //RTS flow control
DWORD fAbortOnError:1; //abort reads/writes on error DWORD fDummy2:17; //reserved
WORD wReserved; //not currently used WORD XonLim; //transmit XON threshold WORD XoffLim; //transmit XOFF threshold BYTE ByteSize; //number of bits/byte, 4-8 BYTE Parity; //0-4=no,odd,even,mark,space BYTE StopBits; //0,1,2 = 1, 1.5, 2
char XonChar; //Tx and Rx XON character char XoffChar; //Tx and Rx XOFF character char ErrorChar; //error replacement character char EofChar; //end of input cha racter char EvtChar; //received event character WORD wReserved1; //reserved; do not use } DCB;
La fonction de récupération : BOOL GetCommState(
HANDLE hFile, //instance d'accès de votre port série
LPDCB lpDCB //Pointeur sur votre structure de configuration );
La fonction de renvoie : BOOL SetCommState(
HANDLE hFile, // instance d'accès de votre port série
LPDCB lpDCB // 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, //Instance de notre accès au port série LPCVOID lpBuffer, //Pointeur sur la donnée à écrire DWORD nNumberOfBytesToWrite, //Nombre de bytes à écrire
LPDWORD lpNumberOfBytesWritten, //pointeur sur le nombre de bytes écrits LPOVERLAPPED lpOverlapped //Doit être NULL pour windows CE );
Exemple commenté :
DWORD dwNumBytesWritten;
BYTE Byte = 'a';
if (!WriteFile (hPort, // Instance d'accès de notre port série &Byte, //Pointeur sur la donnée à envoyer 1, //Nombre de byte à envoye r
&dwNumBytesWritten, //Pointer sur la variable contenant le nombre //bytes écrits dans le buffer
NULL)) //Doit être NULL pour Windows CE {
//code d'erreur }
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, // variable de stockage pour les évènements DWORD dwBytesTransferred;
//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 );