Передача SMS как работать в PDU формате

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Dmitro
Открыл глаза
Сообщения: 64
Зарегистрирован: Пт дек 01, 2006 20:32:23
Откуда: Запорожье
Контактная информация:

Передача SMS как работать в PDU формате

Сообщение Dmitro »

У меня вот такой вопрос: как организовать процесс передачи смс в PDU формате, так чтобы номер адресата брался из SIM карты, а не программировался в массиве памяти программ???
Последний раз редактировалось Dmitro Вс апр 15, 2007 13:08:47, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Мышонок
Друг Кота
Сообщения: 3792
Зарегистрирован: Чт сен 14, 2006 11:42:09
Откуда: Обитаю на чердаке
Контактная информация:

Сообщение Мышонок »

Кор-роче СклиХасовский, пишите термины и аббревиатуры правильно! Или оригинальные, или правильный русский перевод! :evil:
Память очень интересная штука: бывает так, что запомнишь одно, а вспомнишь другое...
Реклама
IrWert
Родился
Сообщения: 1
Зарегистрирован: Пн июн 18, 2007 12:27:58

Сообщение IrWert »

чППВЭЕ-ФП ФБН РТПУФЩЕ БФ-ЛПНБОДЩ, ЪБРТПУЙ РП ОПНЕТХ ЙЪ УЙНЛБТФЩ - ПО Й РТЙДЕФ, ЧПФ Й ЧУФБЧЙЫШ Ч ПФРТБЧМСЕНПЕ УППВЭЕОЙЕ...
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Re: Передача SMS как работать в PDU формате

Сообщение tych »

Dmitro писал(а):У меня вот такой вопрос: как организовать процесс передачи смс в PDU формате, так чтобы номер адресата брался из SIM карты, а не программировался в массиве памяти программ???
Я управлял телефоном с ПК и записывал обмен по COM-порту - там сразу все команды и ответы видно.

Програмы для КОМ-порта в задаче 4 z4 курса в моем профиле и добавьте к линку /gsm.htm
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

есть пару вопросов, телефон не работает в текстовом режиме, остаёться только PDU, подскажите как создать строку PDU из нормального текста и номера телефона?
Изображение
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Ну там же не только номер телефона, там телефон смс - центра, в заголовок вроде входит размер смс, который сразу нужно посчитать...
Точно не помню, давно делал, прога на работе . До вторника подождет ?
Реклама
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Подожду если не опередят. :)
Изображение
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

переводим телефон строчкой, должен окнуть в ответ
[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 формате

Сообщение TechMike »

Dmitro писал(а):У меня вот такой вопрос: как организовать процесс передачи смс в PDU формате, так чтобы номер адресата брался из SIM карты, а не программировался в массиве памяти программ???
Могу поделиться исходником на AVR Studio+winavr, но номер получателя берется из переменой, в которую он парсится из SIM-карты (первые пять номеров). Все сделано функцией, на вход подаешь номер получателя и текст сообщения на латинице.

Сам неделю вечерами возился с PDU, закодировать удалось, с раскодировкой пока не разобрался.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Было бы интересно)
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

А есть у когото программа для кодировки в PDU на ПК?
Изображение
Аватара пользователя
Man
Встал на лапы
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Попал комне siemens с35i решил научится отправлять с него смс ,чтоб в будущем использовать для gsm сигнализации. Для начала собрал простой адаптер на max232 подключил к компу, через SiMoCo пытаюсь разобраться с AT командами.
На данный момент непонятно в каком формате отправляется сама смс , незнаю поддерживает этот сименс текстовый режим или нет.
Также интересует в каком формате лучше отправлять смс ( текстовом или PDU) чтобы в будущем при подключении другой модели телефона siemens непришлось значительно переделывать программу.
Научился через библиотеку CVAVR на м8 отправлять данные через UART пока принимаю ток терминалкой.
Вложения
232.JPG
Адаптер
(61.13 КБ) 945 скачиваний
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

У меня тож siemens с35, чтобы проверить какой режим СМС поддержует телефон, AT+CMGF=1 если ответ ОК тогда тел поддержует текстовый режим, а если ERROR тогда AT+CMGF=0, если ответ ОК тогда телефон поддержует СМС в формате PDU.
Изображение
Аватара пользователя
Man
Встал на лапы
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Попробовал эти 2 команды телефон ответил ОК на AT+CMGF=0 значит надо капать в сторону PDU.
Утя манул по АТ командам английский? кадато натыкался на русский негде найти немагу :(
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

У мну руского нету :(

Я вот скачал SiMoCo , подключил всё ОК, попробовал написть СМС и когда нажал отослать, отключил тел от СОМ порта. Потом сохранив из окна АТ терминала что он посылает при СМС. вот что получилось:

Код: Выделить всё

AT+CMGS=43
07918350000005F131000B810859822945F20000A821D4E2940A9A36A7A069F2E80C3293DAE03099053983206AD29995CD6233
//TEST SMS SIGNALIZACIY NA TINY2313
Потом отправил эти строки программой AT terminal (скачал гдето из нета), и когда в конце строки с PDU кодом самой СМС уюрал символ СМС не отправилось, а когда отправил вместе с этим ероглифом, всё отпрвилось. Теперь есть вопрос как этот непонятный символ перенести в Си чтобы AVR смог отправить СМС? Что в конце строки PDU надо ставить именно уже в Си?
Изображение
Аватара пользователя
shtorm
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25
Контактная информация:

Сообщение shtorm »

хе...я тоже както замучился с этим делом и именно с сименс35, к стати для проверки потдерживаемых форматов: AT+CMGF=? если 0 - PDU 1 - Text. могу уверенно сказать что там только PDU и не только там но и симены 65-70 серии тоже потдерживают только PDU, печально ((( а чтоб долго не мучались выкладываю архив со всем необходимым (статьи, книги, софт) которые пригодились чтоб понять PDU. если кто напишет нормальные ф-ции по кодировке и разкодировке хотелосьбы посмотреть, ибо у меня получилось грамосский код, поэтому я от этого отказался и взял самунг Х100 для этих целей, там Text.

Архив [5Mb]
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Krik99, ну ... В моем предыдущим посте - программа ...
Хоть бы посмотрел...
sh[0]=26;
out+=sh[0];// дописываем CTRL+Z
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Решил начать с самого простейшего.
В программе у мну есть такие функции для 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);         
}
Тоесть мне для передачи в Си нужно дописать к PDU строке 26 в конце?

Код: Выделить всё

usart_tx_text("AT+CMGS=43\r\n");
//usart_tx_text("07918350000005F131000B810859822945F20000A821D4E2940A9A36A7A069F2E80C3293DAE03099053983206AD29995CD6233\r\n");
usart_tx_text("07918350000005F131000B810859822945F20000A821D4E2940A9A36A7A069F2E80C3293DAE03099053983206AD29995CD623326\r\n");
И надо передавать после AT+CMGS=43 и строки PDU код \r\n ???
Изображение
Аватара пользователя
Man
Встал на лапы
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Shtorm спасибо за архив , думаю хватит чтобы разобраться :)
Завтра подключу мегу к телефону буду пробать, пока думаю как сделать согласование между 3.7 в и 5.0 в (толи контролер питать от 3.7 или через резистор и стабилитроном на минус ) первый варянт подходит неполностью ,так как еше будет подключена eeprom а ей надо 5в , ну или на худой конец воткнуть max232.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Почти :)
Передаешь 3 строчки
1. AT+CSCS=\"UCS2\"\r\n
2.AT+CMGS= - здесь вычисленная длина 3 строчки - 3 символа \r\n
Должна ответить >
3.Сама строчка смс, которая заканчивается символом 26 в десятичной
и \r\n

Все.
Ждешь ответа на результат
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»