Я работаю над программой на 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 ...
}