Передача SMS как работать в PDU формате
-
Dmitro
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Пт дек 01, 2006 20:32:23
- Откуда: Запорожье
- Контактная информация:
Передача SMS как работать в PDU формате
У меня вот такой вопрос: как организовать процесс передачи смс в PDU формате, так чтобы номер адресата брался из SIM карты, а не программировался в массиве памяти программ???
Последний раз редактировалось Dmitro Вс апр 15, 2007 13:08:47, всего редактировалось 1 раз.
- Реклама
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Re: Передача SMS как работать в PDU формате
Я управлял телефоном с ПК и записывал обмен по COM-порту - там сразу все команды и ответы видно.Dmitro писал(а):У меня вот такой вопрос: как организовать процесс передачи смс в PDU формате, так чтобы номер адресата брался из SIM карты, а не программировался в массиве памяти программ???
Програмы для КОМ-порта в задаче 4 z4 курса в моем профиле и добавьте к линку /gsm.htm
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Реклама
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
переводим телефон строчкой, должен окнуть в ответ
[code]
if (send_string("AT+CSCS=\"UCS2\"",0) != 'O')
{
MessageBox(" Не окает мобилка","В ответ на AT+CSCS",MB_OK);
return;
}
[/code]
Теперь формируем строку выдачи фунцией out_stroka, в которую передаем длину номера, длину смс, а сами массивы объявлены глобально фунция возвращает нам длину в байтах и копирует строку в массив вывода
int l=out_stroka( dlina_tel, dlina_sms);
Длина нам нужна перед выдачей самой смс, в предварительное сообщение
[code]
int CSms_1Dlg::out_stroka(int dlina_tlf, int dlina_sms)
{
char sh[5];// для перевода числа в строку
CString out="";// строка для вывода
out+="00";// it is only an indicator of the length of the SMSC information supplied (0)
out+="11";//First octet of the SMS-SUBMIT message.
out+="00";//TP-Message-Reference. The "00" value here lets the phone set the message reference number itself.
//---------
if(dlina_tlf==12)
{
out+="0C";// Address-Length. Length of phone number
}
else // 11
{
out+="0B";
}
[/code]
Для Украины - длина номера 12 символов , для России - вроде 11
Пример номера Украины 380962638123
[code]
//---------
out+="91";//Type-of-Address. (91 indicates international format of the phone number).
//---------
out+=tlf[1];// здесь я не выябывался с циклом
out+=tlf[0];// обычная подстановка
out+=tlf[3];
out+=tlf[2];
out+=tlf[5];
out+=tlf[4];
out+=tlf[7];
out+=tlf[6];
out+=tlf[9];
out+=tlf[8];
if(dlina_tlf==12)
{
out+=tlf[11];
}
else
{
out+="F";// запоняем ф - кой пустое место
}
out+=tlf[10]; // с телефонным номером - все
[/code]
На этот момент строка вывода выглядит так с телефонным номером Украины 380969418990
'0011000C91839096149809'
[code]
out+="00";//TP-PID. Protocol identifier
out+="08";//TP-DCS. Data coding scheme. 18 - don't save at history, 08 - save
out+="C1";//TP-Validity-Period. C1 means 1 week
// длина смс сообщения в байтах в 16 -ричном виде
itoa(dlina_sms*2,sh,16);// переводим
if((dlina_sms*2)<16) // если меньше 16, записываем 0
{
out+="0";
out+=sh[0]; // число двузначное
}
else
{
out+=sh[0];
out+=sh[1];
} // записали длину смс - сообщения
[/code]
Длину смс-сообщения (в байтах) умножаем на 2 и выводим в текстовом 16-ричном виде. Например, длина смс 40 байтов - умножаем на 2 =80 - в 16 - ричном текстовом виде будет '50' , у меня в данном случае '62'
Дальше - перекодировка
[code]
-----------------------------------------------
unsigned char q; // для сравнения нужна беззнаковая переменная
unsigned char temp;
for (int i=0;i<dlina_sms;i++)//
//
{//
q=textsms[i];//
//
if(q >= 0xC0)// для кириллицы//
//
{
if(q== 184)// исключение для 2 букв ё и что-то еще
{
out+="0451";
break;
}
if(q== 168)
{
out+="0401";
break;
}
//--------------
temp=q-0xb0;
_itoa_s(temp,sh,16);
out+="04";
if(temp<16)
{
out+="0";
out+=sh[0];
}
else
{
out+=sh[0];
out+=sh[1];
}
}
else // для точек, пробелов, и проч....
{
_itoa_s(q,sh,16);
out+="00";
if(q<16)
{
out+="0";
out+=sh[0];
}
else
{
out+=sh[0];
out+=sh[1];
}
}
}
// вывели строку - внимание - украинские символы будут неправильно кодироваться !!!!
// только !!!! CP1251 - русские буквы !!!!! или английские
sh[0]=26;
out+=sh[0];// дописываем CTRL+Z
sh[0]=13;
out+=sh[0];// дописываем вк
// строка сформирована -----------------------------------------------------------
dlina_strok=out.GetLength();// узнаем ее длину
// копируем в буфер вывода
strcpy_s(temp_str,out);
int l1;
l1= dlina_strok-3;
l1/=2;
return l1;// возвращаем длину в байтах всего сообщения
}
[/code]
----------------------------------------------------------
Обратите внимание, что реальная длина в байтах на 3 больше того, что мы возвращаем.
Выводим заголовок с этой длиной
[code]
itoa(l,sh,10);// конвертируем в строку - значение - десятичное
CString dig="AT+CMGS=";
if (l<100)
{
dig+=sh[0];
dig+=sh[1];
}
else
{
dig+=sh[0];
dig+=sh[1];
dig+=sh[2];
}
if (send_string(dig,1) != '>')
{
MessageBox(" Чето тупит мобилка","Ответ отсутствует или искажен!",MB_OK);
isin.close();
return;
}
[/code]
'>' - это приглашения ввода самого текста смс.
ВВодим
[code]
char s[1];
char r[1];
for (int a=0;a<dlina_strok;a++)
{
s[0]=temp_str[a];
port.Write(s, 1); // эту инфу читать нет смысла, знаем и так
port.Read(r,1);
}
[/code]
Дальше - долго ждем - от провайдера зависит - результата отправления - или ок или еррор, как повезет :)
Все вроде.
[code]
if (send_string("AT+CSCS=\"UCS2\"",0) != 'O')
{
MessageBox(" Не окает мобилка","В ответ на AT+CSCS",MB_OK);
return;
}
[/code]
Теперь формируем строку выдачи фунцией out_stroka, в которую передаем длину номера, длину смс, а сами массивы объявлены глобально фунция возвращает нам длину в байтах и копирует строку в массив вывода
int l=out_stroka( dlina_tel, dlina_sms);
Длина нам нужна перед выдачей самой смс, в предварительное сообщение
[code]
int CSms_1Dlg::out_stroka(int dlina_tlf, int dlina_sms)
{
char sh[5];// для перевода числа в строку
CString out="";// строка для вывода
out+="00";// it is only an indicator of the length of the SMSC information supplied (0)
out+="11";//First octet of the SMS-SUBMIT message.
out+="00";//TP-Message-Reference. The "00" value here lets the phone set the message reference number itself.
//---------
if(dlina_tlf==12)
{
out+="0C";// Address-Length. Length of phone number
}
else // 11
{
out+="0B";
}
[/code]
Для Украины - длина номера 12 символов , для России - вроде 11
Пример номера Украины 380962638123
[code]
//---------
out+="91";//Type-of-Address. (91 indicates international format of the phone number).
//---------
out+=tlf[1];// здесь я не выябывался с циклом
out+=tlf[0];// обычная подстановка
out+=tlf[3];
out+=tlf[2];
out+=tlf[5];
out+=tlf[4];
out+=tlf[7];
out+=tlf[6];
out+=tlf[9];
out+=tlf[8];
if(dlina_tlf==12)
{
out+=tlf[11];
}
else
{
out+="F";// запоняем ф - кой пустое место
}
out+=tlf[10]; // с телефонным номером - все
[/code]
На этот момент строка вывода выглядит так с телефонным номером Украины 380969418990
'0011000C91839096149809'
[code]
out+="00";//TP-PID. Protocol identifier
out+="08";//TP-DCS. Data coding scheme. 18 - don't save at history, 08 - save
out+="C1";//TP-Validity-Period. C1 means 1 week
// длина смс сообщения в байтах в 16 -ричном виде
itoa(dlina_sms*2,sh,16);// переводим
if((dlina_sms*2)<16) // если меньше 16, записываем 0
{
out+="0";
out+=sh[0]; // число двузначное
}
else
{
out+=sh[0];
out+=sh[1];
} // записали длину смс - сообщения
[/code]
Длину смс-сообщения (в байтах) умножаем на 2 и выводим в текстовом 16-ричном виде. Например, длина смс 40 байтов - умножаем на 2 =80 - в 16 - ричном текстовом виде будет '50' , у меня в данном случае '62'
Дальше - перекодировка
[code]
-----------------------------------------------
unsigned char q; // для сравнения нужна беззнаковая переменная
unsigned char temp;
for (int i=0;i<dlina_sms;i++)//
//
{//
q=textsms[i];//
//
if(q >= 0xC0)// для кириллицы//
//
{
if(q== 184)// исключение для 2 букв ё и что-то еще
{
out+="0451";
break;
}
if(q== 168)
{
out+="0401";
break;
}
//--------------
temp=q-0xb0;
_itoa_s(temp,sh,16);
out+="04";
if(temp<16)
{
out+="0";
out+=sh[0];
}
else
{
out+=sh[0];
out+=sh[1];
}
}
else // для точек, пробелов, и проч....
{
_itoa_s(q,sh,16);
out+="00";
if(q<16)
{
out+="0";
out+=sh[0];
}
else
{
out+=sh[0];
out+=sh[1];
}
}
}
// вывели строку - внимание - украинские символы будут неправильно кодироваться !!!!
// только !!!! CP1251 - русские буквы !!!!! или английские
sh[0]=26;
out+=sh[0];// дописываем CTRL+Z
sh[0]=13;
out+=sh[0];// дописываем вк
// строка сформирована -----------------------------------------------------------
dlina_strok=out.GetLength();// узнаем ее длину
// копируем в буфер вывода
strcpy_s(temp_str,out);
int l1;
l1= dlina_strok-3;
l1/=2;
return l1;// возвращаем длину в байтах всего сообщения
}
[/code]
----------------------------------------------------------
Обратите внимание, что реальная длина в байтах на 3 больше того, что мы возвращаем.
Выводим заголовок с этой длиной
[code]
itoa(l,sh,10);// конвертируем в строку - значение - десятичное
CString dig="AT+CMGS=";
if (l<100)
{
dig+=sh[0];
dig+=sh[1];
}
else
{
dig+=sh[0];
dig+=sh[1];
dig+=sh[2];
}
if (send_string(dig,1) != '>')
{
MessageBox(" Чето тупит мобилка","Ответ отсутствует или искажен!",MB_OK);
isin.close();
return;
}
[/code]
'>' - это приглашения ввода самого текста смс.
ВВодим
[code]
char s[1];
char r[1];
for (int a=0;a<dlina_strok;a++)
{
s[0]=temp_str[a];
port.Write(s, 1); // эту инфу читать нет смысла, знаем и так
port.Read(r,1);
}
[/code]
Дальше - долго ждем - от провайдера зависит - результата отправления - или ок или еррор, как повезет :)
Все вроде.
Последний раз редактировалось urry Вт июн 30, 2009 09:56:34, всего редактировалось 1 раз.
-
TechMike
- Прорезались зубы
- Сообщения: 247
- Зарегистрирован: Сб дек 15, 2007 23:00:54
- Откуда: Moscow
- Контактная информация:
Re: Передача SMS как работать в PDU формате
Могу поделиться исходником на AVR Studio+winavr, но номер получателя берется из переменой, в которую он парсится из SIM-карты (первые пять номеров). Все сделано функцией, на вход подаешь номер получателя и текст сообщения на латинице.Dmitro писал(а):У меня вот такой вопрос: как организовать процесс передачи смс в PDU формате, так чтобы номер адресата брался из SIM карты, а не программировался в массиве памяти программ???
Сам неделю вечерами возился с PDU, закодировать удалось, с раскодировкой пока не разобрался.
Попал комне siemens с35i решил научится отправлять с него смс ,чтоб в будущем использовать для gsm сигнализации. Для начала собрал простой адаптер на max232 подключил к компу, через SiMoCo пытаюсь разобраться с AT командами.
На данный момент непонятно в каком формате отправляется сама смс , незнаю поддерживает этот сименс текстовый режим или нет.
Также интересует в каком формате лучше отправлять смс ( текстовом или PDU) чтобы в будущем при подключении другой модели телефона siemens непришлось значительно переделывать программу.
Научился через библиотеку CVAVR на м8 отправлять данные через UART пока принимаю ток терминалкой.
На данный момент непонятно в каком формате отправляется сама смс , незнаю поддерживает этот сименс текстовый режим или нет.
Также интересует в каком формате лучше отправлять смс ( текстовом или PDU) чтобы в будущем при подключении другой модели телефона siemens непришлось значительно переделывать программу.
Научился через библиотеку CVAVR на м8 отправлять данные через UART пока принимаю ток терминалкой.
- Вложения
-
- 232.JPG
- Адаптер
- (61.13 КБ) 945 скачиваний
- Krik99
- Потрогал лапой паяльник
- Сообщения: 375
- Зарегистрирован: Вс мар 04, 2007 13:14:25
- Откуда: Украина
- Контактная информация:
У мну руского нету 
Я вот скачал SiMoCo , подключил всё ОК, попробовал написть СМС и когда нажал отослать, отключил тел от СОМ порта. Потом сохранив из окна АТ терминала что он посылает при СМС. вот что получилось:
Потом отправил эти строки программой AT terminal (скачал гдето из нета), и когда в конце строки с PDU кодом самой СМС уюрал символ
СМС не отправилось, а когда отправил вместе с этим ероглифом, всё отпрвилось. Теперь есть вопрос как этот непонятный символ перенести в Си чтобы AVR смог отправить СМС? Что в конце строки PDU надо ставить именно уже в Си?
Я вот скачал SiMoCo , подключил всё ОК, попробовал написть СМС и когда нажал отослать, отключил тел от СОМ порта. Потом сохранив из окна АТ терминала что он посылает при СМС. вот что получилось:
Код: Выделить всё
AT+CMGS=43
07918350000005F131000B810859822945F20000A821D4E2940A9A36A7A069F2E80C3293DAE03099053983206AD29995CD6233
//TEST SMS SIGNALIZACIY NA TINY2313Код: Выделить всё

- shtorm
- Нашел транзистор. Понюхал.
- Сообщения: 185
- Зарегистрирован: Чт янв 22, 2009 14:03:25
- Контактная информация:
хе...я тоже както замучился с этим делом и именно с сименс35, к стати для проверки потдерживаемых форматов: AT+CMGF=? если 0 - PDU 1 - Text. могу уверенно сказать что там только PDU и не только там но и симены 65-70 серии тоже потдерживают только PDU, печально ((( а чтоб долго не мучались выкладываю архив со всем необходимым (статьи, книги, софт) которые пригодились чтоб понять PDU. если кто напишет нормальные ф-ции по кодировке и разкодировке хотелосьбы посмотреть, ибо у меня получилось грамосский код, поэтому я от этого отказался и взял самунг Х100 для этих целей, там Text.
Архив [5Mb]
Архив [5Mb]
- Krik99
- Потрогал лапой паяльник
- Сообщения: 375
- Зарегистрирован: Вс мар 04, 2007 13:14:25
- Откуда: Украина
- Контактная информация:
Решил начать с самого простейшего.
В программе у мну есть такие функции для uart
Тоесть мне для передачи в Си нужно дописать к PDU строке 26 в конце?
И надо передавать после AT+CMGS=43 и строки PDU код \r\n ???
В программе у мну есть такие функции для uart
Код: Выделить всё
void usart_tx(unsigned char data){
while (!(UCSRA & (1<<5))); //ждём пока данные будут переданы
UDR=data; //передаём данные
}
void usart_tx_text(flash char *text){
for(;*text;text++)usart_tx(*text);
}
Код: Выделить всё
usart_tx_text("AT+CMGS=43\r\n");
//usart_tx_text("07918350000005F131000B810859822945F20000A821D4E2940A9A36A7A069F2E80C3293DAE03099053983206AD29995CD6233\r\n");
usart_tx_text("07918350000005F131000B810859822945F20000A821D4E2940A9A36A7A069F2E80C3293DAE03099053983206AD29995CD623326\r\n");
Shtorm спасибо за архив , думаю хватит чтобы разобраться 
Завтра подключу мегу к телефону буду пробать, пока думаю как сделать согласование между 3.7 в и 5.0 в (толи контролер питать от 3.7 или через резистор и стабилитроном на минус ) первый варянт подходит неполностью ,так как еше будет подключена eeprom а ей надо 5в , ну или на худой конец воткнуть max232.
Завтра подключу мегу к телефону буду пробать, пока думаю как сделать согласование между 3.7 в и 5.0 в (толи контролер питать от 3.7 или через резистор и стабилитроном на минус ) первый варянт подходит неполностью ,так как еше будет подключена eeprom а ей надо 5в , ну или на худой конец воткнуть max232.


