Question

J'envoie des SMS par des commandes AT avec un téléphone mobile GSM. Je veux envoyer des messages en masse, comme des milliers. J'ai lu que, par GSM, nous pouvons envoyer 6 à 8 sms par minute. Mais quand j'envoie des messages, alors quelqu'un s'en va et quelqu'un pas. Je reçois des informations du fichier Excel signifie le numéro de destination et le texte du message. Pouvez-vous me dire pourquoi certains sms vont et d'autres pas. Mon code est

        SmsFields smsObj = null;
        List<SmsFields> smsColl = null;
        SerialPort serialport = null;
        StringBuilder strbuild = new StringBuilder();
        try
        {
            //Validate the form 
            if (!Validation()) return;

            serialport = new SerialPort();

            ////Sets the properties of serial port object
            serialport.PortName = cboPort.SelectedItem.ToString();
            serialport.BaudRate = 9600;
            serialport.Parity = Parity.None;
            serialport.DataBits = 8;
            serialport.StopBits = StopBits.One;
            serialport.Handshake = Handshake.RequestToSend;
            serialport.DtrEnable = true;
            serialport.RtsEnable = true;

            //Open the port to send sms
            serialport.Open();

            //Check if port is opened or not
            if (!serialport.IsOpen)
            {
                MessageBox.Show("Serial port is not opened. Please try with other port");
                return;
            }

            //Create smsFields class's object and fill the data in the generic collection
            smsObj = SmsFields.Instance;
            smsColl = smsObj.FillData(txtFilePath.Text);

            if (smsColl == null)
            {
                MessageBox.Show("No data found in the excel table");
                return;
            }
            //Gets the single record from SmsFields class and sends the message
            foreach (SmsFields sms in smsColl)
            {

                //checks phone status
                serialport.WriteLine("AT" + Environment.NewLine);
                //Configures message as SMS (0 for PDU format) and (1 for text format)
                serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);

                //Sets message center number
                serialport.WriteLine("AT+CSCA=\"" + txtServiceNo.Text + "\"" + Environment.NewLine);

                //Sets destination number
                serialport.WriteLine("AT+CMGS=\"" + sms.DestinationNo + "\"" + Environment.NewLine);

                //Specifies message and sends Ctrl+z
                serialport.WriteLine(sms.Message + (char)26);

                //Displays buffer containing output messages
                System.Threading.Thread.Sleep(4000);
   }
Était-ce utile?

La solution

Je pense que votre problème est que vous n'attendez pas le code de résultat final (c'est-à-dire OK, ERROR et quelques autres) avant d'envoyer la commande suivante. Le problème, c'est que la nouvelle commande déclenchera un abandon de la commande en cours si elle n'est pas terminée. Pour citer V.250 :

  

5.6.1 Abandon des commandes

     

...

     

Abandon   des commandes est accompli par le   transmission de l'ETTD vers l'ETCD   de n'importe quel caractère.

Ainsi, TOUJOURS lors de l'envoi de commandes AT, vous devez attendre le code du résultat final avant d'envoyer la commande suivante.

Puis-je suggérer de refactoriser serialport.WriteLine ("ATxxx" + Environment.NewLine) dans une fonction sendCommand (serialport, "ATxxx") ? Et puis vous pouvez ajouter en attente du code de résultat final à la fin de cette fonction.

Autres conseils

Essayez de voir s’il existe un motif pour les messages qui ne sont pas envoyés. Dans ce cas, le format du numéro ou des caractères non valides dans le message risquent de poser problème.

De plus, quelques notes:

  1. Vous ne faites aucune vérification d'erreur. Je m'assurerais d'avoir la réponse attendue après avoir appelé chaque commande.

  2. Vous utilisez Environment.NewLine pour terminer chaque ligne. Je suppose que c'est une propriété qui change avec le système d'exploitation sous-jacent. La norme AT précise toutefois très clairement quels caractères utiliser pour mettre fin aux lignes de commande.

  3. Les téléphones mobiles sont de véritables bâtards. Le fait que VOUS respectiez les spécifications ou la documentation ne signifie pas qu’ils le font. Supposons que chaque modèle de téléphone se comporte différemment de tous les autres. Voir le point 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top