Pregunta

Estoy enviando SMS por comandos AT con un teléfono móvil GSM. Quiero enviar una gran cantidad de mensajes como miles. Leí que mediante un dispositivo móvil GSM podemos enviar 6-8 sms por minuto. Pero cuando envío mensajes, alguien se va y alguien no. Recibo información del archivo de Excel significa el número de destino y el texto del mensaje. ¿Me puede decir por qué algunos sms van y otros no? Mi código es

        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);
   }
¿Fue útil?

Solución

Creo que su problema es que no está esperando el código del resultado final (es decir, OK, ERROR y algunos otros) antes de enviar el siguiente comando. El problema con eso es que el nuevo comando activará un aborto del comando en curso si no está terminado. Para citar V.250 :

  

5.6.1 Abortar comandos

     

...

     

Abortar   de comandos se lleva a cabo por el   transmisión del DTE al DCE   de cualquier personaje.

Entonces SIEMPRE al enviar comandos AT, DEBE esperar el código del resultado final antes de enviar el siguiente comando.

¿Puedo sugerir refactorizar serialport.WriteLine (" ATxxx " + Environment.NewLine) en una función sendCommand (serialport, " ATxxx ") ? Y luego puede agregar esperando el código del resultado final al final de esa función.

Otros consejos

Intente ver si hay un patrón en los mensajes que no se envían. Porque entonces podría haber un problema con el formato de número o caracteres no válidos en el mensaje.

Además, algunas notas:

  1. No está haciendo ninguna comprobación de errores. Me aseguraría de obtener la respuesta esperada después de llamar a cada comando.

  2. Está utilizando Environment.NewLine para terminar cada fila. Supongo que esta es una propiedad que cambia con el sistema operativo subyacente. Sin embargo, el estándar AT es muy claro sobre exactamente qué caracteres usar para terminar las líneas de comando.

  3. Los teléfonos móviles son verdaderos bastardos. El hecho de que USTED siga las especificaciones o la documentación no significa que lo hagan. Suponga que cada modelo de teléfono se comporta de manera diferente al resto. Ver punto 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top