sim900 отправка больших СМС на русском в PDU формате
- Войдите на сайт для отправки комментариев
Ср, 09/09/2020 - 18:11
Приветсвую.
Приобрел модуль SIM900. Хочу отправлять смс с ардуино на русском языке. Причем возможно будут очень большие СМС.
подключил все по этой схеме.

запитал от БП 5В 3А
В основном отталкивался от статьи https://codius.ru/articles/GSM_модуль_SIM800L_часть_3
приведу часть кода
для сообщения на номер 79209996677, сообщение "Здравстуй. Я помню чудное мнгоновенье передо мной явилась ты, как 1234".
void sendSMSinPDU() { String PDUPack = "0001000B919702996976F700088C041704340440043004320441044204430439002E0020042F0020043F043E043C043D044E0020044704430434043D043E04350020043C043D0433043E043D043E04320435043D044C04350020043F0435044004350434043E0020043C043D043E04390020044F04320438043B04300441044C00200442044B002C0020043A0430043A00200031003200330034" + (String)((char)26); // После PDU-пакета отправляем Ctrl+Z sendATCommand("AT+CMGF=0", true); // Включаем PDU-режим sendATCommand("AT+CMGS=153", true); // Отправляем длину PDU-пакета sendATCommand(PDUPack, true); }
При этом при таком длинном сообщении - оно никак не отправляется, а сам модуль sim900 наглухо зависает и не отвечает ни на какие команда например даже на "АТ"
-- если же отправить что нибудь маленькое например
для сообщения на номер 79209996677, сообщение "Здравстуй.".
void sendSMSinPDU() { String PDUPack = "0001000B919702996976F7000814041704340440043004320441044204430439002E" + (String)((char)26); // После PDU-пакета отправляем Ctrl+Z sendATCommand("AT+CMGF=0", true); // Включаем PDU-режим sendATCommand("AT+CMGS=33", true); // Отправляем длину PDU-пакета sendATCommand(PDUPack, true); }
-- Все прекрасно отправляется и доставляется.
Ниже привел часть кода с спомощью которого отправляются АТ команды в Сим900 опять же скопипастенные из статьи
String sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата //Serial.println(cmd); // Дублируем команду в монитор порта SIM900.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... _resp = waitResponse(); // ... ждем, когда будет передан ответ // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2); } Serial.println(_resp); // Дублируем ответ в монитор порта } return _resp; // Возвращаем результат. Пусто, если проблема } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM900.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то... if (SIM900.available()) { // Если есть, что считывать... _resp = SIM900.readString(); // ... считываем и запоминаем } else { // Если пришел таймаут, то... Serial.println("Timeout..."); // ... оповещаем об этом и... } return _resp; // ... возвращаем результат. Пусто, если проблема }
Сам я грешу либо на скороть обмена с модулем сим 900, либо на питание модуля сим 900, либо на неисправность самой платы.
Подскажите пожалуйста - как думаете вы - а почему не отправляюстя большие смс ? в каком направлении капать ?
ваще-то по стандарту максимальная длина СМС - 140 символов, а у вас 153
интересно мыслите. Какая из этих трех причин может обьяснить. что короткие СМС уходят, а длинные нет? :) скорость обмена? - really??
- Я подумал что типа не справляется буфер обмена или сам контроллер модуля - то есть ему сложно переварить много информации ... Каюсь был не прав ... плохо знаю мат часть ... каюсь ...
- как я понял это длина pdu пакета в байтах - без претензий и понтов книжного червя - просто чтобы быть точным.
- просто я на другом языке в примере видел как передавали 154 символа/байта (модему правда а не модулю сим 900). поэтому подумал что здесь так же - типа это стандарт - подумал я.
--- (и главный вопрос который хотел задать в теме но не подношел к нему)
--- подскажите пожалуйста - а как тогда быть если если длина всего сообщения больше 140 символа/байта - разделить все сообщение так чтобы был один полный pdu пакет на 140 cимволов/байт - а в оставшийся запихнуть остаток сообщения ? так ? просто как модуль поймет что это все одно сообщение - и не пошлет 2а разных сообщения ??? есть какой то спец знак ???
--- Объясните пожалуйста буду очень благодарен !!!
Откройте уже в поисковике PDU формат, там все расписано почему именно столько букв за раз можно отправлять.
Фраза понравилась в одной из статей :)
PDU-режим придумали извращенцы-мозгофилы.
--- подскажите пожалуйста - а как тогда быть если если длина всего сообщения больше 140 символа/байта - разделить все сообщение так чтобы был один полный pdu пакет на 140 cимволов/байт - а в оставшийся запихнуть остаток сообщения ? так ? просто как модуль поймет что это все одно сообщение - и не пошлет 2а разных сообщения ??? есть какой то спец знак ???
--- Объясните пожалуйста буду очень благодарен !!!
Формат PDU имеет специальные средства для отправки смсок из кусков. Принимающая сторона их склеит (если правильно формат PDU обрабатывает). Читайте описание формата - оно много где описано.
Также можете посмотреть готовую программу чтения русских и длинных смс от нашего коллеги (не ленились бы поиск жамкнуть - сами нашли бы).
- Бл... это точно, я себе весь мозг вынес ...
Также можете посмотреть готовую программу чтения русских и длинных смс от нашего коллеги (не ленились бы поиск жамкнуть - сами нашли бы).
- Да я посмотрел и в целом принцып склейки сообщения понял. Я не ленюсь, честно не нашел. Сильно не пинайте - я же новичек (не газ конечно). Хотел бы все же сам разобраться в чем я не прав …
- читал здесь далее буду ссылаться на этот источник ...
http://hardisoft.ru/soft/samodelkin-soft/otpravka-dlinnyx-sms-soobshhenij-v-formate-pdu/
еще раз возвращусь к коментарию Комрада выше. Мне все же удалось отправить сообщение длиной pdu пакета 141 байт.
отправлял сообщение свой телефон, в примере +79209996677 - текст "ААААААААААббббббббббВВВВВВВВВВггггггггггДДДДДДДДДДЕЕЕЕЕЕЕЕЕЕжжжж" - блоки по 10 букв. жжжж – 4, соощение успешно пришло
ПДУ пакет
0001000B919702996976F70008800410041004100410041004100410041004100410043104310431043104310431043104310431043104120412041204120412041204120412041204120433043304330433043304330433043304330433041404140414041404140414041404140414041404150415041504150415041504150415041504150436043604360436
вот код
в статье которую я привел написано
На текст сообщения отводится всего 140 байт. Соответственно, в ASCII кодировке мы можем отправить всего 160 символов (за счет 7-битной кодировки), а в USC-2 всего 70
Подскажите пожалуйста
--- правильно ли я понимаю что я могу разбить смс сообщение не обязательно на максимально большие PDU пакеты – То есть я могу части сообщения уходили и PDU пакетом 120 байт например – ГЛАВНОЕ чтобы соблюдался принцып построения PDU пакета. Все верно ???
Для того же примера что и выше "ААААААААААббббббббббВВВВВВВВВВггггггггггДДДДДДДДДДЕЕЕЕЕЕЕЕЕЕжжжж" я создал 2 PDU пакета
1ый раз 140 и 26 байт
0041000B919702996976F700087F050003FF020104100410041004100410041004100410041004100431043104310431043104310431043104310431041204120412041204120412041204120412041204330433043304330433043304330433043304330414041404140414041404140414041404140414041504150415041504150415041504150415041504
И
0041010B919702996976F700080D050003FF020236043604360436
Код использовал вот такой
- Процедура AnalizeResponseSMS ждет ответа о отправке смс вида (+CMGS: 99) и только затем выполняем команды ниже.
В результате СМС не отправилась. (((
2ой раз 114 и 52 байта
0041000B919702996976F7000865050003FF02010410041004100410041004100410041004100410043104310431043104310431043104310431043104120412041204120412041204120412041204120433043304330433043304330433043304330433041404140414041404140414041404
0041010B919702996976F7000827050003FF0202140414041404150415041504150415041504150415041504150436043604360436
При этом на первую смс получил заветную +CMGS, на вторую ничего не получил, смс не отпрвавилась.
Для первых PDU пакетов
0041000B919702996976F7000865050003FF0201
41 — PDU-Type, 00 – TP-MR (так было сказано в статье, для второго было сказано бери 01 итд), 65— TP-UDL (посчитал программно),
050003FF0201 – UDH: 05 – общая длина UDH, 0003 – идентификатор и длина IE, FF – случайный reference number, 02 – всего 2 сообщения, 01 – это первое сообщение.
Что я делаю неправильно подскажите пожалуйста ???
Если есть возможность дайте пример 2ух pdu пакетов которые написаны верно (прошу пожалуйста без поля VP Времени жизни СМС, и прошу пожалуйста напишите в текстовом формате полное сообщение) - я думаю я бы сразу разобрался как отправлять если скинете ...
Спасибо если поможете.
ну очень не хочется опять вникать в эту белиберду :(
попробуйте разобраться в этой функции отправки. Входная строка smsmsg в кодировке WIN1251 должна быть. Длинные СМС не поддерживаются, если я правильно понял - просто в каком то служебном поле отсылается сколько частей длинной СМС и какая это конкретная часть отправляется.
volodya3d , вы не с того начинаете, хоть одну СМС научитесь отправлять динамически, а не набором абстрактных байт, потом уже будете переходить на длинные. P.S. С SIM900 конкретно не работал, но учитывая что на A6 и SIM800 работало однотипно, сомневаюсь что дело в модеме - разбирайтесь досконально в протоколе, только так добьетесь результата.
Update: ну вот же в первой попавшейся статье из интернета:
Отправка длинных SMS-сообщений в формате PDU | Хард / Софт (hardisoft.ru)
PDU-Type – Поле флагов. Для отправки простого сообщения туда нужно было поставить “01”. В нашем случае, для отправки длинного сообщения в этом поле должно быть “41”. Т.е. если смотреть по битам, должен быть установлен бит TP-UDHI, который дает понять телефону, что сообщение содержит блок UDH (User Data Header), тот самый дополнительный информационный блок, в котором будет содержаться информация о частях сообщения.
и вот это же поле в моем коде
во.....вместо того чтоб разобраться в протоколе вы бездумно шлете в порт какие то данные и надеетесь на чудо :(
никакой доп команды в модемах нет - им че дашь то они и шлют.
Возьмите любой русское слово, на его основе ручками!!! нарисуйте на бумаге весь текст СМС, разберитесь , отправьте, если удастся - переходите к длинному тексту. Никто тут на форуме готовую программу вам не выложит - учитесь самостоятельно.
. Нет сложности отправить в ардуино программно пду пакеты. Пду пакеты я сформирую в другой программе (не в ардуино) - с этим сложности нет. Есть сложность с пониманием какие именно пакеты нужны ардуино.
Лично я не знаю. Думаю нет. Разбивка нужна именно после 140 символов текста.
ЗЫ. Нахрена разбивать смс размером 100 знаков?
TPDU 45
из любопытства решил попробовать длинную СМС закодировать, постратил два часа, понял что с наскока не решить.....
выше уже писали - ваш путь отправки готовых наборов байт - путь в никуда, ничего не получиться.
Ниже тестовый код который я начал писать "на коленке", вам достаточно поле UDH рассчитать и заполнить. Но все таки советую разобраться и написать все самостоятельно.
00 - MR Порядковый номер сообщения - должен быть всегда 00 (прочитал я на другом форуме).
MR с каждой частью должен увеличиваться. Какие то не правильные форумы вы читаете.
Добрый день.
прочитала вот здесь
https://www.cyberforum.ru/csharp-net/thread269949.html