IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Réception d'un message à partir d'un modem en c#


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Réception d'un message à partir d'un modem en c#
    Bonjour
    Je developpe une application en c# et je desire que les utilisateurs puissent avoir une possibilite d'envoyer un sms à mon application a partir d'un modem.

    Comment faire ?

    Merci.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 87
    Points : 179
    Points
    179
    Par défaut
    Bonjour vkitumaini,

    Le principe est assez simple, la réalisation est plus compliquée et surtout dépendantes des connaissances que vous avez en commandes AT.

    Pour faire simple les commandes AT sont les commandes reçues et envoyées par votre modem.
    La communication avec votre modem ne pourra se faire qu'en commandes AT.

    Votre application va communiquer avec votre modem via un port série.
    Vous devrez donc dans votre application établir la communication avec votre modem en utilisant la classe Serialport

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        public class SMS
        {
            private SerialPort serialPort;
     
            public delegate void DataReceivedEventHandler(string Message);
            public event DataReceivedEventHandler DataReceived;
            /// <summary>
            /// Constructeur
            /// </summary>
            /// <param name="COMMPORT">Port COM</param>
            public SMS(string COMMPORT)
            {
                // Initialisation des popriétés du port série
                serialPort = new SerialPort();
                serialPort.PortName = COMMPORT;
                serialPort.BaudRate = 9600;
                serialPort.Parity = Parity.None;
                serialPort.DataBits = 8;
                serialPort.StopBits = StopBits.One;
                serialPort.Handshake = Handshake.RequestToSend;
                serialPort.DtrEnable = true;
                serialPort.RtsEnable = true;
     
                // Ajout de l'event de la reception d'une donnée sur le port série
                serialPort.DataReceived += new SerialDataReceivedEventHandler(SMSPort_DataReceived);
            }
    C'est ensuite dans la méthode SMSPort_DataReceived que vous allez décrypter les commandes AT envoyées par votre modem et identifier les éventuels SMS reçu afin de les utiliser.
    Et là effectivement tout dépend de vos connaissances sur le sujet.

    Je vous met à titre indicatif la méthode que nous utilisons qui décrypte les commandes AT reçues et qui, je l’espère vous permettra de mieux aborder votre problèmatique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
            void SMSPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Attente pour que toutes les données soient écrites sur le port COM
                Thread.Sleep(Properties.Settings.Default.attentePortComRecep);
     
                CSql bdd = new CSql(Properties.Settings.Default.srvIntranet, Properties.Settings.Default.bddIntranet);
     
                string SerialIn = null;
                byte[] RXBuffer = new byte[serialPort.ReadBufferSize + 1]; ;
     
                // Lecture des données
                serialPort.Read(RXBuffer, 0, serialPort.ReadBufferSize);
                SerialIn = SerialIn + System.Text.Encoding.ASCII.GetString(RXBuffer).Replace("\0", "");
     
                // Si la lecture ne se termine pas pas un retour à la ligne ou un > c'est quelle n'est pas lue complètement
                while (!SerialIn.EndsWith("\r\n") && SerialIn.EndsWith("\r\n>"))
                {
                    // On recupere à nouveau les données
                    SerialIn = SerialIn + System.Text.Encoding.ASCII.GetString(RXBuffer).Replace("\0", "");
                    Thread.Sleep(100);
                }
     
                // Remplacement des retours à la ligne par des # afin de pouvoir utiliser la fonction Split
                SerialIn = SerialIn.Replace("\r\n", "#");
     
                // Découpe de la chaine lue avec des # comme caractères de séparation
                string[] SerialIns = SerialIn.Split('#');
     
                // Lors de la lecture de l'accusé de reception la taille doit etre de 51 caracteres
                if (SerialIns[SerialIns.Length - 1].StartsWith("00"))
                {
                    if (SerialIns[SerialIns.Length - 1].Length < 51)
                    {
                        SerialIn = SerialIn + serialPort.ReadTo("\r\n");
                    }
                }
     
                // Si il y a eu relecture on redécoupe la chaine
                SerialIn = SerialIn.Replace("\r\n", "#");
                SerialIns = SerialIn.Split('#');
     
                // Il arrive qu'il y est plusieurs ligne de récupérées
                foreach (string In in SerialIns)
                {
                    if (In != "")
                    {
                        // Debug 
                        StreamWriter wr = new StreamWriter(Environment.CurrentDirectory + "\\log.txt", true);
                        wr.WriteLine(In);
                        wr.Close();
     
                        // En attente de la suite du message
                        if (In.Contains(">") == true)
                        {
                            _ContSMS = true;
                            dataReceived.Set();
                        }
     
                        // Erreur
                        if (In.Contains("+CMS ERROR:") == true || In.Contains("ERROR") == true)
                        {
                            _Error = true;
                            if (Error != null)
                                Error("Erreur lors de l'envoi");
                            dataReceived.Set();
                        }
     
                        // Message envoyé -> récupération de l'ID de l'envoi
                        if (In.Contains("+CMGS: ") == true)
                        {
                            _iIDSMS = Convert.ToInt32(In.Replace("+CMGS: ", ""));
                            _Continue = true;
                            if (IDReceived != null)
                                IDReceived(In.Replace("+CMGS: ", ""));
     
                            if (Sending != null)
                                Sending(true);
                            dataReceived.Set();
                        }
     
                        // Accusé de reception
                        if (In.StartsWith("+CDS: "))
                        {
                            string[] sAccuse = In.Split(',');
                            if (sAccuse.Length > 7)
                            {
                                // Affectation en base en fonction de l'état
    ...
                            }
                        }
                    }
     
                    if (DataReceived != null)
                        if (In != "")
                            DataReceived(In);
                }
            }
    En espérant vous avoir aiguiller sur la bonne piste.

    Mvk

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 161
    Points : 72
    Points
    72
    Par défaut
    Bonjour MvK0610
    et la fonction pour parser un message reçu comment vous faites ?
    regex ? while ?
    un exemple ?

    merci ça m'a bien aidé deja


    Citation Envoyé par MvK0610 Voir le message
    Bonjour vkitumaini,
    C'est ensuite dans la méthode SMSPort_DataReceived que vous allez décrypter les commandes AT envoyées par votre modem et identifier les éventuels SMS reçu afin de les utiliser.
    Et là effectivement tout dépend de vos connaissances sur le sujet.

    Je vous met à titre indicatif la méthode que nous utilisons qui décrypte les commandes AT reçues et qui, je l’espère vous permettra de mieux aborder votre problèmatique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
            void SMSPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Attente pour que toutes les données soient écrites sur le port COM
                Thread.Sleep(Properties.Settings.Default.attentePortComRecep);
     
                CSql bdd = new CSql(Properties.Settings.Default.srvIntranet, Properties.Settings.Default.bddIntranet);
     
                string SerialIn = null;
                byte[] RXBuffer = new byte[serialPort.ReadBufferSize + 1]; ;
     
                // Lecture des données
                serialPort.Read(RXBuffer, 0, serialPort.ReadBufferSize);
                SerialIn = SerialIn + System.Text.Encoding.ASCII.GetString(RXBuffer).Replace("\0", "");
     
                // Si la lecture ne se termine pas pas un retour à la ligne ou un > c'est quelle n'est pas lue complètement
                while (!SerialIn.EndsWith("\r\n") && SerialIn.EndsWith("\r\n>"))
                {
                    // On recupere à nouveau les données
                    SerialIn = SerialIn + System.Text.Encoding.ASCII.GetString(RXBuffer).Replace("\0", "");
                    Thread.Sleep(100);
                }
     
                // Remplacement des retours à la ligne par des # afin de pouvoir utiliser la fonction Split
                SerialIn = SerialIn.Replace("\r\n", "#");
     
                // Découpe de la chaine lue avec des # comme caractères de séparation
                string[] SerialIns = SerialIn.Split('#');
     
                // Lors de la lecture de l'accusé de reception la taille doit etre de 51 caracteres
                if (SerialIns[SerialIns.Length - 1].StartsWith("00"))
                {
                    if (SerialIns[SerialIns.Length - 1].Length < 51)
                    {
                        SerialIn = SerialIn + serialPort.ReadTo("\r\n");
                    }
                }
     
                // Si il y a eu relecture on redécoupe la chaine
                SerialIn = SerialIn.Replace("\r\n", "#");
                SerialIns = SerialIn.Split('#');
     
                // Il arrive qu'il y est plusieurs ligne de récupérées
                foreach (string In in SerialIns)
                {
                    if (In != "")
                    {
                        // Debug 
                        StreamWriter wr = new StreamWriter(Environment.CurrentDirectory + "\\log.txt", true);
                        wr.WriteLine(In);
                        wr.Close();
     
                        // En attente de la suite du message
                        if (In.Contains(">") == true)
                        {
                            _ContSMS = true;
                            dataReceived.Set();
                        }
     
                        // Erreur
                        if (In.Contains("+CMS ERROR:") == true || In.Contains("ERROR") == true)
                        {
                            _Error = true;
                            if (Error != null)
                                Error("Erreur lors de l'envoi");
                            dataReceived.Set();
                        }
     
                        // Message envoyé -> récupération de l'ID de l'envoi
                        if (In.Contains("+CMGS: ") == true)
                        {
                            _iIDSMS = Convert.ToInt32(In.Replace("+CMGS: ", ""));
                            _Continue = true;
                            if (IDReceived != null)
                                IDReceived(In.Replace("+CMGS: ", ""));
     
                            if (Sending != null)
                                Sending(true);
                            dataReceived.Set();
                        }
     
                        // Accusé de reception
                        if (In.StartsWith("+CDS: "))
                        {
                            string[] sAccuse = In.Split(',');
                            if (sAccuse.Length > 7)
                            {
                                // Affectation en base en fonction de l'état
    ...
                            }
                        }
                    }
     
                    if (DataReceived != null)
                        if (In != "")
                            DataReceived(In);
                }
            }
    En espérant vous avoir aiguiller sur la bonne piste.

    Mvk

  4. #4
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Modem avec PC
    bonjour MvK0610

    j'ai essaie le code ça marche vraiement merci.
    Mon application envoi et reçoit des sms via mon Modem edge sans problème.
    J'aimerais aussi savoir avec combien d'sms réçus simultanément mon modem peut cracker parce que plusieurs personne devraient evoyé des sms à cette application;

    merci.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 6
    Points
    6
    Par défaut recevoir sms par application c sharp
    depuis longtemps,je cherche une solution pour recevoir un sms par mon application développée en c sharp et l'enregistrer dans une table de ma base de données,
    j'ai appliquer votre code,et j'ai trouvé quelques erreurs,et je souhaite bien m'aider à montrer comment enregistrer le sms reçus dans la base de données et afficher la liste des sms reçus.
    cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ETL exécuter à partir de la réception d'un message
    Par kssillati dans le forum Alimentation
    Réponses: 0
    Dernier message: 08/01/2010, 13h55
  2. téléchargement des messages à partir du serveur
    Par fatenov dans le forum Outlook
    Réponses: 1
    Dernier message: 17/01/2008, 14h52
  3. Réponses: 12
    Dernier message: 03/11/2005, 18h45
  4. numeroter a partir d'un modem.
    Par momoi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 24/08/2005, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo