SMS по AT-командам с мобильного телефона GSM выдает ошибку
-
06-07-2019 - |
Вопрос
Я отправляю SMS с помощью AT-команд с мобильного телефона GSM.Я хочу отправить огромное количество сообщений, например, тысячи.Я читал, что по мобильному телефону GSM мы можем отправлять 6-8 смс в минуту.Но когда я отправляю сообщения, то кто-то идёт, а кто-то нет.Я получаю информацию из файла Excel, это номер назначения и текст сообщения.Подскажите, почему некоторые смс идут, а некоторые нет.Мой код
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);
}
Решение
Я думаю, ваша проблема в том, что вы не ждете окончательного кода результата (т.ОК, ОШИБКА и несколько других) перед отправкой следующей команды.Проблема в том, что новая команда вызовет отмену текущей команды, если она не будет завершена.Цитировать В.250:
5.6.1 Команды отмены
...
Сокращение команд достигается путем передачи от DTE в DCE любого персонажа.
Так ВСЕГДА отправляя AT-команды, вы ДОЛЖЕН дождитесь окончательного кода результата, прежде чем отправлять следующую команду.
Могу ли я предложить рефакторинг serialport.WriteLine("ATxxx" + Environment.NewLine)
в sendCommand(serialport, "ATxxx")
функция?А затем вы можете добавить ожидание окончательного кода результата в конце этой функции.
Другие советы
Попытайтесь выяснить, существует ли шаблон в сообщениях, которые не отправляются. Потому что тогда может быть проблема с форматом чисел или недопустимыми символами в сообщении.
Кроме того, некоторые заметки:
<Ол>Вы не проверяете ошибки. Я хотел бы убедиться, что получил ожидаемый ответ после вызова каждой команды.
Вы используете Environment.NewLine для завершения каждой строки. Я предполагаю, что это свойство, которое изменяется с базовой операционной системой. Стандарт AT, однако, очень четко определяет, какие именно символы использовать для завершения командной строки.
Мобильные телефоны - настоящие ублюдки. То, что ВЫ следуете спецификации или документации, не означает, что они выполняют. Предположим, что каждая модель телефона ведет себя не так, как все остальные. Смотрите пункт 1.