Отправка SMS через Nokia Mobile с помощью AT-команд

Я пытаюсь отправить SMS со своего мобильного телефона Nokia (C1-01) с помощью AT-команд, и я могу успешно отправить SMS с этим кодом vb.net.

Button_Send_Click:

Dim SMSPort = New SerialPort
    With SMSPort
        .PortName = "COM2"
        .BaudRate = 9600
        .Parity = Parity.None
        .DataBits = 8
        .StopBits = StopBits.One
        .Handshake = Handshake.None
        .DtrEnable = True
        .RtsEnable = True
        .NewLine = vbCrLf
    End With

    SMSPort.Open()

    SMSPort.Write("AT+CMGF=1" & vbCrLf)
    Threading.Thread.Sleep(200)

    SMSPort.Write("AT+CMGS=" & Chr(34) & TextBox1.Text & Chr(34) & vbCrLf) 'TextBox1.text = Recipient mobile number and chr(34) = "
    Threading.Thread.Sleep(200)

    SMSPort.Write("TEST MESSAGE" & Chr(26)) 'chr(26) = →
    Threading.Thread.Sleep(200)

    MsgBox(SMSPort.ReadExisting())

    SMSPort.Close()

Это работает нормально в первый раз, после активации этого кода я получил SMS на свой мобильный телефон TEST MESSAGE (блестяще), НО когда я нажимаю кнопку отправки во второй раз, я получил SMS на свой мобильный телефон, который содержит: AT+CMGF=1 AT+CMGS=+92XXYYYYYY TEST MESSAGE

Почему во второй раз он включает «AT-команды, т.е. AT+CMGF и т. д.» в SMS? Как я могу удалить ненужный текст из этого? Я также попробовал свойства SMSPort.DiscardInBuffer() и SMSPort.DiscardOutBuffer() после открытия и перед закрытием моего последовательного порта (SMSPort), но моя проблема не решается. Я много гуглил, но все тщетно, пожалуйста, помогите мне решить эту проблему.

Платформа: Microsoft Visual Basic 2010 с .NET 2.0.


person Muhammad Saqib    schedule 15.12.2013    source источник
comment
Просто любопытно, почему вы используете AT-команды на телефоне Nokia. Будет намного проще, если вы воспользуетесь библиотекой GSM. Я использовал пару библиотек с открытым исходным кодом, и они отлично работают. Я также выполнил AT-команды на микроконтроллере, подключенном к модулю barebone GSM, и дело в том, что вам придется использовать пару задержек, чтобы модуль GSM мог догнать то, что вы ему отправляете :)   -  person chris_techno25    schedule 23.02.2014


Ответы (3)


Прежде всего, вы должны серьезно переделать обработку AT-команд, чтобы

  • Прочитайте и проанализируйте каждую строку ответа, полученную от модема, пока не получите окончательный код результата. Это относится к каждому отдельному вызову командной строки, без каких-либо исключений. Подробнее см. этот ответ.
  • Никогда не вызывайте Threading.Thread.Sleep в любом коде, обрабатывающем AT-команды. См. этот ответ для получения более подробной информации о риске прерывания следующей команды.
  • В частности, для AT+CMGS вы также ДОЛЖНЫ дождаться ответа "\n\r> " перед отправкой данных, см. this ответьте (снова) для более подробной информации.

Прежде чем исправить эти фундаментальные проблемы, вы не можете ожидать какого-либо успешного поведения.

person hlovdal    schedule 22.12.2013
comment
Спасибо за ваш ответ, но уже слишком поздно, и сейчас я работаю над другим проектом. Но вскоре я снова открою этот проект, и если ваш ответ будет полезен, я приму его. @hlovdal - person Muhammad Saqib; 26.12.2013

Хорошо, сегодня я столкнулся с той же проблемой и решил ее, добавив "\r\n" в конец сообщения перед отправкой CTRL+Z (символ 26). Вы можете попробовать это только с "\n"

person Ali Yousuf    schedule 22.03.2014
comment
Спасибо за ваш ответ, но уже слишком поздно, и я сейчас работаю над другим проектом. Но скоро я снова открою этот проект, и если ваш ответ будет полезен, я обязательно приму его. @aly.yousuf7 - person Muhammad Saqib; 23.03.2014

Попробуй это

Dim SMSPort = New SerialPort
    With SMSPort
        .PortName = "COM2"
        .BaudRate = 9600
        .Parity = Parity.None
        .DataBits = 8
        .StopBits = StopBits.One
        .Handshake = Handshake.None
        .DtrEnable = True
        .RtsEnable = True
        .NewLine = vbCrLf
End With

SMSPort.Open()

SMSPort.WriteLine("AT" & Chr(13))
Threading.Thread.Sleep(200)

SMSPort.WriteLine("AT+CMGF=1" & Chr(13))
Threading.Thread.Sleep(200)

SMSPort.WriteLine("AT+CMGS=" & Chr(34) & TextBox1.Text & Chr(34)) 
Threading.Thread.Sleep(200)

SMSPort.WriteLine("TEST MESSAGE" & Chr(26))
Threading.Thread.Sleep(200)

MsgBox(SMSPort.ReadExisting())

SMSPort.Close()

Добавьте SMSPort.WriteLine("AT" & Chr(13)) и я заменил Write на WriteLine и удалил vbCrlf. Также добавлен Chr(13) в SMSPort.WriteLine("AT+CMGF=1")

person Sharp Coders    schedule 05.03.2014