Настольная книга по Linux/Вопросы по программной отправке SMS: различия между версиями

Содержимое удалено Содержимое добавлено
Cvv (обсуждение | вклад)
Нет описания правки
Нет описания правки
Строка 49:
 
P.S. для программной реализации лучше конечно использовать PDU режим, изучением которого я и займусь. Но как-то там всё странно с кодированием сообщения
 
== Подготовка PDU-сообщения для отправки SMS ==
 
Как раз программную реализацию я недавно делал. Вот пример 100% рабочего кода на С.
Пример иллюстрируется предельно простой, то есть нет поддержки различных кодировок,
нет работы с режимами отправки, это просто отправная точка для тех, кому нужно разобраться.
По этой же причине код не написан настолько компактно, насколько С это позволяет.
PDU формируется для команды AT+CMGS. Работать с ней вот как:
посылаете модему "AT+CMGS=<Длина PDU>"
Модем Вам ответит символом ">"
Вводите PDU и посылаете символ CTRL-Z (или жмете на клавиатуре)
Если PDU сформирована верно модем отошлет СМС на нужный номер (он внутри PDU)
{
char* tmps[256];
char* st=" ";
char* num="internationl";
char* msg="Sample message for PDU mode test"
unsigned char i,j,x,n,inputs;
tmps[0]=0;
// Это заголовок. вкратце: "послать", "с моего номера", "СМС-центр - тот, что в телефоне"
strcpy(tmps,"0011000B91");
// На какой номер отправлять. Номер в интернациональном стандарте должен быть представлен
// без символа "+" и каждая пара цифр "развернута".
// Пример: Для посылки СМС на номер "+70123456789" запись должна быть пополнена "F"
// То есть исходный номер преобразуется в: "70123456789F". Теперь развернем каждую
// пару цифр номера. Получим: "0721436587F9", итак:
strcat(tmps,"0721436587F9");
strcat(tmps,"0000AA"); // Тоже служебные поля.
// Тут должно быть в шестнадцатиричном виде проставлена длина некодированного сообщения.
i=strlen(msg); // Получим длину сообщения
st[0]=hex[(i >> 4)]; // Получим старшую часть байта в виде символа
strcat(tmps,st); // Добавим к строке
st[0]=hex[(i & 0x0F)]; // Младшую часть байта ..
strcat(tmps,st); // ..Аналогично
// Дальше начинается перекодирование ASCII в PDU формат.
j=0;
x=1;
while (j<i)
{
n=msg[j] << 1;
n=(n >> x) | (msg[j+1] << (8-x));
j++;
x++;
if (x==8)
{
x=1;
j++;
}
st[0]=hex[(n >> 4)];
strcat(tmps,st);
st[0]=hex[(n & 0x0F)];
strcat(tmps,st);
}
// Осталось только вычислить длину для AT+CMGS=?
i=(strlen(tmps)-2)>>1;
// Вот и все. Длина для команды - в переменной i
// Готовое сообщение - в tmps.
 
== полезные ссылки по отправке SMS ==