SMS por comandos AT con GSM móvil está dando error
-
06-07-2019 - |
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);
}
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:
-
No está haciendo ninguna comprobación de errores. Me aseguraría de obtener la respuesta esperada después de llamar a cada comando.
-
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.
-
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.