[Из песочницы] SMPP — одноранговый протокол коротких сообщений

Привет! Хотя мессенджеры и соцсети с каждым днем вытесняют традиционные способы связи, это не умаляет популярность смс. Верификация на популярном сайте, или оповещение о транзакции повторяют они живи и будут жить. А задумывались как это все работает? Очень часто для рассылки массовых сообщений используется протокол SMPP, о котором и пойдет речь под катом.
На Хабре уже были статьи о smpp, 1,2, но их целью не было описание самого протокола. Безусловно вы можете сразу начать с первоисточника — спецификации, но думаю будет неплохо, чтобы существовало и краткое ее содержание. Буду объяснять на примере v3.4 Рад вашей объективной критике.

Протокол SMPP это протокол одноранговых сообщений. Это означает, что каждый пир/хаб сервер равноправный. В простейшем случае схема обмена смс сообщениями выглядит так:

image

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

О протоколе


SMPP — протокол прикладного уровня, который базируется на обмене PDU и передается поверх TCP / IP, или Х25 сессий для передачи sms и ussd сообщений. Обычно SMPP используется в режиме постоянного подключения, это помогает сэкономить время. SMPP использует модель общения клиент — сервер.

Режим связи


image

Обмен сообщений между отправителем и СМС центром через SMPP может проводится в следующих режимах:

Transmitter (передатчик) — передача сообщения в одну сторону, поочередно
Receiver (приемник) — только прием сообщение от СМС центра.
Transreceiver (приемопередатчик) — Обмен сообщениями между СМС центром и пользователем

Структура


image

Длина сообщения


Одно SMS-сообщение может содержать 70 символов при наборе кириллицей и не более 157 латинских символов + 3 UDH Если отправить SMS с большим количеством символов, оно будет разделено на несколько сегментов и объединены в принимающем устройства. В случае сегментации количество символов уменьшается за счет заголовков сообщения в котором указывается часть сообщения. Поэтому при отправке большого SMS-сообщение, оно содержит максимум 153 латинских символов или 67 нетипичных символов.

Data Coding Scheme


Однако для передачи сообщения символы требуют кодирования. В протоколе SMPP за кодирование отвечает специальное поле — Data Coding Scheme, или DCS. Это поле, которое указывает как нужно распознавать сообщения. Кроме этого поле DCS включает в себя:

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


Стандартный 7-битный алфавит (GSM 03.38). Был разработан для системы сообщений в GSM. Такое кодирование подходит для английского и ряда латинских языков. Каждый символ состоит из 7 бит и кодируется в октет.

UTF-16 (в GSM UCS2) Для включения отсутствующих символов в 7 битного алфавита было разработано кодировку UTF-16 которая и добавляет дополнительные символы (в том числе и кириллические) за счет уменьшения размера сообщения с 160 до 70 этот тип кодирования почти полностью повторяет Unicode.

8- битные данные определенные пользователем. К таковым относятся KOI8-R и Windows-1251. Хотя такое решение кажется более экономичным по сравнению с тем же UTF-16. Возникает резонный вопрос совместимости на разных устройствах. Поскольку в таком случае оба устройства должны быть заблаговременно настроены.

Клас сообщения


  • Class0, или flash, сообщение, хранящихся в памяти телефона по желанию пользователя;
  • Class1, или те, которые хранятся в памяти телефона;
  • Class1, или те, которые хранятся в памяти телефона;
  • Class2, должен гарантировать, что сообщение сохранится в памяти мобильного терминала, в противном случае должен отдать оповещения смс центра о невозможности сохранить;
  • Class3 — в этом случае телефон должен направить извещение о том, что сообщение может быть сохранено, независимо от количества памяти в устройстве. Такой тип сообщения подразумевает, что сообщение достигло адресата;


Тип сообщения


Silent message (SMS0) Тип смс сообщения без контента. Такое смс приходит без уведомления и не отображается на экране устройства.

PDU


Каждая pdu операция парная и состоит из запроса и ответа. Например: команда что говорит об установлении соединения (bind_transmitter / bind_transmitter_resp), или о том, что сообщение передано (deliver_sm / deliver_sm_resp)

image

Каждый pdu пакет состоит из двух частей — заголовок (header) и тело (body). Структура заголовка одинакова для любого pdu пакета: command length это длина пакета, id это название пакета, а команда status показывает успешно передано сообщение, или с ошибкой.

Дополнительные параметры TLV


TLV (Tag Length Value), или дополнительные поля. Такие параметры используются для расширения функций протокола и не являются обязательными. Данное поле указывается в конце поля pdu. В качестве примера с помощью TLV dest_addr_np_information можно организовать передачу информации о портированости номера.

Ton и Npi


TON (Type of Number) параметр, сообщает SMSC о формате адресации и тип сети.
NPI (Numbering Plan Identification) параметр, указывающий на план нумерации.

image

Адрес источника сообщения, или альфа имя


Сообщения, отправляемые на телефон бывают двух разновидностей: цифровые и буквенные. Цифровые могут быть длинными (похожими на номер телефона) и короткими. Иногда у операторов существуют ограничения на отправку от нейтральных имен, например Infosms, Alert etc. Иногда операторы не пропускают трафик, если имя не зарегистрировано в их сети. Однако это скорее особенности оператора.

Стадии отправки


image

SMS-SUBMIT — это отправка сообщения MO FSM (короткое сообщение от мобильного терминала)
SMS-SUBMIT REPORT — подтверждение, что сообщение отправлено SMSC
SRI SM (SendRoutingInfo) — SMSC получает информацию от HLR относительно MSC / VLR места нахождения абонента
SRI SM RESP — ответ от HLR относительно мясца положения абонента
MT-FSM — после получения местоположения отправляется сообщение используя операцию «Forward Short Message»
MT-FSM ACK — ответ от SMSC о том, что сообщение отправлено
SMS-STATUS REPORT — SMSC отправляет статус о доставке сообщения.

Статус доставки сообщения


SMS-STATUS REPORT может принимать несколько значений:
DELIVRD сообщение успешно доставлено
REJECTD — сообщение отвергнуто SMS-центром
EXPIRED — сообщение удалено из очереди отправки после окончания TTL (время жизни сообщения)
UNDELIV — другие случаи недоставки
UNKNOWN-не получен ответ об отправке.

Ошибки передачи


Иногда причины при каких смс сообщения не доставляются к абоненту. Следствием этих причин является возникновение ошибок. Ошибки возвращаются в PDUs_sms_resp. Все ошибки можно разделить на временные (Temporary) и постоянные (Permanent).

В качестве примера, к временным можно отнести absent_subscriber абонент не доступен или не в сети, а к постоянным — абонент не существует. В зависимости от ошибок, которые возникают формируется политика переотправки этих сообщений.

Например, если абонент был занят разговором и получил ошибку MT handset is busy, сообщение можно отправить повторно через несколько минут, однако, если у абонента заблокирован сервис приема сообщений повторная переотправка не будет иметь смысла. Список ошибок вы сможете найти на страницах SMSC, например, как эта.

© Habrahabr.ru