Сообщение доставки команды AT c# - PullRequest
0 голосов
/ 20 января 2020

Я создал приложение winform для отправки SMS через USB-модем, оно работает нормально, но я хочу получить сообщение о доставке и подтвердить, что сообщение было отправлено правильно.

Вот моя программа

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        SerialPort sp = new SerialPort();
        sp.PortName = textBox1.Text;
        sp.Open();
        sp.WriteLine("AT" + Environment.NewLine);
        Thread.Sleep(100);
        sp.WriteLine("AT+CMGF=1" + Environment.NewLine);
        Thread.Sleep(100);
        sp.WriteLine("AT+CSCS=\"GSM\"" + Environment.NewLine);
        Thread.Sleep(100);
        sp.WriteLine("AT+CMGS=\"" + mobile + "\"" + Environment.NewLine);
        Thread.Sleep(100);
        sp.Write(message);
        Thread.Sleep(100);
        sp.Write(new byte[] { 26 }, 0, 1);
        Thread.Sleep(100);

        var response = sp.ReadExisting();
        if (response.Contains("ERROR: 500"))
        {
            MessageBox.Show("Please check credits");
        }
        sp.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString());
    }
}

Пожалуйста, помогите мне, как прочитать статус доставки с кодом выше

1 Ответ

1 голос
/ 20 января 2020

Этот вопрос не является C# конкретным; скорее это вопрос AT команд.

После отправки SMS вы получите ответ от модема, что-то вроде этого:

+CMGS: {sms id, 0 to 255}
OK

В этом случае, если Сервисный центр успешно доставил SMS, модем вернет этот ответ:

+cds: {some id which does not matter} {PDU status report}

Вам нужно просто декодировать этот PDU, чтобы получить отчет о состоянии, идентификатор исходного SMS и другие полезные данные. Если идентификатор отправленного SMS-сообщения и идентификатора из отчета о состоянии совпадают, у вас есть отчет о состоянии именно для вашего сообщения.

Примечание: если вы удалите сообщение из хранилища модема до получения отчета о доставке, вы получите отчет, который будет содержать всю обычную информацию, но статус доставки, скорее всего, будет 71 вместо 0.

Я сам использовал этот подход, основываясь на этом ответе , и он работает.

Edit 1: вы обрабатываете чтение RS232 синхронно, что я действительно не рекомендую, функция чтения должна запускаться автоматически, когда данные доступны в порту, что-то вроде этого:

private string SerialDataReceived = string.Empty
private void button1_Click(object sender, EventArgs e)
{
// new instance of the COM port
port = new SerialPort(ComPort, 115200, Parity.None, 8, StopBits.One);
// start port lessener
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
// Begin communications and wait for nad to reboot completly
port.Open();

//send your AT Commands
 port.Write("ATE0\r\n");
// check the response 'if Command is successfull it reply with something +Ok'
if(SerialDataReceived.ToLower().Contains("ok"))
}

//event will be fired each time a new data are available in the port
     private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
       {
            // Show all the incoming data in the port's buffer
            SerialDataReceived += port.ReadExisting();
        }

теперь в функции отправки вы должны проверить, есть ли в конце ответ, содержащий + CMGS :,

...