SMS da comandi AT con cellulare GSM sta dando errore
-
06-07-2019 - |
Domanda
Sto inviando SMS tramite comandi AT con telefono cellulare GSM. Voglio inviare un sacco di messaggi come migliaia. Ho letto che tramite cellulare GSM possiamo inviare 6-8 sms al minuto. Ma quando invio messaggi, qualcuno va e qualcuno no. Ricevo informazioni dal file Excel significa numero di destinazione e testo del messaggio. Puoi dirmi perché alcuni sms stanno andando e altri no. Il mio codice è
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);
}
Soluzione
Penso che il tuo problema sia che non stai aspettando il codice del risultato finale (cioè OK, ERRORE e pochi altri) prima di inviare il comando successivo. Il problema è che il nuovo comando attiverà l'interruzione del comando in corso se non è terminato. Per citare V.250 :
5.6.1 Interruzione comandi
...
Interruzione dei comandi viene eseguito dal trasmissione dal DTE al DCE di qualsiasi personaggio.
Quindi SEMPRE quando invii comandi AT, DEVI attendere il codice del risultato finale prima di inviare il comando successivo.
Potrei suggerire di refactoring serialport.WriteLine (" ATxxx " + Environment.NewLine)
in una sendCommand (serialport, " ATxxx ")
? E poi puoi aggiungere in attesa del codice del risultato finale alla fine di quella funzione.
Altri suggerimenti
Prova a vedere se c'è un motivo per i messaggi che non vengono inviati. Perché allora potrebbe esserci un problema con il formato numerico o i caratteri non validi nel messaggio.
Inoltre, alcune note:
-
Non si sta verificando alcun errore. Mi assicurerei di avere la risposta prevista dopo aver chiamato ciascun comando.
-
Stai utilizzando Environment.NewLine per completare ogni riga. Presumo che questa sia una proprietà che cambia con il sistema operativo sottostante. Lo standard AT è tuttavia molto chiaro su quali caratteri usare per terminare le linee di comando.
-
I telefoni cellulari sono veri bastardi. Solo perché segui le specifiche o la documentazione non significa che lo facciano. Supponiamo che ciascun modello di telefono si comporti in modo diverso da tutti gli altri. Vedi punto 1.