Смс и ммс

Работа с модемом

Прием SMS начинается с модема (в сотовом телефоне тоже есть модем). Модем управляется AT-командами. Рассмотрим кратко устройство модема и возможности получения оттуда SMS.

Режим PDU. Рекомендую перевести модем в PDU-режим перед всеми операциями командой AT+CMGF=0

Память. У GSM-модемов есть несколько видов памяти, в которых могут храниться SMS-сообщения. Честно говоря, зачем их столько я так и не выяснил, но раз уж есть – будем ковырять.

Память модема делится на три логических секции: первая для просмотра, чтения и удаления сообщений, вторая для сохранения и отправки исходящих сообщений и третья для только что полученных сообщений. В общем, тут все несколько запутано, но вторая и третья секции, в принципе, нас не интересуют. Обычно модем хранит полученные сообщения в первой секции.

Кроме логического деления на секции у модема еще есть несколько видов физической памяти: память SIM-карты, внутренняя память модема и прочее. Каждая физическая память назначается определенной логической секции. Таким образом можно назначить память SIM-карты для чтения и удаления сообщений, а память модема для написания и отправки. В общем, тут логика не совсем прослеживается, если кто-нибудь сможет объяснить такой зверинец более подробно – буду признателен.

Каждая область физической памяти имеет свое имя, для того, чтобы ей можно было оперировать в командах модема. Вот несколько возможных имен областей:

  • SM – Память SIM-карты
  • ME – Память модема/телефона
  • MT – Это общая память SIM-карты и модема, т.е. MT = SM+ME
  • BM – Память для широковещательных сообщений сети
  • SR – Память для отчетов (о доставке и т.п.)

Для чтения сообщений нам понадобится только SM и ME память, либо MT, которая включает в себя и SM и ME.

Учтите, любое чтение идет только из памяти, назначенной для первой секции. Это важно.

Для настройки памяти модема существует специальная AT-команда: AT+CPMS

Формат команды: AT+CPMS=message_storage1]

Как видно из формата, вторую и третью секции памяти указывать не обязательно (они в квадратных скобках). Поэтому мы их указывать и не будем.

Итак. Нам нужно настроить первую секцию памяти (для чтения и удаления) и назначить ей соответствующую физическую область памяти. Делается это так:

AT+CPMS=”SM”, либо AT+CPMS=”ME”, либо AT+CPMS=”MT”.

Первый вариант указывает на то, что читать будем из SIM карты, второй – из памяти модема, третий – сразу из обоих. Рекомендую воспользоваться именно третьим вариантом.

В ответ на эту команду модем выдаст нечто вроде (ответ модема выделен жирным шрифтом):

AT+CPMS=»MT»

+CPMS: 6,100,6,100,0,20

Цифры означают количество сообщений в памяти (например 6) и максимально допустимое количество сообщений (например 100) в каждой секции.

Узнать, какая область назначена для какой секции можно командой AT+CPMS?:

AT+CPMS?

+CPMS: «MT»,6,100,»ME»,6,100,»SM»,0,20

OK

Самое главное для чтения входящих сообщений – это первая секция, на остальные внимания не обращаем.

Чтение. Теперь, когда область памяти установлена, можно приступить к чтению сообщения.

Для чтения сообщений существует 2 команды: AT+CMGL и AT+CMGR. Разница их в том, что первая команда выдает сразу все сохраненные в памяти сообщения, а вторая – только одно сообщение, индекс которого передается ей в параметрах. Индекс начинается с нуля.

AT+CMGL

Синтаксис: AT+CMGL=<status>, где <status> – статус сообщения в памяти. Возможные статусы:

<status> в текстовом режиме <status> в режиме PDU Пояснение
«REC UNREAD» 0 Полученные непрочитанные сообщения
«REC READ» 1 Полученные прочитанные сообщения
«STO UNSENT» 2 Сохраненные неотправленные сообщения
«STO SENT» 3 Сохраненные отправленные сообщения
«ALL» 4 Все сообщения

AT+CMGR

Синтаксис: AT+CMGR=<index>, где <index> – индекс сохраненного сообщения.

Какой вариант выбрать? Решать вам. Я опишу лишь разницу: AT+CMGL позволят получить сразу все сообщения, причем можно выбрать по статусу — какие именно сообщения нас интересуют. AT+CMGR просто выдает нам указанное сообщение, не взирая на статус. Но нужно знать индекс сообщения.

В общем, в примере ниже, я использовал AT+CMGL=4 чтобы получить все сообщения, AT+CMGL=0 чтобы получить только непрочитанные и AT+CMGR=2 чтобы получить сообщение с индексом 2:

Пояснения к примеру:

AT+CMGF=0 – переходим в PDU режим

AT+CPMS=”MT” – Переключаем память SIM и модема на чтение сообщений

AT+CMGL=4 – Читаем все сообщения. Модем возвращает нам все содержимое памяти МТ. Формат такой: каждое сообщение начинается строкой +CMGL с параметрами:

  1. Индекс сообщения
  2. Статус сообщения (1 = «REC READ», прочитано)
  3. <alpha> – не известное мне поле
  4. Длина сообщения

Со следующей строки начинается, собственно, само сообщение в PDU формате. На рисунке терминал, для удобства, вывел его в несколько строк, хотя на самом деле модем передает его одной строкой. Вот это самое сообщение мы и будем декодировать. Следующее сообщение опять начинается строкой +CMGL и т.п. Идем далее.

AT+CMGL=0 – Читаем сообщение со статусом «REC UNREAD», т.е. не прочтенные. Здесь модем вернул просто ОК – это значит что непрочтенных сообщений нет. Если бы были – он бы их вывел в том же формате, что и до этого.

AT+CMGR=2 – Получение одного сообщения с индексом 2. Ответ начинается с +CMGR и параметров:

  1. Статус сообщения (1 = «REC READ», прочитано)
  2. <alpha> – не известное мне поле
  3. Длина сообщения

И со следующей строки опять-таки идет PDU.

Примечание: указанные параметры команд и ответов на команды справедливы только если включен PDU-режим командой AT+CMGF=0. Если модем работает в текстовом режиме, то параметры команд и возвращаемый ими результат отличаются от вышесказанного. Учтите этот нюанс. Мы работаем в режиме PDU, желающих разобраться с текстовым режимом отсылаю к литературе. От себя скажу, что преимуществ у текстового режима нет никаких.

Как видим, сложного ничего нет, приступаем к декодированию текста сообщения.

Ковыряем PDU

Итак, читать из модема сообщения научились, теперь будем их декодировать. Начнем с простого. Возьмем для примера такое сообщение:

Что в переводе на русский язык означает “Hello World!” 🙂

Разберем его по косточкам:

TP-SCA (Service Centre address) – Адрес сервис-центра, отправившего сообщение.

Нам оно без надобности, но для проформы разберем: первый байт (07) – длина номера, в данном случае длина равна 7 байт. Следующий байт (91) – Тип номера, в данном случае 91 – международный, Следующие 6 байт – сам номер СЦ, дополненный до четности символом F и переставленными местами парами цифр. Подробнее об этом я писал в статье про отправку SMS, там это детально разжевано.

TP-MTI & Co (Message Type indicator и компания) – важный байт, состоящий из различных флагов, разберем его состав подробнее:

TP-MTI – Эти два бита определяют тип SMS. Причем трактовка этих битов зависит от “направления” SMS, т.е. от того, отправляется она или принимается. Вот табличка, описывающая доступные типы сообщения

В нашем случае, используется направление направление СервисЦентр –> модем, т.к. мы принимаем сообщение. В нашем примере байт TP-MTI & Co равен 04, следовательно Бит 1 = Бит 0 = 0, значит тип сообщения – SMS-DELIVER. Так и должно быть.

TP-MMS (More Messages to Send) — Этот бит информирует принимающую сторону, есть ли еще сообщения, ожидающие в сервис центре. Если бит равен нулю — значит в СЦ еще есть сообщения для доставки. Если 1 — значит в СЦ больше сообщений нет. В нашем случае этот бит равен 1, значит в СЦ больше нет сообщений для нашей SIM-карты

TP-SRI (Status Report Indication) — Этот бит показывает, будет ли отправлен отчет о состоянии отправителю. 0 — не будет, 1 — будет. Этот бит относится к биту TP-SRR (Status Report Request) в байте SMS-SUBMIT при отправке. Для чтения сообщения он не пригодится.

TP-UDHI (User Data header Indicator) — Этот бит показывает, что содержит блок TP-UD (User Data). Если бит равен 1 — то блок User Data содержит еще и блок User Data Header, в добавок к сообщению. Если ноль — то блок User Data содержит только сообщение. Для нас это важный бит, поскольку дополнительный блок User Data Header применяется для длинных SMS, в нем содержится информация о количестве частей в SMS и номер текущей части.

TP-RP (Reply Path) — Путь для ответа. Это бит говорит, что от принимающего запрашивается ответ. Если путь ответа запрашивается, отвечающее мобильное устройство может попытаться использовать тот же СЦ, что и отправитель, для более надежной доставки ответа. 1 — запрашивается, 0 — не запрашивается

Возвращаясь к нашему примеру и учитывая вышесказанное, анализ байта TP-MTI & Co (04) говорит нам о том, что это принятое SMS (TP-MTI=0,0 — SMS-DELIVER), что на станции больше нет для нас сообщений (TP-MMS=1) и что это одиночная SMS, а не часть длинной (TP-UDHI=0)

TP-OA (THE Originating Address) – Адрес отправителя сообщения. Это поле составное:

  • 1 байт (в нашем случае 0B) – длина номера отправителя
  • 1 байт (в нашем случае 91) – Формат номера
  • n байт – непосредственно сам номер

Длина номера: указывается количество цифр в номере, если это обычный номер телефона или количество полубайт, если это текстовый формат номера в 7-битной кодировке.

Формат номера. Тут тоже не все так просто:

Бит Значение
0
1
2
3
Идентификатор плана нумерации
4
5
6
Тип номера
7 Всегда = 1

Рассмотрим тип номера:

Биты
6 5 4
Значение
0 0 0 Неизвестно. Сотовая сеть не знает, что за формат у номера
0 0 1 Международный формат номера
0 1 0 Внутренний номер страны. Префиксы страны у номера отсутствуют
0 1 1 Служебный номер сети. Сервисный, другими словами. Используется оператором.
1 0 0 Номер подписчика. Используется, когда определенное представление короткого номера сохранено в одном или нескольких СЦ как часть более высокоуровневого приложения
1 0 1 Буквенно-цифровой, закодированный в 7-битной кодировке
1 1 0 Сокращенный номер
1 1 1 Зарезервировано

Нас интересует всего 2 типа номера: 001 и 101, остальное непонятно 🙂 и либо не применяется, либо применяется редко, либо ведет к ожирению 🙂

Далее — идентификатор плана нумерации. Применяется для типов номеров 000, 001, 010 и 101. Нет смысла рассматривать все, так как в сотовых сетях применяется всего 2 плана:

1) для типа номера 101 (буквенно-цифровой) идентификатор плана нумерации всегда 0000

2) для остальных типов идентификатор плана нумерации всегда 0001

Непосредственно сам номер — может быть двух видов, либо набор цифр, например “79101234567”, либо текст, например “InternetSMS”. На вид указывает тип номера из предыдущего байта.

Цифровой номер кодируется по стандартной схеме кодирования номеров, о ней можно прочитать в первой части (Отправка SMS-сообщений в формате PDU, теория с примерами на C#, часть 1).

Текстовый номер – просто строка текста, сжатая в 7-битную кодировку.

Как уже говорилось, длина номера – это либо количество цифр, либо количество полубайт. Т.е. для номера 79101234567 длина будет равна 11 (0B, как в примере), а для номера “InternetSMS” – 20 (14H). Почему 20? Потому, что «InternetSMS» (без пробела) это 11 символов. В 7-битной кодировке они упакуются в 11*0.875 = 9.625 байт. Умножаем на 2 чтобы получить полубайты, получаем 19.25. Округляем в большую сторону, т.е. в 20 полубайт.

Для ясности, разберем еще один пример с текстовым номером: 09D0D432BB2C03. Здесь 09 — длина(9 полубайт), D0 — формат номера. А дальше — сам номер (длиной 5 байт, т.е. 10 полубайт!) По нормальному это «Tele2». 5 символов. При кодировании получается 5*0.875 = 4.375. Умножаем на 2 чтобы получить полубайты, получаем 8.75. Округляем в большую сторону — 9 полубайт. Но полубайтами мы не оперируем, поэтому номер в действительности не 9, а 10 полубайт, т.е. 5 байт. Маразм, но с этим ничего не поделаешь 🙂

Итак, вернемся к нашему примеру: у нас поле TP-OA = “0B 91 9701119905F8”. 0B – в номере 11 цифр или символов, 91 — международный формат номера, цифры то есть. Далее – 9701119905F8 – непосредственно сам номер. Пары переставлены местами, до четности дополнен символом F, все по схеме кодирования номера. Получается, номер отправителя 7-910-119-95-08.

TP-PID (Protocol identifier) – Идентификатор протокола. В случае отправки SMS с телефона/модема на телефон/модем данный байт всегда будет равен 00. Для тех кому интересно, что же это поле означает, могу ответить, что оно описывает высокоуровневые протоколы или сетевые устройства, куда должна быть отправлена, или откуда пришла SMS. Другими словами, Сервисный Центр оператора сотовой связи может поддерживать дополнительные услуги, такие как конвертирование SMS в e-mail, отправка SMS на пейджер, телекс. В этом случае данное поле указывает на что-то типа шлюза, через который пойдет SMS дальше и превратится уже не в SMS а в тыкву… В общем, нам это поле не нужно.

У нас TP-PID как и положено равен 00

TP-DCS (Data coding scheme) – Схема кодирования данных. Описывает, как закодирована наша SMS, т.е. поле TP-UD. Для тех кто не хочет заморачиваться, опишу только то, что нам пригодится: 00 — 7-битная сжатая кодировка, 08 — UCS2, 10 и 18 — то же, только сообщение класса 0, т.е. Flash. Желающим узнать про это поле подробнее, могу персонально объяснить из чего оно состоит.

TP-DCS в нашем примере = 00, что означает простое сообщение в 7-битной кодировке.

TP-SCTS (The service centre time stamp) – Штамп времени сервисного центра. Проще говоря, это время, когда СЦ получил SMS, т.е. время отправки. Данное поле составляет 7 байт, которые означают следующее:

  • Год
  • Месяц
  • День
  • Час
  • Минуту
  • Секунду
  • Временную зону

Причем в каждом байте цифры переставлены местами, как и в номерах СЦ и отправителя. Видимо разработчики пережили в детстве тяжелую психологическую травму …

Применительно к нам данное поле можно декодировать так: 21106232015061 = Год: 12, Месяц: 01, День: 26, Час: 32, Минута: 01, Секунда: 05, Временная зона: 16.

TP-UDL (User Data Length) — длина пользовательских данных, включая User Data header, если он есть. Если SMS закодирована 7-битной кодировкой, то данное поле указывает количество символов в сообщении. Если кодировка UCS2 – то поле указывает количество байт в сообщении.

В нашем примере TP-UDL = 0C, т.е. 12 в десятичном счислении. Поскольку TP-DCS в нашем примере = 00, что означает простое сообщение в 7-битной кодировке, значит сообщение содержит 12 символов. Так и есть, в сообщении “Hello World!” 12 символов. Однако, если посчитать количество байт сообщения (поле TP-UD), то их будет 11 а не 12, сказывается сжатие при 7-битной кодировке. Этот момент важно учитывать.

TP-UD (User Data) – Поле пользовательских данных. Здесь находится сам текст сообщения. В случае, если SMS длинная, т.е. разбита на несколько сообщений, данное поле начинается с заголовка TP-UDH. На наличие этого заголовка указывает бит TP-UDHI поля TP-MTI & Co. По поводу поля TP-UDH я подробно писал здесь: http://hardisoft.ru/soft/otpravka-dlinnyx-sms-soobshhenij-v-formate-pdu/ , пункт “2. Теория поля UDH”, так что здесь повторяться не буду.

У нас TP-UD = “C8329BFD065DDF72363904”, что после декодирования 7-битной кодировки дает нам искомое “Hello World!”

Как отправить ммс с компьютера на телефон МТС

Оператор МТС разработал для своих абонентов программу, которая разрешает отправлять бесплатные сообщения (SMS и MMS) с компьютера прямо на мобильный телефон. За применение программы плата не взимается.

Инструкция

1. Скачайте программу на свой компьютер. Для этого перейдите на формальный сайт компании и кликните на значок «Отправить SMS/MMS», расположенный на основной странице. Слева вы увидите графу под наименованием «Расширенные вероятности отправки». Нажмите на нее, а после этого выберите пункт «SMS/MMS с компьютера». Вам будет предложена ссылка для скачивания программы.
2. Позже установки программы зарегистрируйте ее. Запустите ее и дождитесь происхождения отдельного окошка. В него нужно ввести номер мобильного телефона. Дальше отправьте оператору USSD-команду *111*31# (она бесплатна). В результат вам должно прийти SMS-сообщение с регистрационным кодом. Укажите его в особом поле и кликните «Дальше». По заключении данной процедуры вы увидите уведомление на экране компьютера (в нем будет сказано, удачно ли все прошло).
3. Для отправки MMS-сообщения нажмите в панели управления, расположенной вверху окошка, на значок «Новое MMS». Позже этого введите номер абонента-получателя. Свой номер можете не указывать, от того что программа выставит его механически. Прикрепите надобные файлы и введите текст сообщения, а потом кликните на кнопку «Отправить». Программа переведет вас на страницу, в которой будет отображаться ранг отправленного вами MMS.
4. Если нужно, установите расписание отправки сообщений (скажем, укажите точное время отправки всех SMS и MMS). Помимо того, дозволено указать и мгновенную отправку. Для настройки откройте особое меню. Дабы сделать это, нажмите на значок рядом с графой «Отправить».
5. Имейте в виду, что отправить бесплатное сообщение дозволено не только при помощи программы, но и прямо с сайта оператора МТС. Откройте теснее упоминавшийся раздел под наименованием «Отправить SMS/MMS». Дальше вы увидите несколько полей для заполнения, введите в них номер своего мобильного и номер получателя. После этого укажите данные для отправки кликните кнопку «Дальше».

Записи созданы 1575

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Начните вводить, то что вы ищите выше и нажмите кнопку Enter для поиска. Нажмите кнопку ESC для отмены.

Вернуться наверх