SIM800L, реализация алгоритма формирующего sms на кириллице
- Войдите на сайт для отправки комментариев
Есть GSM модуль SIM800L. Если специальным образом сформировать сообщение, то можно отправить sms на кириллице. Как формируется узнал тут: http://www.edgemodem.ru/forum/viewtopic.php?f=8&t=901
Цитирую:
Само сообщение состоит из HEX-последовательности, прописанной ASCII-символами (0..9,A..F). Пример - надо отправить сообщение абоненту +79212345678 и в нем написать 'Привет'. ВНИМАНИЕ! РЕЧЬ ИДЕТ О ТОМ, КАК ЭТО СДЕЛАТЬ ПРОГРАММНО (или через HyperTerminal), А НЕ С ПОМОЩЬЮ, например, SiMoCo. Т.е. ручками. Итак: 1. Берем бумажку и составляем последовательность: 00 - всегда - это означает, что телефон/модем берет адрес сервис-центра SMS из Симки 11 - всегда 00 - указывает, что в качество отправителя будет указан собственный номер тел/модема 0B - длина цифр телефонного номера = 11(дес) 91 - указывает на интернациональный формат тел. номера (+7...) 9712325476F8 - номер адресата, которому отправляем SMS Тут интересно - 1. в начале записываем номер (на другую бумажку) 2. проверяем, четное ли количество цифр и если нет (как у нас - 11), добавляем в конце "F" 3. переставляем каждые две цифры местами - получаем результат В нашем случае: 79212345678 79212345678F 9712325476F8 00 - идентификатор протокола 08 - формат кодирования сообщения - в нашем случае - USC2 17 - время действия SMS возможные коды (дес) 0-143: (код + 1)*5минут - наш случай ((17H = 23дес) + 1)*5=120минут=2часа 144-167: 12 часов + (код - 143)*30минут 168-196: (код - 166) * 1день 197-255: (код - 192) * 1неделя 0C - количество байт в сообщении = количество символов*2, т.к. USC2 041F П 0440 р 0438 и 0432 в 0435 е 0442 т Коды символов соответствуют нормальному Unicode. Можно посмотреть, например, встроенную программу "Таблица символов", выбрать шрифт, например Arial, прокрутить вниз до начала кириллицы и посмотреть их коды (отображаются в HEX-виде внизу окна). 2. Даем команду тел/модему AT+CMGF=0 - включаем режим PDU AT+CMGS=26 - длина байтов сообщения (по 2 цифры), без учета первого нулевого байта >0011000B919712325476F80008170C041F04400438043204350442Ctrl+Z +CMGS: 13 - это уже ответ модема OK И еще. Тот же симоко, иногда почему-то, вставляет вместо первого нуля явный адрес сервис центра - 07919712999090F0 - понятно (см. выше), что это телефон 79219909090. Первый байт - длина последовательности (без него самого). Вроде все правильно, но MC35 возвращает ERROR. Причину не знаю.
А теперь нужно чтобы ардуино могла сама слать таике смс. Причём чтоб могда переводить в нужную кодировку.
Мне нужно отправлять смс по хозяйству вида: "Проникновение в гараж", "Напряжение в сети 200 Вольт", "Температура котла снизилась до 40 градусов" и т.д. Казалось бы нет проблем, заранее сформировал сам, а в ардуино вбить как переменную всё сообщение. Но так не получится, потому что служебные символы, которые в заголовке сообщения, должны учитываться, а сообщение содержит переменные. Получается, что заранее никак не просчитать. Поэтому нужно как-то реализовать на ардуино алгоритм, который мог бы в итоге составить смс на кириллице и отправить его. Я просмотрел множество библиотек, но не нашёл такого функционала. Может кто встречал нужный мне кусок кода? Или может для кого-то сделать этот код - дело двух минут, и он поделится им с общественностью?
Вариант отправлять тексты транслитом не проходит, только кириллица ?
Вариант отправлять тексты транслитом не проходит, только кириллица ?
Очень желательно кириллицу. Я уже сделал систему различных оповещений для деда и бабушки на транслите. Им совершенно не понятно что на транслите написано, он их просто пугает.
А если так, как описано здесь http://forum.amperka.ru/threads/gprs-shield-v-2-arduino-uno.2955/#post-25495 ?
Правда с переменными сложнее будет.
А эту http://users.skynet.be/moustic/PduEncoder.zip библиотеку пробовали ?
А это https://sites.google.com/site/marthalprojects/home/arduino/arduino-sends-SMS читали ?
Спасибо! Я это изучу.
Sirocco, а проблема в чём? Вроде всё подробно описано - просто делай как написано и всё. Вы не можете запрограммировать то, что у Вас описано или можете, но оно не работает? В чём беда-то?
Sirocco, а проблема в чём? Вроде всё подробно описано - просто делай как написано и всё. Вы не можете запрограммировать то, что у Вас описано или можете, но оно не работает? В чём беда-то?
Беда была в последней части этой статьи: https://sites.google.com/site/marthalprojects/home/arduino/arduino-sends-SMS
Пока нет времени попробовать, но похоже это то, что нужно.
Ничего не понял, ну, ладно, Вам виднее.
Кое как сделал рабочий скетч отправки СМС на кириллице с GSM sim800L ну или sim900 тоже будет работать. Для исходящих СМС с модуля используется формат PDU. Принимаются СМС в обычном текстовом режиме. Перед заливкой в ардуино скетч нужно скопировать в новое окно (в новый скетч) и не сохраняя на компе залить в ардуино. Это нужно так как имеется косяк с кодировками кириллицы.
Есть проблема, что большое СМС не получается отправить, т.к. всё сообщение должно записаться в одну строку String и потом перейти в массив байтов . На это видимо не хватает оперативки, и ардуино начивает нехило глючить или перезагружается. Подскажите , какие могут быть пути решения для оптимизации скетча?
Может использовать SD карту для хранения строковых констант и других String ов?
Подскажите , какие могут быть пути решения для оптимизации скетча?
Неизменные строки положить в PROGMEM, от использования String отказаться полностью. перейти на использование C-style char arrays.
Макс. вы уже который раз об этом спрашиваете... Вас видимо, ответы не устраивают. Надеетесь, что кто-то вдруг взмахнет волшебной палочкой и проблемы исчезнут сами собой? :)
конкретно об этом я не справшивал вроде. Про PROGMEM буду читать.
хотел добавить к предыдущему ответу. но не успел - вы уже ответили.
SD карта вам не поможет, потому что прежде чем использовать сохраненные на ней строки, их все равно сначала надо будет скопировать в оперативку. Напротив, ситуация станет только хуже, потому что сама библиотека работы с SD "жрет" память по черному.
ок, SD не вариант.
ПС. Загрузка оперативы глобальными переменными 67%. И это ещё совсем мало команд смс и нет остального чем управляем GSM. Похоже тяжела задачка для меги 328, но будем пробовать ваши варианты
ПС. Загрузка оперативы глобальными переменными 67%.
Есть еще хорошее правило - как можно меньше глобальных переменных. Используйте константы, макросы и локальные переменные.
Похоже тяжела задачка для меги 328
Не скромничайте. Это для Вас тяжёлая задачка, а не для меги 328 :)))
вы мне такими сообщениями весь настрой сбиваете. Клапауция хватает, лучше бы по делу
вы мне такими сообщениями весь настрой сбиваете. Клапауция хватает, лучше бы по делу
я тебе говорил по делу, что ты - глист.
тебе подсказали все возможные варианты решения твоей личной проблемы, но ты - глист, способный потреблять переваренное и добытое кем-то.
А ты не будь занозой в заднице. Проблема не только моя личная. Думаю пользователи форума не прочь овладеть посылкой смс на кириллице, сто процентов кому то ещё пригодится. про глиста ты загнул конечно, дружище. расслабься, я благодарен за предоставленную инфу, нужно время разобраться.
Думаю пользователи форума не прочь овладеть посылкой смс на кириллице, сто процентов кому то ещё пригодится.
под "овладеть" ты, конечно, подразумеваешь, что тебе кто-то притащит готовое или ты найдёшь в тырнетах готовое, но оно у тебя работать не будет и ты будешь возмущаться, что скетч по-дыбильному написан.
так себе представляешь процесс овладения? :D
кончай язвить а, да с моим уровнем пргограммирования нихера путнего не сделать. Но на чужих примерах и пытаюсь учится. У меня только так получается, читая теорию, всё бросить сразу хочется. А так Скил потихоньку качается. Если всё заработет, ничё не вижу плохого в том, что какой-нить чел взял скетч и пользуется. я вроде и не возмущаюсь, т.к. у самого скетчи такие же пока.
всё бросить сразу хочется.
дык ... ото ж :)
лучше бы по делу
А чего по делу? По делу Вы сами себе дано ответили, причём ответили Вы правильно, только ответ Вам не нравится, вот Вы и прячете голову в песок и пудрите мозг себе и нам.
Вот Вы пишете:
Ну??? И дальше чего???
У меня к Вам простой вопрос: нахера? Даю с разбивкой на-хе-ра Вы используете String, а потом преобразуете в char[]? Нахера? Вам память девать некуда? Другого объяснения не вижу.
Да и само использование String - у Вас же не ужас, а ужас-ужас-ужас! Вы выбрали САМЫЕ дорогие операции (типа concat) и юзаете их в хвост и в гриву! Нахера?
Вы читали мою стаьтю про String и память? Читали вообще мои заметки про память? Вот эту, например? Они вель приклеены сверху раздела! Исследовали свою программу MemroyExplorer'ом? Так сделайте это - сами ужаснётесь!
А ведь главное, Вы всё отлично понимаете! Так садитесь и изучайте работу с массивами символов. Объявите слово String матерным и недопустимым в приличном скетче и ... Вы удивитесь как много памяти у Вашего контроллера.
вот так бы сразу, а.
я хотел как проще, подозревал что памяти не хватит, но чтоб так быстро. Понято, перехожу на array char
почитал заметку про String, мой случай))
вопрос про текстовые константы или как там их назвать, используемые с - mySerial.print ("Вот эти строки"). Достаточно ли просто для высвобождения оперативки
заменить на
поможет ли это?
Там по второй ссылке в моём прошлом посте, есть такая программа MemoryExplorer.
Делаете маленький пример со своим строками, запускаете так и эдак и смотрите на состояние памяти в том и в другом случае.
Во-первых получаете ответ на вопрос, а во-вторых привыкаете самостоятельно решать возникающие проблемы.
понял, работаем над собой
поможет ли это?
Макс, Вы меньше спрашивайте, а больше делайте. Пока вы писали это сообщение, я загрузил ваш скетч и заключил "Все эти строки" в макрос F(). И откомпилировал. И сразу увидел, что выигрыш есть, но небольшой. Заняло у меня это действо 8 минут, включая вход в Ардуино и создание нового скетча.
К сожалению, большая часть ваших строк - String - а с ними этот метод не работает. малой кровью не отделаетесь.
Перед заливкой в ардуино скетч нужно скопировать в новое окно (в новый скетч) и не сохраняя на компе залить в ардуино. Это нужно так как имеется косяк с кодировками кириллицы.
Костыль у вас имеется, а не рабочий код, вот и всё. Я вам приводил пример, повторюсь: https://github.com/Porokhnya/GreenhouseProject/blob/master/Main/PDUClasses.h - вот тут объявление всего ДВУХ классов, которые корректно и кодируют (в UCS2), и раскодируют SMS-сообщения в ЛЮБОЙ кодировке. Есть проверка на то, что SMS пришло с правильного номера, чтобы память раскодировкой не насиловать. Рядом валяется файл *.cpp, как это дело подключить к проекту и как юзать - доступно самому-самому джуниору (только вырезать ненужные include в cpp-файле, да чуть подточить, при необходимости). Собственно, эти классы являются некой компиляцией разнородного кода, найденного в сети, плюс - дописанный ручками нужный функционал. И будет вам автоматом SMS на любом языке, не только на кириллице - главное, чтобы строка, которую надо отправить по SMS - была в формате UTF-8, который, как известно, имеет переменную длину кодирования символа, т.е. туда впихуется практически всё, с точки зрения языков (думаю, вам хватит).
А вы непонятный секс с сохранением скетча развели.
А вы непонятный секс с сохранением скетча развели.
Ну, почему непонятный? Как раз понятный :)))
я делал перекодировку просто таблицей соответсвия
а вдохновение и теорию я брал из этой статьи
http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
я делал перекодировку просто таблицей соответсвия
а вдохновение и теорию я брал из этой статьи
http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
Ну тады исходник дайте, на предмет посмотреть ;)
Там банально один цикл
http://arduino.ru/forum/proekty/arduino-bluetooth-klaviatura-s-shifrovan...
я делал перекодировку просто таблицей соответсвия
а вдохновение и теорию я брал из этой статьи
http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
Честно говоря, не вполне ясно, почему в этой таблице почти случайные числа. Если верить данным из статьи по ссылке, код Unicode для любого символа кириллицы получается прибавлением 848 к кодам символов win-1251. Выходит, все сложные алгоритмы и таблицы можно заменить одним арифметическим действием?
Если верить данным из статьи по ссылке, код 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 тоже нужны некоторые алгоритмы.
Я сейчас конкретно говорю о коде andycat, у него в табличке 66 значений, из чего следует что никаких белорусских или македонских символов там нет. Если все 64 символа русского алфавита за исключением Ё идут единым блоком, то нафига вообще эта таблицва соответсвий?
В русском алфавите 33 буквы, соответственно, 66 символов (различая строчные и прописные). И, повтоторюсь, таблицы далеко не исчерпываются буквами русского алфавита отличными от Ё.
Что касается конкретно кода andycat, то откуда там что берется и что чему соответствует, не разбирался т.к. не интересно. На 1251->utf не похоже. Может КОИ-8, 866, ГОСТ или еще чего. Например, я в своей библиотеке для OLED подобную таблицу делал для преобразования utf-8 в смещение в таблице знакогенератора, которое не аповторяло ни одну из известных таблиц, т.к. знакогенератор не содержал "лишних" с моей точки зрения символов.
Нет, у меня именно идёт преобразование из кода нажатой клавиатуры win1251 в UTF 8 одним действием, и оно работает. У компьютера буду только в понедельник и опишу все "на пальцах"
Вероятно, я бы понял, что Вы хотели сказать, если бы знал, что такое "клавиатура win1251".
С клавиатуры идёт ascii код, соответствующий нажатой кнопке латинской, я в массив забил именно латинские коды а не кириллицу win1251, возможно по этому и происходит недопонимание. Для преобразования из реальных кодов из win1251 достаточно массив поменять по таблице ссылку на которую я выше давал. Буду у компа после обеда - если необходимо - могу построено код прокомментировать.
Вообще-то с клавиатуры идут скан-коды, а в ASCII их преобразует уже драйвер клавиатуры. Который с тем же успехом может преобразовывать их в CP1251, КОИ8, UTF-16 и все, что душенька пожелает. А Вы из ASCII преобразуете в коды кириллицы букв, расположенных на тех же клавишах, что и латинница? Смысл?
А Вы из ASCII преобразуете в коды кириллицы букв, расположенных на тех же клавишах, что и латинница? Смысл?
он раскладку переключает и драйвер клавы даёт ему нужные символы ASCII
Да, мне было лень разбираться и русифицировать библиотеку PS2Keyboard.h и я сам сделал русификацию.