При отправке СМС выдается ошибка CMS 304 - PullRequest
1 голос
/ 06 марта 2012

Я работаю над программой на C #, которая может отправлять SMS с моего компьютера с помощью моего GSM-модема, и большая часть моей программы работает.

Я могу отправлять большинство команд Hayes AT, например:«AT» и «AT + CGMI; + CGMM», который возвращает сообщение «ОК», поэтому я знаю, что могу связаться с модемом.

Однако у меня действительно есть проблемы с отправкой стандартного 7-битного закодированного сообщенияот модема до моего мобильного телефона.

С помощью PDUspy я несколько уверен, что правильно кодирую свое сообщение.

Однако следующий код с треском проваливается:

public string SendEncodedSms(string reciever, string message)
{
  string response = GetResponse("AT+CMGF=0");
  if (isFine(response))
  {
    string encodedBody = "000100" + EncodedReceiver(reciever) + "0000";
    encodedBody += EncodeToSeptet(message);

    int cmgs_header = encodedBody.Length / 2;

    port.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r\n");
    port.WriteLine(encodedBody + (char)26);

    return ReadResponse(300);
  }
  else throw new ApplicationException("Cant go into SMS PDU mode");
}

Там есть пять вызовов функций внутри:

  • GetResponse () - это функция, которая работает в качестве оболочки при взаимодействии с модемом - всегда следя за тем, чтобы каждая команда заканчивалась на "\ r"и возвращает OK или Error в зависимости от ответа от модема.

  • isFine () - простая функция, которая проверяет, содержит ли ответ GetResponse ()" OK "сообщение.

  • ReadResponse () возвращает любой ответ от модема, в порядке ли это или любые сообщения об ошибках и все, что также может быть встроено между командой AT и сообщением о состоянии.

  • EncodeReceiver () кодируетномер телефона получателя в обратной записи.Например, 12345678 становится 21436587.

  • EncodeToSeptet () Кодирует сообщение из 8-битной нотации в 7-битную нотацию.

Все функции работают нормальноиспользуя шпиона PDU и ответы, отправленные в окно отладки.

Вызов SendEncodedSms("<my phone number>", "test") возвращает:

AT+CMGS=17

0001000A91xxxxxxxxxx000004F4F29C0E

+CMS ERROR: 304

Я заменил свой зашифрованный номер телефона из-за проблем с конфиденциальностью ...; -)

  • Есть ли кто-нибудь, кто может подсказать мне, в чем я ошибаюсь?

ОБНОВЛЕНО:

Ссылка намекала, что я неправильно вычислял cmgs_header.

После небольшого кода очистки я получил:

public string SendEncodedSms(string receiver, string message)
{
  if(isFine("AT+CMGF=0"))
  {
     string encodedBody = EncodedReceiver(receiver) + "0000";
     encodedBody += EncodeToSeptet(message);

     /* The +2 in calculation is a hack. Its probleby two of the octets 
      * in 000100 that should be a part of length calculation. But need 
      * to verify in against severeal sites.
      */
     int cmgs_header = (encodedBody.Length / 2) + 2;

     encodedBody = "000100" + encodedBody;

     // Rest is as before.

    ...

  }

  else ...
}

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Может быть это поможет вам.Почему вы не отправляете SMS в текстовом режиме?

0 голосов
/ 27 февраля 2014

Попробуйте заменить строку кода этим,

port.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r");

Некоторые модемы ожидают строго CR после длины. LF анализируется уже как данные, см. пример ниже:

AT+CMGS=14 CR
0001030691214365000004C9E9340B
...