Accueil / Articles PiApplications. / La plate-forme Android

SMS/MMS : les bases.

Petits rappels sur les télécommunications.

Principe de transmission des données.

Les SMS (Short Message Service) utilisent les capacités de communication des téléphones pour transmettre des données en lieu et place de la voie. Ils sont donc pour partie tributaire de l'infrastructure matérielle.

Pour pouvoir transporter des données sur un réseau Hertzien, il faut appliquer un codage qui module de façon différente les bits (deux états ou codage bivalent) ou des groupes de bits autour de la porteuse. La porteuse est la fréquence fondamentale de l'émetteur. Actuellement, pour des raisons de qualité du signal, la modulation s'effectue sur les fréquences proches de la "porteuse" (on parle de "modulation de fréquence" par opposition à la "modulation d'amplitude"). A la réception, des filtres décomposent le signal en un spectre de fréquences, éliminent la porteuse et peuvent ainsi démoduler les fréquences restantes pour en extraire les bits et donc l'information initiale.

Ainsi pour passer du "texte" d'un SMS à sa forme "modulée" et vice-versa, il est nécessaire de disposer d'un équipement matériel chargé de la modulation et de la démodulation appelé pour cette raison un MODEM. Un MODEM est piloté par des commandes. Ces commandes répondent à des spécifications et sont nommées commandes AT. Leur jeu a été enrichi pour prendre en compte les spécificités liées aux SMS et MMS. Le tableau qui suit donne un exemple de quelques commandes AT utilisables avec les SMS :

Mnémonique Fonction
+CMGSEnvoi d'un message
+CMSSEnvoi d'un message stocké
+CMGRLecture d'un message
+CMGLListe des messages
+CMGWEcriture d'un message en mémoire
+CNMAAcquittement du message au ME/TA
+CMGCEnvoi d'une commande

Les spécification du SMS permettent de coder l'information à transporter selon deux modes :

  1. le mode texte ;
  2. le mode PDU (Protocol Data Unit).

Le mode PDU est un mode binaire pouvant utiliser plusieurs formes d'encodages. Comparons à titre d'exemple les commandes pour émettre le message "It is easy to send text messages." au 85291234567 :

Bien entendu, chaque commande est suivie d'un compte rendu qu'il est nécessaire d'interpréter. Là encore les compte rendus sont différents selon le mode utilisé (mots-clefs en mode texte et entier en mode PDU).

Nous n'irons pas plus loin dans la présentation qui sous-tend l'emploi des SMS. Si vous êtes intéressé, ce site vous donnera toutes les informations de spécification souhaitées.

Influence du système de télécommunication sur les SMS.

Les téléphones GSM ont la possibilité de recevoir les SMS sur un port particulier ce qui n'est pas le cas des téléphones CDMA. Cette possibilité est intéressante pour adresser des SMS directement à une application à l'écoute de ce port. GSM et CDMA sont les deux systèmes de télécommunication les plus répandus actuellement en téléphonie mobile (citons encore EDGE, UMTS, ou GPRS qui sont des évolutions haut-débit de GSM ou HSPA+ qui est une évolution de CDMA. Tous ces protocoles sont englobés par le terme commercial "3G").

GSM (comme ses évolutions) utilise une porteuse unique à laquelle peut se relier n'importe quel téléphone de ce type pourvu qu'il dispose d'une carte SIM autorisant son plein usage. C'est le système généralement adopté en Europe. CDMA au contraire fixe une porteuse par réseau (c'est à dire une porteuse par fournisseur). Si vous changez de réseau (d'opérateur), vous devez changer de téléphone ou le votre doit pouvoir adapter sa porteuse au nouveau fournisseur. C'est le système le plus répandu aux USA.

Ces deux modes devraient être remplacés à terme par un unique mode appelé LTE (Long Term Evolution) qui aura à ne pas en douter ses propres variantes. Les appellations "3G" ou "4G" ne signifient pas grand chose et surtout pas une garantie de bande passante. Il s'agit d'appellations purement commerciales qui ne reposent sur aucune définition technique. Dans la pratique, seuls les téléphones répondant à la spécification LTE devraient être considérés comme 4G. Heureux possesseurs des dernières merveilles à plusieurs centaines d'Euros vous détenez sans doute déjà des machines obsolètes...

SMS et Android.

Comme Android a été conçu spécifiquement pour les téléphones qui disposent quasiment tous d'un MODEM, il ne lui était pas possible d'ignorer les SMS/MMS. La plate-forme Android fournit une API qui rend ces commandes et ses comptes rendus nettement moins ésotériques. La première classe importante de cette API est la classe SmsManager. L'objet de cette classe peut être obtenu via la méthode statique getDefault. La classe comporte également les 3 méthodes essentielles : sendDataMessage, sendMultipartTextMessage et sendTextMessage. Nous allons voir comment être à l'écoute de la réception de SMS, comment les envoyer et comment obtenir la liste des SMS/MMS reçus.

Envoi d'un SMS.

Après avoir récupérer une référence sur l'objet de classe SmsManager, il faut créer une intention spécifique à l'émission :
PendingIntent pin = PendingIntent.getActivity(this, 0, new Intent(this, SmsExample.class), 0);

Il faut ensuite s'assurer via la méthode statique PhoneNumberUtils.isWellFormedSmsAddress que le format du numéro vers lequel émettre est syntaxiquement valide. Ceci fait, il est possible d'émettre le SMS via la méthode sendTextMessage du gestionnaire de SMS.

Un objet de classe PendingIntent désigne une action qui s'exécutera plus tard. Cette action future est désignée par l'intention qui lui est transmise. L'intention d'attente est donc un moyen d'exécuter une action alors même que l'application qui l'a créée est terminée. A cet effet, il est possible de fournir aux méthodes sendTextMessage ou sendDataMessage une "intention d'attente" (classe PendingIntent) qui sera invoquée une fois l'envoi effectué (qu'il ait réussi ou échoué).

Pour en revenir à Android, l'utilisation de l'API SMS suppose quelques permissions à déclarer dans le fichier manifeste de l'application :

Droit Description
READ_SMSAutorise la lecture des SMS
RECEIVE_SMSAutorise la réception des SMS
SEND_SMSAutorise l'envoi de SMS
WRITE_SMSAutorise l'envoi de messages vers le centre founisseur du service

Réception d'un SMS.

On traite ici d'un programme qui attend de recevoir un SMS et non du traitement des SMS reçus. Il faut créer une classe qui hérite de BroadcastReceiver. On surcharge alors la méthode onReceive(Context cnt, Intent inn). Cette méthode est automatiquement invoquée lors de la réception de certains évènements dont les SMS. Dans cette méthode on commence par vérifier que l'appel est bien lié à la réception d'un SMS.

Pour cela, on récupère l'action de l'intention transmise et on vérifie qu'elle est de type android.provider.Telephony.SMS_RECEIVED. Si tel est le cas dans le Bundle des propriétés joint à l'intention transmis (methode getExtras) on récupère la valeur associée à la propriété "pdus". La valeur associée à cette propriété est une liste d'objets dont chaque entrée permet de créer un SMS (objet de classe SmsMessage). Pour cela utilisez la méthode statique SmsMessage.createFromPdu(byte[]pdu)pdu est un objet de la liste récupérée via le Bundle. A partir de là, utilisez comme bon vous semble chaque objet de classe SmsMessage qui correspond aux SMS reçus.

(c) PiApplications 2016