SIM800L, реализация алгоритма формирующего sms на кириллице

Sirocco
Offline
Зарегистрирован: 28.09.2013

Есть GSM модуль SIM800L. Если специальным образом сформировать сообщение, то можно отправить sms на кириллице. Как формируется узнал тут: http://www.edgemodem.ru/forum/viewtopic.php?f=8&t=901

Цитирую:

01Само сообщение состоит из HEX-последовательности, прописанной ASCII-символами (0..9,A..F).
02Пример - надо отправить сообщение абоненту +79212345678 и в нем написать 'Привет'.
03ВНИМАНИЕ! РЕЧЬ ИДЕТ О ТОМ, КАК ЭТО СДЕЛАТЬ ПРОГРАММНО (или через HyperTerminal), А НЕ С ПОМОЩЬЮ, например, SiMoCo. Т.е. ручками.
04Итак:
051. Берем бумажку и составляем последовательность:
0600 - всегда - это означает, что телефон/модем берет адрес сервис-центра SMS из Симки
0711 - всегда
0800 - указывает, что в качество отправителя будет указан собственный номер тел/модема
090B - длина цифр телефонного номера = 11(дес)
1091 - указывает на интернациональный формат тел. номера (+7...)
119712325476F8 - номер адресата, которому отправляем SMS
12Тут интересно -
131. в начале записываем номер (на другую бумажку)
142. проверяем, четное ли количество цифр и если нет (как у нас - 11), добавляем в конце "F"
153. переставляем каждые две цифры местами - получаем результат
16В нашем случае:
1779212345678
1879212345678F
199712325476F8
2000 - идентификатор протокола
2108 - формат кодирования сообщения - в нашем случае - USC2
2217 - время действия SMS
23возможные коды (дес)
240-143: (код + 1)*5минут - наш случай ((17H = 23дес) + 1)*5=120минут=2часа
25144-167: 12 часов + (код - 143)*30минут
26168-196: (код - 166) * 1день
27197-255: (код - 192) * 1неделя
280C - количество байт в сообщении = количество символов*2, т.к. USC2
29041F П
300440 р
310438 и
320432 в
330435 е
340442 т
35Коды символов соответствуют нормальному Unicode. Можно посмотреть, например, встроенную программу "Таблица символов", выбрать шрифт, например Arial, прокрутить вниз до начала кириллицы и посмотреть их коды (отображаются в HEX-виде внизу окна).
36 
372. Даем команду тел/модему
38AT+CMGF=0 - включаем режим PDU
39AT+CMGS=26 - длина байтов сообщения (по 2 цифры), без учета первого нулевого байта
40>0011000B919712325476F80008170C041F04400438043204350442Ctrl+Z
41+CMGS: 13 - это уже ответ модема
42 
43OK
44 
45И еще. Тот же симоко, иногда почему-то, вставляет вместо первого нуля явный адрес сервис центра -
4607919712999090F0 - понятно (см. выше), что это телефон 79219909090. Первый байт - длина последовательности (без него самого). Вроде все правильно, но MC35 возвращает ERROR. Причину не знаю.

А теперь нужно чтобы ардуино могла сама слать таике смс. Причём чтоб могда переводить в нужную кодировку.

Мне нужно отправлять смс по хозяйству вида: "Проникновение в гараж", "Напряжение в сети 200 Вольт", "Температура котла снизилась до 40 градусов" и т.д. Казалось бы нет проблем, заранее сформировал сам, а в ардуино вбить как переменную всё сообщение. Но так не получится, потому что служебные символы, которые в заголовке сообщения, должны учитываться, а сообщение содержит переменные. Получается, что заранее никак не просчитать. Поэтому нужно как-то реализовать на ардуино алгоритм, который мог бы в итоге составить смс на кириллице и отправить его. Я просмотрел множество библиотек, но не нашёл такого функционала. Может кто встречал нужный мне кусок кода? Или может для кого-то сделать этот код - дело двух минут, и он поделится им с общественностью?

Araris
Offline
Зарегистрирован: 09.11.2012

Вариант отправлять тексты транслитом не проходит, только кириллица ?

Sirocco
Offline
Зарегистрирован: 28.09.2013

Araris пишет:

Вариант отправлять тексты транслитом не проходит, только кириллица ?

Очень желательно кириллицу. Я уже сделал систему различных оповещений для деда и бабушки на транслите. Им совершенно не понятно что на транслите написано, он их просто пугает. 

Araris
Offline
Зарегистрирован: 09.11.2012

А если так, как описано здесь http://forum.amperka.ru/threads/gprs-shield-v-2-arduino-uno.2955/#post-25495 ?

Правда с переменными сложнее будет.

Araris
Offline
Зарегистрирован: 09.11.2012

А эту http://users.skynet.be/moustic/PduEncoder.zip библиотеку пробовали ?

А это https://sites.google.com/site/marthalprojects/home/arduino/arduino-sends-SMS читали ?

Sirocco
Offline
Зарегистрирован: 28.09.2013

Спасибо! Я это изучу. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sirocco, а проблема в чём? Вроде всё подробно описано - просто делай как написано и всё. Вы не можете запрограммировать то, что у Вас описано или можете, но оно не работает? В чём беда-то?

Sirocco
Offline
Зарегистрирован: 28.09.2013

ЕвгенийП пишет:

Sirocco, а проблема в чём? Вроде всё подробно описано - просто делай как написано и всё. Вы не можете запрограммировать то, что у Вас описано или можете, но оно не работает? В чём беда-то?

Беда была в последней части этой статьи:  https://sites.google.com/site/marthalprojects/home/arduino/arduino-sends-SMS

Пока нет времени попробовать, но похоже это то, что нужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ничего не понял, ну, ладно, Вам виднее.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Кое как сделал рабочий скетч отправки СМС на кириллице с GSM sim800L ну или sim900 тоже будет работать. Для исходящих СМС с модуля используется формат PDU. Принимаются СМС в обычном текстовом режиме.  Перед заливкой в ардуино скетч нужно скопировать в новое окно (в новый скетч) и не сохраняя на компе залить в ардуино. Это нужно так как имеется косяк с кодировками кириллицы. 

Есть проблема, что большое СМС не получается отправить, т.к. всё сообщение должно записаться в одну строку String и потом перейти в массив байтов . На это видимо не хватает оперативки, и ардуино начивает нехило глючить или перезагружается. Подскажите , какие могут быть пути решения для оптимизации скетча?

Может использовать SD карту для хранения строковых констант и других String ов?

 

b707
Offline
Зарегистрирован: 26.05.2017

MaksVV пишет:

Подскажите , какие могут быть пути решения для оптимизации скетча?

Неизменные строки положить в PROGMEM, от использования String отказаться полностью. перейти на использование C-style char arrays.

Макс. вы уже который раз об этом спрашиваете... Вас видимо, ответы не устраивают. Надеетесь, что кто-то вдруг взмахнет волшебной палочкой и проблемы исчезнут сами собой? :)

MaksVV
Offline
Зарегистрирован: 06.08.2015

b707 пишет:
Макс. вы уже который раз об этом спрашиваете... Вас видимо, ответы не устраивают. Надеетесь, что кто-то вдруг взмахнет волшебной палочкой и проблемы исчезнут сами собой? :)

конкретно об этом я не справшивал вроде. Про PROGMEM буду читать. 

b707
Offline
Зарегистрирован: 26.05.2017

хотел добавить к предыдущему ответу. но не успел - вы уже ответили.

SD карта вам не поможет, потому что прежде чем использовать сохраненные на ней строки, их все равно сначала надо будет скопировать в оперативку. Напротив, ситуация станет только хуже, потому что сама библиотека работы с SD "жрет" память по черному.

MaksVV
Offline
Зарегистрирован: 06.08.2015

ок, SD не вариант.

ПС. Загрузка оперативы глобальными переменными 67%. И это ещё совсем мало команд смс и нет остального чем управляем GSM. Похоже тяжела задачка для меги 328, но будем пробовать ваши варианты

b707
Offline
Зарегистрирован: 26.05.2017

MaksVV пишет:

ПС. Загрузка оперативы глобальными переменными 67%.

Есть еще хорошее правило - как можно меньше глобальных переменных. Используйте константы, макросы и локальные переменные.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MaksVV пишет:

Похоже тяжела задачка для меги 328

Не скромничайте. Это для Вас тяжёлая задачка, а не для меги 328 :)))

MaksVV
Offline
Зарегистрирован: 06.08.2015

вы мне такими сообщениями весь настрой сбиваете. Клапауция хватает, лучше бы по делу

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

MaksVV пишет:

вы мне такими сообщениями весь настрой сбиваете. Клапауция хватает, лучше бы по делу

я тебе говорил по делу, что ты - глист.

тебе подсказали все возможные варианты решения твоей личной проблемы, но ты - глист, способный потреблять переваренное и добытое кем-то.

MaksVV
Offline
Зарегистрирован: 06.08.2015

А ты не будь занозой в заднице. Проблема не только моя личная. Думаю пользователи форума не прочь овладеть посылкой смс на кириллице, сто процентов кому то ещё пригодится. про глиста ты загнул конечно, дружище. расслабься, я благодарен за предоставленную инфу, нужно время разобраться. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

MaksVV пишет:

Думаю пользователи форума не прочь овладеть посылкой смс на кириллице, сто процентов кому то ещё пригодится. 

под "овладеть" ты, конечно, подразумеваешь, что тебе кто-то притащит готовое или ты найдёшь в тырнетах готовое, но оно у тебя работать не будет и ты будешь возмущаться, что скетч по-дыбильному написан.

так себе представляешь процесс овладения? :D

MaksVV
Offline
Зарегистрирован: 06.08.2015

кончай язвить а, да с моим уровнем пргограммирования нихера путнего не сделать. Но на чужих примерах и пытаюсь учится. У меня только так получается, читая теорию, всё бросить сразу хочется. А так Скил потихоньку качается. Если всё заработет, ничё не вижу плохого в том, что какой-нить чел взял скетч и пользуется. я вроде и не возмущаюсь, т.к. у самого скетчи такие же пока. 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MaksVV пишет:

всё бросить сразу хочется.

дык ... ото ж :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MaksVV пишет:

лучше бы по делу

А чего по делу? По делу Вы сами себе дано ответили, причём ответили Вы правильно, только ответ Вам не нравится, вот Вы и прячете голову в песок и пудрите мозг себе и нам.

Вот Вы пишете:

MaksVV пишет:
т.к. всё сообщение должно записаться в одну строку String и потом перейти в массив байтов . На это видимо не хватает оперативки

Ну??? И дальше чего???

У меня к Вам простой вопрос: нахера? Даю с разбивкой на-хе-ра Вы используете String, а потом преобразуете в char[]? Нахера? Вам память девать некуда? Другого объяснения не вижу.

Да и само использование String - у Вас же не ужас, а ужас-ужас-ужас! Вы выбрали САМЫЕ дорогие операции (типа concat) и юзаете их в хвост и в гриву! Нахера?

Вы читали мою стаьтю про String и память? Читали вообще мои заметки про память? Вот эту, например? Они вель приклеены сверху раздела! Исследовали свою программу MemroyExplorer'ом? Так сделайте это - сами ужаснётесь!

А ведь главное, Вы всё отлично понимаете! Так садитесь и изучайте работу с массивами символов. Объявите слово String матерным и недопустимым в приличном скетче и ... Вы удивитесь как много памяти у Вашего контроллера.

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот так бы сразу, а. 

ЕвгенийП пишет:
У меня к Вам простой вопрос: нахера? Даю с разбивкой на-хе-ра Вы используете String, а потом преобразуете в char[]? Нахера? Вам память девать некуда? Другого объяснения не вижу.

я хотел как проще, подозревал что памяти не хватит, но чтоб так быстро. Понято, перехожу на array char

MaksVV
Offline
Зарегистрирован: 06.08.2015

почитал заметку про String, мой случай))

MaksVV
Offline
Зарегистрирован: 06.08.2015

вопрос про текстовые константы или как там их назвать, используемые с  -  mySerial.print ("Вот эти строки"). Достаточно ли просто для высвобождения оперативки

1mySerial.print("AT+CMGF=1\r");

заменить на 

1mySerial.print(F("AT+CMGF=1\r"));

поможет ли это?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Там по второй ссылке в моём прошлом посте, есть такая программа MemoryExplorer.

Делаете маленький пример со своим строками, запускаете так и эдак и смотрите на состояние памяти в том и в другом случае.

Во-первых получаете ответ на вопрос, а во-вторых привыкаете самостоятельно решать возникающие проблемы.

MaksVV
Offline
Зарегистрирован: 06.08.2015

понял, работаем над собой

b707
Offline
Зарегистрирован: 26.05.2017

MaksVV пишет:

поможет ли это?

Макс, Вы меньше спрашивайте, а больше делайте. Пока вы писали это сообщение, я загрузил ваш скетч и заключил "Все эти строки" в макрос F(). И откомпилировал. И сразу увидел, что выигрыш есть, но небольшой. Заняло у меня это действо 8 минут, включая вход в Ардуино и создание нового скетча.

К сожалению, большая часть ваших строк - String - а с ними этот метод не работает. малой кровью не отделаетесь.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

MaksVV пишет:

 Перед заливкой в ардуино скетч нужно скопировать в новое окно (в новый скетч) и не сохраняя на компе залить в ардуино. Это нужно так как имеется косяк с кодировками кириллицы. 

Костыль у вас имеется, а не рабочий код, вот и всё. Я вам приводил пример, повторюсь: https://github.com/Porokhnya/GreenhouseProject/blob/master/Main/PDUClasses.h - вот тут объявление всего ДВУХ классов, которые корректно и кодируют (в UCS2), и раскодируют SMS-сообщения в ЛЮБОЙ кодировке. Есть проверка на то, что SMS пришло с правильного номера, чтобы память раскодировкой не насиловать. Рядом валяется файл *.cpp, как это дело подключить к проекту и как юзать - доступно самому-самому джуниору (только вырезать ненужные include в cpp-файле, да чуть подточить, при необходимости). Собственно, эти классы являются некой компиляцией разнородного кода, найденного в сети, плюс - дописанный ручками нужный функционал. И будет вам автоматом SMS на любом языке, не только на кириллице - главное, чтобы строка, которую надо отправить по SMS - была в формате UTF-8, который, как известно, имеет переменную длину кодирования символа, т.е. туда впихуется практически всё, с точки зрения языков (думаю, вам хватит).

А вы непонятный секс с сохранением скетча развели.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIYMan пишет:

А вы непонятный секс с сохранением скетча развели.

Ну, почему непонятный? Как раз понятный :)))

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

я делал перекодировку просто таблицей соответсвия

1byte Rus1251keys[66] = {70, 60, 68, 85, 76, 84, 58, 80, 66, 81, 82, 75, 86, 89, 74, 71, 72, 67, 78, 69, 65, 123, 87, 88, 73, 79, 125, 83, 77, 34, 62, 90, 102, 44, 100, 117, 108, 116, 59, 112, 98, 113, 114, 107, 118, 121, 106, 103, 104, 99, 110, 101, 97, 91, 119, 120, 105, 111, 93, 115, 109, 39, 46, 122};

 

а вдохновение и теорию я брал из этой статьи

http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andycat пишет:

я делал перекодировку просто таблицей соответсвия

1byte Rus1251keys[66] = {70, 60, 68, 85, 76, 84, 58, 80, 66, 81, 82, 75, 86, 89, 74, 71, 72, 67, 78, 69, 65, 123, 87, 88, 73, 79, 125, 83, 77, 34, 62, 90, 102, 44, 100, 117, 108, 116, 59, 112, 98, 113, 114, 107, 118, 121, 106, 103, 104, 99, 110, 101, 97, 91, 119, 120, 105, 111, 93, 115, 109, 39, 46, 122};

 

а вдохновение и теорию я брал из этой статьи

http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm

 

 

Ну тады исходник дайте, на предмет посмотреть ;)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

я делал перекодировку просто таблицей соответсвия

1byte Rus1251keys[66] = {70, 60, 68, 85, 76, 84, 58, 80, 66, 81, 82, 75, 86, 89, 74, 71, 72, 67, 78, 69, 65, 123, 87, 88, 73, 79, 125, 83, 77, 34, 62, 90, 102, 44, 100, 117, 108, 116, 59, 112, 98, 113, 114, 107, 118, 121, 106, 103, 104, 99, 110, 101, 97, 91, 119, 120, 105, 111, 93, 115, 109, 39, 46, 122};

 

а вдохновение и теорию я брал из этой статьи

http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm

Честно говоря, не вполне ясно, почему в этой таблице почти случайные числа. Если верить данным из статьи по ссылке, код Unicode для любого символа кириллицы получается прибавлением 848 к кодам символов win-1251. Выходит, все сложные алгоритмы и таблицы можно заменить одним арифметическим действием?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

Если верить данным из статьи по ссылке, код Unicode для любого символа кириллицы получается прибавлением 848 к кодам символов win-1251. Выходит, все сложные алгоритмы и таблицы можно заменить одним арифметическим действием?

Если внимательно посмотреть соответствие кодировок 1251 и UTF-16:

https://ru.wikipedia.org/wiki/Windows-1251#.D0.9A.D0.BE.D0.B4.D0.B8.D1.8...

то можно заметить, что 64 символе кириллицы (по 32 заглавных и строчных) идут одним непрерывным блоком. Соответственно, все они действительно преобразуются добавлением константы.

Остается буква Ё/ё русского алфавита, а также несколько букв украинского (он же русинский), белорусского, сербского (он же черногорский) и македонского (болгарский целиком помещается в непрерывный 64-символьный блок). Ну и все остальные символы, присутствующие в 1251. Отсюда и "сложные алгоритмы".

Опять же, мы сеейчас говорим про UTF-16, а в Ардуино используется UTF-8 для преобразования которой в UTF-16 тоже нужны некоторые алгоритмы.

b707
Offline
Зарегистрирован: 26.05.2017

Я сейчас конкретно говорю о коде andycat, у него в табличке 66 значений, из чего следует что никаких белорусских или македонских символов там нет. Если все 64 символа русского алфавита за исключением Ё идут единым блоком, то нафига вообще эта таблицва соответсвий?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В русском алфавите 33 буквы, соответственно, 66 символов (различая строчные и прописные). И, повтоторюсь, таблицы далеко не исчерпываются буквами русского алфавита отличными от Ё. 

Что касается конкретно кода andycat, то откуда там что берется и что чему соответствует, не разбирался т.к. не интересно. На 1251->utf не похоже. Может КОИ-8, 866, ГОСТ или еще чего. Например, я в своей библиотеке для OLED подобную таблицу делал для преобразования utf-8 в смещение в таблице знакогенератора, которое не аповторяло ни одну из известных таблиц, т.к. знакогенератор не содержал "лишних" с моей точки зрения символов.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Нет, у меня именно идёт преобразование из кода нажатой клавиатуры win1251 в UTF 8 одним действием, и оно работает. У компьютера буду только в понедельник и опишу все "на пальцах"

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andycat пишет:
Нет, у меня именно идёт преобразование из кода нажатой клавиатуры win1251 в UTF 8 одним действием, и оно работает. У компьютера буду только в понедельник и опишу все "на пальцах"

Вероятно, я бы понял, что Вы хотели сказать, если бы знал, что такое "клавиатура win1251".

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

С клавиатуры идёт ascii код, соответствующий нажатой кнопке латинской, я в массив забил именно латинские коды а не кириллицу win1251, возможно по этому и происходит недопонимание. Для преобразования из реальных кодов из win1251 достаточно массив поменять по таблице ссылку на которую я выше давал. Буду у компа после обеда - если необходимо - могу построено код прокомментировать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andycat пишет:
С клавиатуры идёт ascii код, соответствующий нажатой кнопке латинской, я в массив забил именно латинские коды а не кириллицу win1251, возможно по этому и происходит недопонимание. Для преобразования из реальных кодов из win1251 достаточно массив поменять по таблице ссылку на которую я выше давал. Буду у компа после обеда - если необходимо - могу построено код прокомментировать.

Вообще-то с клавиатуры идут скан-коды, а в ASCII их преобразует уже драйвер клавиатуры. Который с тем же успехом может преобразовывать их в CP1251, КОИ8, UTF-16 и все, что душенька пожелает. А Вы из ASCII преобразуете в коды кириллицы букв, расположенных на тех же клавишах, что и латинница? Смысл?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

andriano пишет:

А Вы из ASCII преобразуете в коды кириллицы букв, расположенных на тех же клавишах, что и латинница? Смысл?

он раскладку переключает и драйвер клавы даёт ему нужные символы ASCII

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Да, мне было лень разбираться и русифицировать библиотеку PS2Keyboard.h и я сам сделал русификацию.