|
Отправка СМС из памяти в PDU режиме, Отправка СМС из памяти в PDU режиме на произвольный номер |
|
|
|
May 31 2012, 12:52
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677

|
Надеюсь, что в правильную тему пишу… Уважаемые форумчане, помогите… скоро начну биться головой обо что-нибудь) Делаю GSM-модуль: прибор на базе модуля Quectel M72 и AVR. Прибор отслеживает состояния подключенных датчиков и по наступлению определенных событий отправляет СМСки и щелкает исполнительными элементами. Конфигурируется прибор с компа, но работает самостоятельно. По схеме наверное необходимо отметить, что AVR посредством одного UARTа подключен к M72, а вторым подключается к компу (только для конфигурации). Комп с модемом связи не имеет. Собственно железных вопросов нет – все слава богу работает, но вот с отправкой СМС проблема. Но тут стоит опять немного пояснений дать. Прибор должен иметь возможность отправлять СМС большому числу абонентов (последовательно) и на каждое из событий предполагается свой текст. При этом тесты СМС и имена абонетов нужно писать на русском. Держать всю эту кучу инфы в слабенькой АВР не представляется возможным, поэтому было принято стратегическое решение номера, имена абонентов а так же тексты СМС хранить в самом М72. А в процессоре держать только индексы телефонной книги и хранилища СМС. Т.е. когда я все это продумывал в теории, думал что будет так: АВРка говорит М72, а оправь-ка СМС № 1 из памяти абоненту № 2 из телефонной книги, а потом СМС № 3 абоненту№ 8. Но тут оказалась проблема: нет такой АТ-команды. Думаю, ладно, буду считывать телефонный номер абонента в буфер и просто буду подставлять в команду отправки СМС из памяти. Но тут подставил Режим PDU: оказалось там прямо в тексте хранится номер получателя и его нельзя отправить на произвольный номер. Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает. Собственно вопрос, можно ли на практике реализовать придуманный мной подход, и как это сделать? Возможно я не до конца разобрался во всех премудростях прекрасного PDU-режима Очень много написал, извиняюсь. Заранее спасибо.
--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
|
|
|
|
|
 |
Ответов
|
Jun 1 2012, 09:23
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677

|
Цитата(CADiLO @ Jun 1 2012, 13:10)  Если в текстах будут одинаковые словосочетания типа "уважаемый абонент", то эти части можно хранить отдельно и подставлять при построении фразы чтобы не держать их в каждой фразе. То есть текст стоит оптимально продумать. Спасибо за идейку, но к сожалению, тексты СМС записываются пользователем в процессе конфигурации прибора, а что он там напишет мне не известно))) Цитата(Frolov Kirill @ Jun 1 2012, 13:15)  Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU. подскажите, поподробнее, может ссылку каку-нить: т.е. я из этого ИСО могу конвертнуть в PDU и обратно без потери информации? а как это делать?
--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
|
|
|
|
|
Jun 1 2012, 09:33
|
Местный
  
Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643

|
Цитата(den1s @ Jun 1 2012, 13:23)  подскажите, поподробнее, может ссылку каку-нить: т.е. я из этого ИСО могу конвертнуть в PDU и обратно без потери информации? а как это делать? Если код буквы менее 128 -- кодируется как есть (было 0x30 --> стало 0x0030 в UCS2). Если код буквы более или равен 128 -- прибавляется 0x360: было 0xB0 (русская A заглавная) --> стало 0x410 в UCS2. Обратно точно также. Работает только для ряда языков стран бывшего СССР: http://en.wikipedia.org/wiki/ISO/IEC_8859-5Преимуществе перед windows-1251 -- не нужна таблица перекодировки во-первых, во-вторых очень удобно использовать текст прямо в исходниках (он хранится в UTF-8, который легко декодируется до UCS2 и легко же декорируется в ISO-8859-5). В последнем случае смысл в том, что при программировании на языке C тип wchar_t можно сделать 8-битным и практически от библиотеки C не нужна полноценная поддержка Unicode (её обычно в микроконтроллерах и нет). И в качестве wchar можно использовать на самом деле ISO-8859-5, а в качестве char -- UTF-8. И всё будет работать (#define wprintf printf и т.п.) точно также, как и с нормальной C-библиотекой на PC. Но только для русского, украинского, беларусского языков.
|
|
|
|
|
Jun 1 2012, 10:19
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677

|
Цитата(Frolov Kirill @ Jun 1 2012, 13:33)  Если код буквы менее 128 -- кодируется как есть (было 0x30 --> стало 0x0030 в UCS2). Если код буквы более или равен 128 -- прибавляется 0x360: было 0xB0 (русская A заглавная) --> стало 0x410 в UCS2. Обратно точно также. Работает только для ряда языков стран бывшего СССР: http://en.wikipedia.org/wiki/ISO/IEC_8859-5Преимуществе перед windows-1251 -- не нужна таблица перекодировки во-первых, во-вторых очень удобно использовать текст прямо в исходниках (он хранится в UTF-8, который легко декодируется до UCS2 и легко же декорируется в ISO-8859-5). В последнем случае смысл в том, что при программировании на языке C тип wchar_t можно сделать 8-битным и практически от библиотеки C не нужна полноценная поддержка Unicode (её обычно в микроконтроллерах и нет). И в качестве wchar можно использовать на самом деле ISO-8859-5, а в качестве char -- UTF-8. И всё будет работать (#define wprintf printf и т.п.) точно также, как и с нормальной C-библиотекой на PC. Но только для русского, украинского, беларусского языков. Во, блин, класс)). Спасибо! Нужно, конечно еще допилить до формата который можно в М72 отправить: ведь чтобы отправить в него символ с кодом 0х0410 нужно послать в модем 4 АСКИшных символа 0 4 1 0 (или 0х30 0х34 0х31 0х30). Вдруг поможет из тех кто ни знает.
--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
|
|
|
|
|
Jun 1 2012, 11:10
|
Местный
  
Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643

|
Цитата(den1s @ Jun 1 2012, 14:19)  ведь чтобы отправить в него символ с кодом 0х0410 нужно послать в модем 4 АСКИшных символа 0 4 1 0 (или 0х30 0х34 0х31 0х30). Вдруг поможет из тех кто ни знает. Не факт. Если всё сообщение состоит из ASCII (ну почти, GSM-алфавит немного отличается), то лучше кодирование в 7-битный GSM-алфавит (меньше количество SMS, или больше вмещается в одно сообщение, 160 символов против 70). Код unsigned sms_encode_ucs2(char *dest, const wchar_t *msg, unsigned maxsz) { unsigned code; unsigned n; n=0; while (maxsz && *msg) { /* ISO8859-5 to UCS2 */ if (! (*msg&0x80)) code=*msg; else code=*(const unsigned char*)msg+0x360; sprintf(&dest[n], "%4.4X", code); n+=4; msg++, maxsz--; } dest[n]=0; return n; }
/* VS */
static uint_fast8_t sms_decode_7bit( wchar_t *text, const uint8_t *msg, uint_fast8_t size ) { uint_fast16_t byte; /* сдвиговый регистр */ uint_fast8_t nb; /* число битов в byte */ uint_fast8_t n; /* число байт записанных в text */ unsigned code; n=0; byte=nb=0; while (size--) { byte=byte | (*msg++ << nb), nb+=8; while (nb >= 7) { code=byte&0x7f; byte>>=7; if (code>=128) code-=0x360; /* UCS2 to ISO8859-5 */ switch(code) { case 0: code = '@'; break; case 2: code = '$'; break; default: break; } text[n]=code; n++, nb-=7; } } text[n]=0; return n; }
|
|
|
|
|
Jun 1 2012, 11:26
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677

|
Цитата(Frolov Kirill @ Jun 1 2012, 15:10)  Не факт. Если всё сообщение состоит из ASCII (ну почти, GSM-алфавит немного отличается), то лучше кодирование в 7-битный GSM-алфавит (меньше количество SMS, или больше вмещается в одно сообщение, 160 символов против 70). Это ясно, но в таком случае нужно разбирать в какой кодировке записан текст... это в теории все делается... но на практике не за горами срок сдачи проекта, а работы еще не в проворот. Пока ограничусь только кодировкой UCS и сообщениями в 70 символов. Со временем, надеюсь доделать. Сейчас главное русский текст.
--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
|
|
|
|
Сообщений в этой теме
den1s Отправка СМС из памяти в PDU режиме May 31 2012, 12:52 Nixon Вы ошибаетесь насчет хранения номера в тексте sms.... May 31 2012, 14:20 CADiLO Эта тема поднималась год назад и такая команда был... May 31 2012, 14:34 den1s Цитата(Nixon @ May 31 2012, 18:20) Вы оши... May 31 2012, 17:23 CADiLO Команда эта есть в любом модуле, но не в любом она... May 31 2012, 18:20 den1s Цитата(CADiLO @ May 31 2012, 22:20) Коман... May 31 2012, 19:01  Frolov Kirill Цитата(den1s @ May 31 2012, 23:01) интере... Jun 1 2012, 09:15  =F8= Цитата(den1s @ May 31 2012, 22:01) Есть к... Jun 1 2012, 09:26   Frolov Kirill Цитата(=F8= @ Jun 1 2012, 13:26) Все изве... Jun 1 2012, 11:07    =F8= Цитата(Frolov Kirill @ Jun 1 2012, 14:07)... Jun 1 2012, 12:29     den1s Цитата(=F8= @ Jun 1 2012, 16:29) Я сам не... Jun 1 2012, 13:20     Frolov Kirill Цитата(=F8= @ Jun 1 2012, 16:29) Какие? В... Jun 1 2012, 14:16      _Артём_ Цитата(Frolov Kirill @ Jun 1 2012, 17:04)... Jun 1 2012, 14:52      =F8= 2 Frolov Kirill.
Ваша взяла. Посмотрел на цены мла... Jun 1 2012, 15:06       _Артём_ Цитата(=F8= @ Jun 1 2012, 18:06) Посмотре... Jun 1 2012, 15:12        =F8= Цитата(_Артём_ @ Jun 1 2012, 18:12) Еррат... Jun 1 2012, 15:38      den1s Цитата(Frolov Kirill @ Jun 1 2012, 18:16)... Jun 1 2012, 15:44 andrewlekar У вас у AVR сколько памяти? Если вам 300 байт стек... May 31 2012, 18:30 Frolov Kirill Цитата(den1s @ May 31 2012, 16:52) Забира... Jun 1 2012, 08:48 den1s Цитата(Frolov Kirill @ Jun 1 2012, 12:48)... Jun 1 2012, 09:13  Frolov Kirill Цитата(den1s @ Jun 1 2012, 13:13) Трудно ... Jun 1 2012, 09:25   _Артём_ Цитата(Frolov Kirill @ Jun 1 2012, 12:25)... Jun 1 2012, 13:40 den1s Цитата(den1s @ May 31 2012, 16:52) Забира... Jun 1 2012, 09:05      Frolov Kirill Цитата(den1s @ Jun 1 2012, 15:26) Это ясн... Jun 1 2012, 13:40 CADiLO PIC24 со своими таблицами в самый раз. А PIC16/18 ... Jun 1 2012, 11:10 CADiLO Тогда проще всего держать в памяти номера абоненто... Jun 1 2012, 13:28 CADiLO Просто кто к чему привык. Ну и еще два факта - Атм... Jun 1 2012, 13:51 ArtemKAD ЦитатаПосмотрел на цены младшей 100-й серии STM32 ... Jun 1 2012, 16:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|